From 17198938e08eadc92378340cbb19b4a30be49199 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 15:58:31 -0600 Subject: [PATCH 01/15] Tests: Add regression test suites for table drawing and drop-in compatibility Adds targeted test infrastructure and validation checks to protect table drawing hooks and drop-in framework contracts against unintended modifications. * CPTableViewDrawingTest: Verifies subclass invocation order for drawing steps and ensures application-specified background colors persist across theme-state changes. * DropInCompatibilityTest: Validates default theme names, window control configurations, pop-up button bezel styles, and table class defaults. * DropInSnapshot: Encapsulates theme attribute defaults, public API surface, default view construction, and window controls as structured data. * DropInBaselineGenerator: Provides tooling to capture current framework state as a baseline. * DropInBaselineTest: Compares framework artifacts against the established baseline, permitting additions while reporting modifications and removals. * DropInBaseline.json: Introduces the initial compatibility baseline artifact. --- Tests/AppKit/CPTableViewDrawingTest.j | 198 + Tests/AppKit/DropInBaselineGenerator.j | 48 + Tests/AppKit/DropInBaselineTest.j | 180 + Tests/AppKit/DropInCompatibilityTest.j | 77 + Tests/AppKit/DropInSnapshot.j | 245 + Tests/AppKit/Resources/DropInBaseline.json | 8108 ++++++++++++++++++++ 6 files changed, 8856 insertions(+) create mode 100644 Tests/AppKit/CPTableViewDrawingTest.j create mode 100644 Tests/AppKit/DropInBaselineGenerator.j create mode 100644 Tests/AppKit/DropInBaselineTest.j create mode 100644 Tests/AppKit/DropInCompatibilityTest.j create mode 100644 Tests/AppKit/DropInSnapshot.j create mode 100644 Tests/AppKit/Resources/DropInBaseline.json diff --git a/Tests/AppKit/CPTableViewDrawingTest.j b/Tests/AppKit/CPTableViewDrawingTest.j new file mode 100644 index 000000000..75227c326 --- /dev/null +++ b/Tests/AppKit/CPTableViewDrawingTest.j @@ -0,0 +1,198 @@ +/* + * CPTableViewDrawingTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + NSTableView draws itself as a sequence of named steps: the background, then + the selection highlight, then the grid, then the rows. Each step is a method. + A subclass overrides one step to change it and inherits the others, so it can + extend the table without owning the table's internals. + + CPTableView follows the same design. These tests confirm that each step reaches + a subclass. How the table organizes its drawing is its own concern, so the tests + observe only what a subclass can observe. +*/ +@implementation DrawingRecordingTableView : CPTableView +{ + CPArray drawnSteps @accessors; + CPArray drawnRows @accessors; +} + +/* + Applications override this method to draw something other than a solid color + or alternating rows behind the table's content. +*/ +- (void)drawBackgroundInClipRect:(CGRect)aRect +{ + [drawnSteps addObject:@"background"]; +} + +/* + Applications override this method to change how selected rows appear. + In Cocoa this applies to cell-based tables. A view-based NSTableView uses + NSTableRowView for this purpose. CPTableView supports the method on its + view-based tables, and existing applications depend on it. +*/ +- (void)highlightSelectionInClipRect:(CGRect)aRect +{ + [drawnSteps addObject:@"selection"]; +} + +/* + Cocoa documents this method for all tables: subclasses override it to draw + grid lines other than the standard ones. +*/ +- (void)drawGridInClipRect:(CGRect)aRect +{ + [drawnSteps addObject:@"grid"]; +} + +/* + Applications override this method to draw over a row. A source list, for + example, can draw a badge beside an item this way. Cocoa also restricts this + method to cell-based tables, and CPTableView supports it as it does the + selection highlight. +*/ +- (void)drawRow:(CPInteger)aRow clipRect:(CGRect)aRect +{ + [drawnRows addObject:aRow]; +} + +@end + +@implementation CPTableViewDrawingTest : OJTestCase +{ + CPWindow theWindow; + DrawingRecordingTableView tableView; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) styleMask:CPWindowNotSizable]; + + tableView = [[DrawingRecordingTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)]; + [tableView setDrawnSteps:[]]; + [tableView setDrawnRows:[]]; + + [tableView addTableColumn:[[CPTableColumn alloc] initWithIdentifier:@"Column"]]; + [tableView setDataSource:self]; + + [[theWindow contentView] addSubview:tableView]; + [tableView reloadData]; +} + +- (int)numberOfRowsInTableView:(CPTableView)aTableView +{ + return 3; +} + +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow +{ + return @"Value"; +} + +/* + Unit tests run without a DOM, and CPView does not draw without one, so the + display cycle never reaches drawRect: here. This method does what the display + cycle does: it sends drawRect: to the table view and to each of its subviews. + The graphics port has no backing store, because creating a bitmap context + requires a DOM. The tests therefore show that the steps run, not what they draw. +*/ +- (void)display +{ + [tableView load]; + + var graphicsPort = { path: NULL, gState: CGGStateCreate(), gStateStack: [] }; + + [CPGraphicsContext setCurrentContext:[CPGraphicsContext graphicsContextWithGraphicsPort:graphicsPort flipped:YES]]; + + [tableView drawRect:[tableView bounds]]; + + var subviews = [tableView subviews], + count = [subviews count]; + + while (count--) + [subviews[count] drawRect:[subviews[count] bounds]]; +} + +- (void)testDrawGridInClipRectOverrideIsCalled +{ + [self display]; + + [self assertTrue:[[tableView drawnSteps] containsObject:@"grid"]]; +} + +- (void)testDrawBackgroundInClipRectOverrideIsCalled +{ + [self display]; + + [self assertTrue:[[tableView drawnSteps] containsObject:@"background"]]; +} + +- (void)testHighlightSelectionInClipRectOverrideIsCalled +{ + [self display]; + + [self assertTrue:[[tableView drawnSteps] containsObject:@"selection"]]; +} + +- (void)testDrawRowClipRectOverrideIsCalledForEachExposedRow +{ + [self display]; + + [self assert:[0, 1, 2] equals:[tableView drawnRows]]; +} + +/* + Each step draws over the one before it. The order is part of the contract, + because a subclass that draws a background relies on the selection and the + grid appearing above it. +*/ +- (void)testDrawingStepsRunInOrder +{ + [self display]; + + [self assert:[@"background", @"selection", @"grid"] equals:[tableView drawnSteps]]; +} + +/* + A color that an application sets belongs to the application. Theme states + change often during normal use, for example when the table gains or loses + first responder status, and they must leave that color in place. +*/ +- (void)testBackgroundColorSurvivesThemeStateChange +{ + var color = [CPColor redColor]; + + [tableView setBackgroundColor:color]; + [tableView setThemeState:CPThemeStateFirstResponder]; + [self assert:color equals:[tableView backgroundColor]]; + + [tableView unsetThemeState:CPThemeStateFirstResponder]; + [self assert:color equals:[tableView backgroundColor]]; +} + +@end diff --git a/Tests/AppKit/DropInBaselineGenerator.j b/Tests/AppKit/DropInBaselineGenerator.j new file mode 100644 index 000000000..9d77db9f8 --- /dev/null +++ b/Tests/AppKit/DropInBaselineGenerator.j @@ -0,0 +1,48 @@ +/* + * DropInBaselineGenerator.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "DropInSnapshot.j" + +/* + Saves the drop-in baseline. Run this only against a build of main, and only + when a change to the drop-in contract is deliberate: + + objj Tests/AppKit/DropInBaselineGenerator.j +*/ +var fs = require("fs"), + path = require("path"); + +function main(args, namedArgs) +{ + [[CPApplication alloc] init]; + + var snapshot = DropInCreateSnapshot(), + baselinePath = path.join(process.cwd(), "Tests", "AppKit", "Resources", "DropInBaseline.json"); + + fs.writeFileSync(baselinePath, JSON.stringify(snapshot, null, 1) + "\n"); + + print("Wrote " + baselinePath); + print(snapshot.publicClasses.length + " public classes, " + + Object.keys(snapshot.themeAttributes).length + " themed classes, " + + Object.keys(snapshot.construction).length + " constructed views, " + + Object.keys(snapshot.windows).length + " window styles"); +} diff --git a/Tests/AppKit/DropInBaselineTest.j b/Tests/AppKit/DropInBaselineTest.j new file mode 100644 index 000000000..f343a5432 --- /dev/null +++ b/Tests/AppKit/DropInBaselineTest.j @@ -0,0 +1,180 @@ +/* + * DropInBaselineTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "DropInSnapshot.j" + +/* + Compares the running frameworks with the recorded drop-in baseline. See + DropInSnapshot.j for what the baseline holds and DropInBaselineGenerator.j for + how to update it. + + Each test reports every difference it finds. A list is more useful here than + a failure at the first difference, because one change often affects several + classes. +*/ +var fs = require("fs"), + path = require("path"), + DropInBaseline = nil, + DropInCurrent = nil; + +@implementation DropInBaselineTest : OJTestCase + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + if (DropInBaseline) + return; + + var baselinePath = path.join(path.dirname(__filename), "Resources", "DropInBaseline.json"); + + DropInBaseline = JSON.parse(fs.readFileSync(baselinePath, {encoding: 'utf-8'})); + DropInCurrent = DropInCreateSnapshot(); +} + +- (void)assertNoDifferences:(CPArray)differences +{ + [self assertTrue:differences.length === 0 message:"\n" + differences.join("\n")]; +} + +/* + A themed application reads these values whenever its theme supplies none, so a + changed default changes the application. +*/ +- (void)testThemeAttributeDefaultsAreUnchanged +{ + var differences = []; + + for (var className in DropInBaseline.themeAttributes) + { + var expected = DropInBaseline.themeAttributes[className], + current = DropInCurrent.themeAttributes[className]; + + if (!current) + { + differences.push(className + ": class no longer declares theme attributes"); + continue; + } + + for (var attribute in expected) + if (expected[attribute] !== current[attribute]) + differences.push(className + " " + attribute + ": " + expected[attribute] + " is now " + current[attribute]); + } + + [self assertNoDifferences:differences]; +} + +- (void)testPublicClassesExist +{ + var differences = DropInBaseline.publicClasses.filter(function(aName) + { + return !objj_getClass(aName); + }); + + [self assertNoDifferences:differences]; +} + +/* + A public method may move to a superclass, since the class still responds to it. + It may not disappear. This test cannot detect a method that remains but no + longer does its work. Behavior tests cover that. +*/ +- (void)testPublicMethodsExist +{ + var differences = []; + + DropInBaseline.publicClasses.forEach(function(aName) + { + var aClass = objj_getClass(aName); + + if (!aClass) + return; + + DropInBaseline.instanceMethods[aName].forEach(function(aSelector) + { + if (!class_getInstanceMethod(aClass, aSelector)) + differences.push("-[" + aName + " " + aSelector + "]"); + }); + + DropInBaseline.classMethods[aName].forEach(function(aSelector) + { + if (!class_getClassMethod(aClass, aSelector)) + differences.push("+[" + aName + " " + aSelector + "]"); + }); + }); + + [self assertNoDifferences:differences]; +} + +/* + A view created in code has these values until the application changes them. +*/ +- (void)testDefaultViewConstructionIsUnchanged +{ + var differences = []; + + for (var className in DropInBaseline.construction) + { + var expected = DropInBaseline.construction[className], + current = DropInCurrent.construction[className]; + + if (!current) + { + differences.push(className + ": cannot be created"); + continue; + } + + for (var key in expected) + { + var expectedValue = String(expected[key]), + currentValue = String(current[key]); + + if (expectedValue !== currentValue) + differences.push(className + " " + key + ": " + expectedValue + " is now " + currentValue); + } + } + + [self assertNoDifferences:differences]; +} + +/* + The public subviews of a window view are the controls a person sees in the + title bar, so they are part of how an existing application looks. +*/ +- (void)testWindowControlsAreUnchanged +{ + var differences = []; + + for (var style in DropInBaseline.windows) + { + var expected = String(DropInBaseline.windows[style]), + current = String(DropInCurrent.windows[style]); + + if (expected !== current) + differences.push(style + ": " + expected + " is now " + current); + } + + [self assertNoDifferences:differences]; +} + +@end diff --git a/Tests/AppKit/DropInCompatibilityTest.j b/Tests/AppKit/DropInCompatibilityTest.j new file mode 100644 index 000000000..77bf89a84 --- /dev/null +++ b/Tests/AppKit/DropInCompatibilityTest.j @@ -0,0 +1,77 @@ +/* + * DropInCompatibilityTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + Defaults that existing applications rely on. An application that updates its + frameworks must keep these without any change of its own. +*/ +@implementation DropInCompatibilityTest : OJTestCase + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; +} + +- (void)testDefaultThemeNameIsAristo2WithoutInfoPlistKey +{ + [self assertNull:[[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPDefaultTheme"]]; + [self assert:@"Aristo2" equals:[CPApplication defaultThemeName]]; +} + +- (void)testResizableWindowHasOnlyACloseButton +{ + var aWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) + styleMask:CPClosableWindowMask | CPResizableWindowMask], + subviews = [[aWindow _windowView] subviews], + count = [subviews count], + buttonCount = 0; + + while (count--) + if ([subviews[count] isKindOfClass:[CPButton class]]) + buttonCount++; + + [self assert:1 equals:buttonCount]; +} + +- (void)testPopUpButtonKeepsTheDefaultButtonBezelStyle +{ + var frame = CGRectMake(0.0, 0.0, 100.0, 24.0), + popUpButton = [[CPPopUpButton alloc] initWithFrame:frame pullsDown:NO], + button = [[CPButton alloc] initWithFrame:frame]; + + [self assert:[button bezelStyle] equals:[popUpButton bezelStyle]]; +} + +- (void)testTableViewGridColorHasAClassDefault +{ + [self assertFalse:[[[CPTableView themeAttributes] objectForKey:@"grid-color"] isEqual:[CPNull null]]]; +} + +- (void)testTableViewAlternatingRowColorsHaveAClassDefault +{ + [self assertFalse:[[[CPTableView themeAttributes] objectForKey:@"alternating-row-colors"] isEqual:[CPNull null]]]; +} + +@end diff --git a/Tests/AppKit/DropInSnapshot.j b/Tests/AppKit/DropInSnapshot.j new file mode 100644 index 000000000..f16ea3d0f --- /dev/null +++ b/Tests/AppKit/DropInSnapshot.j @@ -0,0 +1,245 @@ +/* + * DropInSnapshot.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + An application that updates its frameworks relies on more than documented + behavior. It relies on the defaults a class supplies when no theme overrides + them, on the public methods it calls and overrides, and on the state a control + has when it is created. Together these form the drop-in contract. + + This file records that contract as plain data. DropInBaselineGenerator.j saves + a snapshot as the baseline, and DropInBaselineTest.j compares the running + frameworks with it. Additions are allowed. Changes and removals are not. +*/ + +var DropInConstructionGetters = [ + @"acceptsFirstResponder", + @"alignment", + @"autoresizingMask", + @"backgroundColor", + @"bezelStyle", + @"controlSize", + @"drawsBackground", + @"isBordered", + @"isEditable", + @"isEnabled", + @"isHidden", + @"isSelectable", + @"lineBreakMode", + @"verticalAlignment" + ], + + DropInWindowStyles = { + @"borderless": CPBorderlessWindowMask, + @"titled": CPTitledWindowMask, + @"closable": CPClosableWindowMask, + @"resizable": CPClosableWindowMask | CPResizableWindowMask, + @"miniaturizable": CPClosableWindowMask | CPMiniaturizableWindowMask, + @"full": CPClosableWindowMask | CPMiniaturizableWindowMask | CPResizableWindowMask, + @"hud": CPHUDBackgroundWindowMask, + @"hudClosable": CPHUDBackgroundWindowMask | CPClosableWindowMask + }; + +function DropInIsPublicName(aName) +{ + return aName.charAt(0) !== "_" && aName.charAt(0) !== "$"; +} + +/* + Reduces a value to a string that does not depend on object identity, so that + two runs of the same framework produce the same snapshot. +*/ +function DropInDescribeValue(aValue) +{ + if (aValue === nil || aValue === undefined) + return "nil"; + + if (aValue === [CPNull null]) + return "CPNull"; + + if (aValue.isa) + { + if ([aValue isKindOfClass:[CPColor class]]) + return "CPColor:" + [aValue cssString]; + + /* + The system font is a global setting that applications and tests change, + so a default that uses it records only that fact. + */ + if ([aValue isKindOfClass:[CPFont class]]) + return [aValue isSystem] ? "CPFont:system" + ([aValue isBold] ? " bold" : "") : "CPFont:" + [aValue cssString]; + + if ([aValue isKindOfClass:[CPArray class]]) + return "[" + aValue.map(DropInDescribeValue).join(", ") + "]"; + + return aValue.isa.name; + } + + if (typeof aValue === "object") + return JSON.stringify(aValue); + + return String(aValue); +} + +function DropInMethodNames(aClass) +{ + return class_copyMethodList(aClass).map(function(aMethod) + { + return method_getName(aMethod); + }).filter(DropInIsPublicName).sort(); +} + +function DropInThemeAttributes(aClass) +{ + if (class_copyMethodList(aClass.isa).map(method_getName).indexOf("themeAttributes") === -1) + return nil; + + var attributes = [aClass themeAttributes]; + + if (!attributes) + return nil; + + var result = {}, + keys = [[attributes allKeys] sortedArrayUsingSelector:@selector(compare:)]; + + keys.forEach(function(aKey) + { + result[aKey] = DropInDescribeValue([attributes objectForKey:aKey]); + }); + + return result; +} + +function DropInSubviewClasses(aView) +{ + return [aView subviews].map(function(aSubview) + { + return aSubview.isa.name; + }).filter(DropInIsPublicName).sort(); +} + +function DropInDefaultConstruction(aClass) +{ + var view = [[aClass alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)], + result = { + @"frameSize": DropInDescribeValue([view frameSize]), + @"subviews": DropInSubviewClasses(view) + }; + + DropInConstructionGetters.forEach(function(aGetter) + { + if ([view respondsToSelector:CPSelectorFromString(aGetter)]) + result[aGetter] = DropInDescribeValue([view performSelector:CPSelectorFromString(aGetter)]); + }); + + return result; +} + +function DropInClassIsView(aClass) +{ + var viewClass = [CPView class]; + + for (; aClass; aClass = class_getSuperclass(aClass)) + if (aClass === viewClass) + return YES; + + return NO; +} + +function DropInSortedClasses() +{ + var classes = [], + count = objj_getClassList(classes, 1 << 16); + + return classes.slice(0, count).filter(function(aClass) + { + return aClass && aClass.name.indexOf("$") !== 0; + }).sort(function(lhs, rhs) + { + return lhs.name < rhs.name ? -1 : (lhs.name > rhs.name ? 1 : 0); + }); +} + +/* + Some classes cannot be created without a surrounding object, or without a DOM. + A class that cannot be created is left out of the construction section, and the + comparison does not report it. This reduces coverage, but it cannot report a + false difference. +*/ +function DropInCreateSnapshot() +{ + var snapshot = { + @"publicClasses": [], + @"themeAttributes": {}, + @"instanceMethods": {}, + @"classMethods": {}, + @"construction": {}, + @"windows": {} + }; + + DropInSortedClasses().forEach(function(aClass) + { + var name = aClass.name, + isPublic = DropInIsPublicName(name); + + try + { + var attributes = DropInThemeAttributes(aClass); + + if (attributes) + snapshot.themeAttributes[name] = attributes; + } + catch (anException) + { + } + + if (!isPublic) + return; + + snapshot.publicClasses.push(name); + snapshot.instanceMethods[name] = DropInMethodNames(aClass); + snapshot.classMethods[name] = DropInMethodNames(aClass.isa); + + if (!DropInClassIsView(aClass)) + return; + + try + { + snapshot.construction[name] = DropInDefaultConstruction(aClass); + } + catch (anException) + { + } + }); + + for (var style in DropInWindowStyles) + { + var aWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) + styleMask:DropInWindowStyles[style]]; + + snapshot.windows[style] = DropInSubviewClasses([aWindow _windowView]); + } + + return snapshot; +} diff --git a/Tests/AppKit/Resources/DropInBaseline.json b/Tests/AppKit/Resources/DropInBaseline.json new file mode 100644 index 000000000..0338c210a --- /dev/null +++ b/Tests/AppKit/Resources/DropInBaseline.json @@ -0,0 +1,8108 @@ +{ + "publicClasses": [ + "CAAnimation", + "CABasicAnimation", + "CAKeyframeAnimation", + "CALayer", + "CAMediaTimingFunction", + "CAPropertyAnimation", + "CPAccordionView", + "CPAccordionViewItem", + "CPActionBinding", + "CPAlert", + "CPAnimation", + "CPAnimationContext", + "CPAppearance", + "CPApplication", + "CPArray", + "CPArrayController", + "CPAttributedString", + "CPBasePlatform", + "CPBasePlatformString", + "CPBezierPath", + "CPBinder", + "CPBox", + "CPBrowser", + "CPBundle", + "CPButton", + "CPButtonBar", + "CPByteCountFormatter", + "CPCache", + "CPCharacterSet", + "CPCheckBox", + "CPCib", + "CPCibBindingConnector", + "CPCibConnector", + "CPCibControlConnector", + "CPCibHelpConnector", + "CPCibOutletConnector", + "CPCibRuntimeAttributesConnector", + "CPClipView", + "CPCoder", + "CPCollectionView", + "CPCollectionViewItem", + "CPColor", + "CPColorPanel", + "CPColorPicker", + "CPColorSpace", + "CPColorWell", + "CPColorWellValueBinder", + "CPColorWheelColorPicker", + "CPComboBox", + "CPComparisonPredicate", + "CPCompoundPredicate", + "CPControl", + "CPController", + "CPControllerSelectionProxy", + "CPCookie", + "CPCountedSet", + "CPCursor", + "CPDOMWindowLayer", + "CPData", + "CPDate", + "CPDateFormatter", + "CPDatePicker", + "CPDecimalNumber", + "CPDecimalNumberHandler", + "CPDelayedPerform", + "CPDictionary", + "CPDisclosureButton", + "CPDocument", + "CPDocumentController", + "CPDoubleClickActionBinding", + "CPDragServer", + "CPDraggingInfo", + "CPEnumerator", + "CPError", + "CPEvent", + "CPException", + "CPExpression", + "CPFont", + "CPFontDescriptor", + "CPFontManager", + "CPFontPanel", + "CPFormatter", + "CPFunctionOperation", + "CPGradient", + "CPGraphicsContext", + "CPHTTPURLResponse", + "CPImage", + "CPImageView", + "CPImageViewValueBinder", + "CPIndexPath", + "CPIndexSet", + "CPInvocation", + "CPInvocationOperation", + "CPIsNilTransformer", + "CPIsNotNilTransformer", + "CPJSONPConnection", + "CPKeyBinding", + "CPKeyedArchiver", + "CPKeyedUnarchiver", + "CPLayoutManager", + "CPLevelIndicator", + "CPLocale", + "CPMapTable", + "CPMarkdownParser", + "CPMenu", + "CPMenuItem", + "CPMultipleValueAndBinding", + "CPMultipleValueOrBinding", + "CPMutableArray", + "CPMutableAttributedString", + "CPMutableDictionary", + "CPMutableIndexSet", + "CPMutableParagraphStyle", + "CPMutableSet", + "CPNegateBooleanTransformer", + "CPNinePartImage", + "CPNotification", + "CPNotificationCenter", + "CPNotificationQueue", + "CPNull", + "CPNumber", + "CPNumberFormatter", + "CPObject", + "CPObjectController", + "CPOpenPanel", + "CPOperation", + "CPOperationQueue", + "CPOutlineView", + "CPPanel", + "CPParagraphStyle", + "CPPasteboard", + "CPPlatform", + "CPPlatformPasteboard", + "CPPlatformString", + "CPPlatformWindow", + "CPPopUpButton", + "CPPopover", + "CPPredicate", + "CPPredicateEditor", + "CPPredicateEditorRowTemplate", + "CPPredicateEditorValueBinder", + "CPPredicateScanner", + "CPPredicateUtilities", + "CPPredicate_BOOL", + "CPProgressIndicator", + "CPPropertyListSerialization", + "CPProxy", + "CPRadio", + "CPRadioGroup", + "CPResponder", + "CPRuleEditor", + "CPRulerMarker", + "CPRulerView", + "CPRunLoop", + "CPSavePanel", + "CPScanner", + "CPScreen", + "CPScrollView", + "CPScroller", + "CPSearchField", + "CPSecureTextField", + "CPSegmentedControl", + "CPSet", + "CPShadow", + "CPShadowView", + "CPSimpleTypesetter", + "CPSlider", + "CPSliderColorPicker", + "CPSortDescriptor", + "CPSound", + "CPSplitView", + "CPStackView", + "CPStepper", + "CPString", + "CPTabView", + "CPTabViewItem", + "CPTableCellView", + "CPTableColumn", + "CPTableColumnValueBinder", + "CPTableContentBinder", + "CPTableHeaderView", + "CPTableView", + "CPText", + "CPTextAttachment", + "CPTextContainer", + "CPTextField", + "CPTextList", + "CPTextStorage", + "CPTextTab", + "CPTextView", + "CPTheme", + "CPThemeBlend", + "CPThreePartImage", + "CPTimeZone", + "CPTimer", + "CPTitleWithPatternBinding", + "CPTokenField", + "CPToolbar", + "CPToolbarItem", + "CPTrackingArea", + "CPTreeController", + "CPTreeNode", + "CPTypesetter", + "CPURL", + "CPURLConnection", + "CPURLRequest", + "CPURLResponse", + "CPUnarchiveFromDataTransformer", + "CPUndoManager", + "CPUserDefaults", + "CPUserDefaultsController", + "CPUserDefaultsCookieStore", + "CPUserDefaultsLocalStore", + "CPUserDefaultsStore", + "CPUserNotification", + "CPUserNotificationCenter", + "CPUserSessionManager", + "CPValue", + "CPValueTransformer", + "CPValueWithPatternBinding", + "CPView", + "CPViewAnimation", + "CPViewAnimator", + "CPViewController", + "CPVisualEffectView", + "CPWebScriptObject", + "CPWebView", + "CPWindow", + "CPWindowController", + "CPWorkspace", + "HandImageLayer", + "HandLayer", + "HoursLayer" + ], + "themeAttributes": { + "CPBox": { + "background-color": "CPNull", + "border-color": "CPNull", + "border-width": "CPNumber", + "content-adjustment": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}", + "content-margin": "{\"width\":0,\"height\":0}", + "corner-radius": "CPNumber", + "inner-shadow-color": "CPNull", + "inner-shadow-offset": "{\"width\":0,\"height\":0}", + "inner-shadow-size": "CPNumber", + "min-y-correction-no-title": "CPNumber", + "min-y-correction-title": "CPNumber", + "nib2cib-adjustment-primary-frame": "{\"origin\":{\"x\":4,\"y\":-4},\"size\":{\"width\":-8,\"height\":-6}}", + "title-color": "CPNull", + "title-font": "CPNull", + "title-left-offset": "CPNumber", + "title-top-offset": "CPNumber" + }, + "CPBrowser": { + "image-control-leaf": "CPNull", + "image-control-leaf-pressed": "CPNull", + "image-control-resize": "CPNull" + }, + "CPButton": { + "alignment": "CPNumber", + "bezel-color": "CPNull", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "image": "CPNull", + "image-color": "CPNull", + "image-offset": "CPNumber", + "image-position": "CPNumber", + "image-scaling": "CPNumber", + "image-vertical-offset": "CPNumber", + "invert-image": "CPNumber", + "invert-image-on-push": "CPNumber", + "vertical-alignment": "CPNumber" + }, + "CPButtonBar": { + "bezel-color": "CPNull", + "button-bezel-color": "CPNull", + "button-image-action": "CPNull", + "button-image-minus": "CPNull", + "button-image-plus": "CPNull", + "button-text-color": "CPNull", + "resize-control-color": "CPNull", + "resize-control-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "resize-control-size": "{\"width\":0,\"height\":0}" + }, + "CPColor": { + "alternate-selected-control-color": "CPNull", + "css-based": "CPNumber", + "secondary-selected-control-color": "CPNull", + "selected-text-background-color": "CPNull", + "selected-text-inactive-background-color": "CPNull" + }, + "CPColorWell": { + "bezel-color": "CPNull", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-border-color": "CPNull", + "content-border-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset": "{\"top\":3,\"right\":3,\"bottom\":3,\"left\":3}" + }, + "CPComboBox": { + "border-inset": "{\"top\":3,\"right\":3,\"bottom\":3,\"left\":3}", + "popup-button-size": "{\"width\":21,\"height\":29}" + }, + "CPControl": { + "alignment": "CPNumber", + "font": "CPNull", + "image-position": "CPNumber", + "image-scaling": "CPNumber", + "line-break-mode": "CPNumber", + "max-size": "{\"width\":-1,\"height\":-1}", + "min-size": "{\"width\":0,\"height\":0}", + "text-color": "CPColor:rgba(0, 0, 0, 1)", + "text-shadow-color": "CPNull", + "text-shadow-offset": "{\"width\":0,\"height\":0}", + "vertical-alignment": "CPNumber" + }, + "CPDatePicker": { + "arrow-image-left": "CPNull", + "arrow-image-left-highlighted": "CPNull", + "arrow-image-right": "CPNull", + "arrow-image-right-highlighted": "CPNull", + "arrow-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-color": "CPColor:rgba(0, 0, 0, 0)", + "bezel-color-calendar": "CPColor:rgba(0, 0, 0, 0)", + "bezel-color-calendar-left": "CPNull", + "bezel-color-calendar-middle": "CPNull", + "bezel-color-calendar-right": "CPNull", + "bezel-color-clock": "CPColor:rgba(0, 0, 0, 0)", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "border-color": "CPColor:rgba(0, 0, 0, 0)", + "border-width": "CPNumber", + "calendar-clock-margin": "CPNumber", + "circle-image": "CPNull", + "circle-image-highlighted": "CPNull", + "clock-draws-hours": "CPNumber", + "clock-font": "CPNull", + "clock-hours-font": "CPNull", + "clock-hours-radius": "CPNumber", + "clock-hours-text-color": "CPColor:rgba(0, 0, 0, 0)", + "clock-only-nib2cib-adjustment-frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}", + "clock-second-hand-over": "CPNumber", + "clock-text-color": "CPColor:rgba(0, 0, 0, 1)", + "clock-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", + "clock-text-shadow-offset": "{\"width\":0,\"height\":0}", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset-datepicker-textfield": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset-datepicker-textfield-separator": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "current-button-size": "{\"width\":0,\"height\":0}", + "date-hour-margin": "CPNumber", + "datepicker-textfield-bezel-color": "CPColor:rgba(0, 0, 0, 0)", + "day-label-inset": "CPNull", + "hour-ampm-margin": "CPNumber", + "hour-hand-image": "CPNull", + "hour-hand-size": "{\"width\":0,\"height\":0}", + "max-size-calendar": "{\"width\":0,\"height\":0}", + "middle-hand-image": "CPNull", + "middle-hand-size": "{\"width\":0,\"height\":0}", + "min-size-calendar": "{\"width\":0,\"height\":0}", + "min-size-datepicker-textfield": "{\"width\":0,\"height\":0}", + "minute-hand-image": "CPNull", + "minute-hand-size": "{\"width\":0,\"height\":0}", + "next-button-size": "{\"width\":0,\"height\":0}", + "previous-button-size": "{\"width\":0,\"height\":0}", + "second-hand-image": "CPNull", + "second-hand-size": "{\"width\":0,\"height\":0}", + "separator-color": "CPNull", + "separator-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "separator-height": "CPNumber", + "separator-margin-width": "CPNumber", + "size-calendar": "{\"width\":0,\"height\":0}", + "size-clock": "{\"width\":0,\"height\":0}", + "size-header": "{\"width\":0,\"height\":0}", + "size-tile": "{\"width\":0,\"height\":0}", + "stepper-margin": "CPNumber", + "tile-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "tile-font": "CPNull", + "tile-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "tile-margin": "CPNull", + "tile-text-alignment": "CPNumber", + "tile-text-color": "CPColor:rgba(0, 0, 0, 1)", + "tile-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", + "tile-text-shadow-offset": "{\"width\":0,\"height\":0}", + "tile-vertical-alignment": "CPNumber", + "time-separator-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "title-font": "CPNull", + "title-inset": "CPNull", + "title-text-color": "CPColor:rgba(0, 0, 0, 1)", + "title-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", + "title-text-shadow-offset": "{\"width\":0,\"height\":0}", + "uses-focus-ring": "CPNumber", + "weekday-font": "CPNull", + "weekday-text-color": "CPColor:rgba(0, 0, 0, 1)", + "weekday-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", + "weekday-text-shadow-offset": "{\"width\":0,\"height\":0}" + }, + "CPFont": { + "system-font-face": "CPNull", + "system-font-size-mini": "CPNull", + "system-font-size-regular": "CPNull", + "system-font-size-small": "CPNull", + "system-font-style": "CPNull" + }, + "CPLevelIndicator": { + "bezel-color": "CPNull", + "color-critical": "CPNull", + "color-empty": "CPNull", + "color-normal": "CPNull", + "color-warning": "CPNull", + "spacing": "CPNumber" + }, + "CPPopUpButton": { + "menu-offset": "{\"width\":0,\"height\":0}" + }, + "CPProgressIndicator": { + "bar-color": "CPNull", + "bezel-color": "CPNull", + "circular-border-color": "CPNull", + "circular-border-size": "CPNumber", + "circular-color": "CPNull", + "default-height": "CPNumber", + "indeterminate-bar-color": "CPNull", + "spinning-mini-gif": "CPNull", + "spinning-regular-gif": "CPNull", + "spinning-small-gif": "CPNull" + }, + "CPRuleEditor": { + "add-image": "CPNull", + "alternating-row-colors": "CPNull", + "font": "CPFont:system", + "font-color": "CPNull", + "remove-image": "CPNull", + "selected-color": "CPNull", + "slice-bottom-border-color": "CPNull", + "slice-last-bottom-border-color": "CPNull", + "slice-top-border-color": "CPNull", + "vertical-alignment": "CPNull" + }, + "CPScrollView": { + "border-color": "CPColor:rgba(0, 0, 0, 1)", + "bottom-corner-color": "CPColor:rgba(255, 255, 255, 1)" + }, + "CPScroller": { + "decrement-line-color": "CPNull", + "decrement-line-size": "{\"width\":0,\"height\":0}", + "increment-line-color": "CPNull", + "increment-line-size": "{\"width\":0,\"height\":0}", + "knob-color": "CPNull", + "knob-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "knob-slot-color": "CPNull", + "minimum-knob-length": "CPNumber", + "scroller-width": "CPNumber", + "track-border-overlay": "CPNumber", + "track-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}" + }, + "CPSearchField": { + "image-cancel": "CPNull", + "image-cancel-inset": "{\"top\":0,\"right\":5,\"bottom\":0,\"left\":0}", + "image-cancel-pressed": "CPNull", + "image-find": "CPNull", + "image-search": "CPNull", + "image-search-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":5}", + "layout-function": "CPNull", + "search-button-rect-function": "CPNull", + "search-menu-offset": "{\"x\":10,\"y\":-4}", + "search-right-margin": "CPNumber" + }, + "CPSegmentedControl": { + "alignment": "CPNumber", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "center-segment-bezel-color": "CPNull", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "divider-bezel-color": "CPNull", + "divider-thickness": "CPNumber", + "image-position": "CPNumber", + "image-scaling": "CPNumber", + "left-segment-bezel-color": "CPNull", + "right-segment-bezel-color": "CPNull", + "vertical-alignment": "CPNumber" + }, + "CPShadowView": { + "bezel-color": "CPNull", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}" + }, + "CPSlider": { + "bottom-margin": "CPNumber", + "direct-nib2cib-adjustment": "CPNumber", + "ib-size": "CPNumber", + "knob-color": "CPNull", + "knob-offset": "CPNumber", + "knob-size": "{\"width\":0,\"height\":0}", + "left-track-color": "CPNull", + "tick-mark-color": "CPNull", + "tick-mark-margin": "CPNumber", + "tick-mark-size": "{\"width\":0,\"height\":0}", + "top-margin": "CPNumber", + "track-color": "CPNull", + "track-width": "CPNumber" + }, + "CPSplitView": { + "divider-color": "CPColor:rgba(255, 0, 0, 1)", + "divider-thickness": "CPNumber", + "horizontal-divider-color": "CPNull", + "pane-divider-color": "CPColor:rgba(127, 127, 127, 1)", + "pane-divider-thickness": "CPNumber", + "vertical-divider-color": "CPNull" + }, + "CPStepper": { + "bezel-color-down-button": "CPNull", + "bezel-color-up-button": "CPNull", + "down-button-size": "{\"width\":0,\"height\":0}", + "up-button-size": "{\"width\":0,\"height\":0}" + }, + "CPTabView": { + "box-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "nib2cib-adjustment-frame": "CPNull", + "should-center-on-border": "CPNumber" + }, + "CPTableHeaderView": { + "background-color": "CPNull", + "divider-color": "CPColor:rgba(127, 127, 127, 1)", + "divider-thickness": "CPNumber" + }, + "CPTableView": { + "alternating-row-colors": "[CPColor:rgba(255, 255, 255, 1), CPColor:rgba(245, 249, 252, 1)]", + "default-row-height": "CPNumber", + "dropview-above-border-color": "CPNull", + "dropview-above-border-width": "CPNull", + "dropview-above-selected-border-color": "CPNull", + "dropview-above-selected-border-width": "CPNull", + "dropview-on-background-color": "CPNull", + "dropview-on-border-color": "CPNull", + "dropview-on-border-radius": "CPNull", + "dropview-on-border-width": "CPNull", + "dropview-on-selected-background-color": "CPNull", + "dropview-on-selected-border-color": "CPNull", + "dropview-on-selected-border-radius": "CPNull", + "dropview-on-selected-border-width": "CPNull", + "grid-color": "CPColor:rgba(220, 224, 226, 1)", + "grid-line-thickness": "CPNumber", + "header-view-height": "CPNumber", + "highlighted-grid-color": "CPNull", + "image-generic-file": "CPNull", + "selection-color": "CPNull", + "selection-radius": "CPNull", + "sort-image": "CPNull", + "sort-image-reversed": "CPNull", + "sourcelist-selection-color": "CPNull" + }, + "CPTextField": { + "background-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-color": "CPNull", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset": "{\"top\":1,\"right\":0,\"bottom\":0,\"left\":0}", + "min-size": "{\"width\":0,\"height\":29}" + }, + "CPTokenField": { + "editor-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}" + }, + "CPView": { + "css-based": "CPNumber", + "dynamic-set": "CPNull", + "nib2cib-adjustment-frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}" + }, + "_CPAlertThemeView": { + "button-offset": "CPNumber", + "content-inset": "{\"top\":15,\"right\":15,\"bottom\":15,\"left\":50}", + "default-elements-margin": "CPNumber", + "error-image": "CPNull", + "help-image": "CPNull", + "help-image-left-offset": "CPNumber", + "help-image-pressed": "CPNull", + "image-offset": "{\"x\":15,\"y\":12}", + "information-image": "CPNull", + "informative-offset": "CPNumber", + "informative-text-alignment": "CPNumber", + "informative-text-color": "CPColor:rgba(0, 0, 0, 1)", + "informative-text-font": "CPFont:system", + "informative-text-shadow-color": "CPNull", + "informative-text-shadow-offset": "{\"width\":0,\"height\":0}", + "message-text-alignment": "CPNumber", + "message-text-color": "CPColor:rgba(0, 0, 0, 1)", + "message-text-font": "CPFont:system bold", + "message-text-shadow-color": "CPNull", + "message-text-shadow-offset": "{\"width\":0,\"height\":0}", + "modal-window-button-margin-x": "CPNumber", + "modal-window-button-margin-y": "CPNumber", + "size": "{\"width\":400,\"height\":110}", + "standard-window-button-margin-x": "CPNumber", + "standard-window-button-margin-y": "CPNumber", + "suppression-button-text-color": "CPColor:rgba(0, 0, 0, 1)", + "suppression-button-text-font": "CPFont:system", + "suppression-button-text-shadow-color": "CPNull", + "suppression-button-text-shadow-offset": "CPNumber", + "suppression-button-x-offset": "CPNumber", + "suppression-button-y-offset": "CPNumber", + "warning-image": "CPNull" + }, + "_CPBorderlessBridgeWindowView": { + "toolbar-background-color": "CPColor:rgba(127, 127, 127, 1)" + }, + "_CPCornerView": { + "background-color": "CPNull", + "divider-color": "CPNull" + }, + "_CPDatePickerDayViewTextField": { + "alignment": "CPNumber", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "font": "CPNull", + "min-size": "{\"width\":0,\"height\":0}", + "text-color": "CPColor:rgba(0, 0, 0, 1)", + "text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", + "text-shadow-offset": "{\"width\":0,\"height\":0}", + "vertical-alignment": "CPNumber" + }, + "_CPDatePickerElementSeparator": { + "content-inset": "{\"top\":1,\"right\":0,\"bottom\":0,\"left\":0}", + "min-size": "{\"width\":0,\"height\":0}" + }, + "_CPDatePickerElementTextField": { + "bezel-color": "CPNull", + "content-inset": "{\"top\":1,\"right\":0,\"bottom\":0,\"left\":0}", + "min-size": "{\"width\":0,\"height\":0}" + }, + "_CPDocModalWindowView": { + "body-color": "CPColor:rgba(255, 255, 255, 1)", + "shadow-height": "CPNumber" + }, + "_CPMenuItemMenuBarView": { + "horizontal-margin": "CPNumber", + "submenu-indicator-margin": "CPNumber", + "vertical-margin": "CPNumber" + }, + "_CPMenuItemStandardView": { + "indentation-width": "CPNumber", + "left-margin": "CPNumber", + "menu-item-default-mixed-state-highlighted-image": "CPNull", + "menu-item-default-mixed-state-image": "CPNull", + "menu-item-default-off-state-highlighted-image": "CPNull", + "menu-item-default-off-state-image": "CPNull", + "menu-item-default-on-state-highlighted-image": "CPNull", + "menu-item-default-on-state-image": "CPNull", + "menu-item-disabled-text-color": "CPColor:rgba(170, 170, 170, 1)", + "menu-item-selection-color": "CPNull", + "menu-item-separator-color": "CPNull", + "menu-item-separator-height": "CPNumber", + "menu-item-separator-view-height": "CPNumber", + "menu-item-text-color": "CPNull", + "menu-item-text-shadow-color": "CPNull", + "right-columns-margin": "CPNumber", + "right-margin": "CPNumber", + "state-column-width": "CPNumber", + "submenu-indicator-color": "CPNull", + "submenu-indicator-highlighted-image": "CPNull", + "submenu-indicator-image": "CPNull", + "vertical-margin": "CPNumber", + "vertical-offset": "CPNumber" + }, + "_CPMenuItemView": {}, + "_CPMenuView": { + "menu-bar-height": "CPNumber", + "menu-bar-highlight-color": "CPNull", + "menu-bar-highlight-text-color": "CPNull", + "menu-bar-highlight-text-shadow-color": "CPNull", + "menu-bar-icon-image": "CPNull", + "menu-bar-icon-image-alpha-value": "CPNumber", + "menu-bar-text-color": "CPNull", + "menu-bar-text-shadow-color": "CPNull", + "menu-bar-title-color": "CPNull", + "menu-bar-title-shadow-color": "CPNull", + "menu-bar-window-background-color": "CPNull", + "menu-bar-window-background-selected-color": "CPNull", + "menu-bar-window-first-item-font": "CPNull", + "menu-bar-window-font": "CPNull", + "menu-bar-window-height": "CPNumber", + "menu-bar-window-left-margin": "CPNumber", + "menu-bar-window-margin": "CPNumber", + "menu-bar-window-right-margin": "CPNumber", + "menu-general-icon-new": "CPNull", + "menu-general-icon-open": "CPNull", + "menu-general-icon-save": "CPNull", + "menu-window-margin-inset": "{\"top\":5,\"right\":1,\"bottom\":1,\"left\":5}", + "menu-window-menu-bar-background-style-color": "CPNull", + "menu-window-more-above-image": "CPNull", + "menu-window-more-below-image": "CPNull", + "menu-window-pop-up-background-style-color": "CPNull", + "menu-window-scroll-indicator-height": "CPNumber", + "menu-window-submenu-delta-x": "CPNumber", + "menu-window-submenu-delta-y": "CPNumber", + "menu-window-submenu-first-level-delta-y": "CPNumber" + }, + "_CPPopoverWindowView": { + "background-gradient": "CPNull", + "background-gradient-hud": "CPNull", + "border-radius": "CPNumber", + "shadow-blur": "CPNumber", + "shadow-size": "{\"width\":0,\"height\":6}", + "stroke-color": "CPNull", + "stroke-color-hud": "CPNull", + "stroke-width": "CPNumber" + }, + "_CPShadowWindowView": {}, + "_CPStandardWindowView": { + "bezel-head-color": "CPNull", + "bezel-head-sheet-color": "CPNull", + "body-color": "CPColor:rgba(255, 255, 255, 1)", + "close-image-button": "CPNull", + "close-image-highlighted-button": "CPNull", + "divider-color": "CPColor:rgba(0, 0, 0, 1)", + "gradient-height": "CPNull", + "minimize-image-button": "CPNull", + "minimize-image-highlighted-button": "CPNull", + "solid-color": "CPNull", + "title-bar-height": "CPNumber", + "unsaved-image-button": "CPNull", + "unsaved-image-highlighted-button": "CPNull" + }, + "_CPTableColumnHeaderView": { + "background-color": "CPNull", + "font": "CPNull", + "line-break-mode": "CPNumber", + "text-alignment": "CPNumber", + "text-color": "CPNull", + "text-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "text-shadow-color": "CPNull", + "text-shadow-offset": "{\"width\":0,\"height\":0}" + }, + "_CPTexturedWindowHeadView": {}, + "_CPTokenFieldTokenCloseButton": { + "alignment": "CPNumber", + "bezel-color": "CPNull", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "image": "CPNull", + "image-color": "CPNull", + "image-offset": "CPNumber", + "image-position": "CPNumber", + "image-scaling": "CPNumber", + "image-vertical-offset": "CPNumber", + "invert-image": "CPNumber", + "invert-image-on-push": "CPNumber", + "offset": "{\"x\":15,\"y\":5}", + "vertical-alignment": "CPNumber" + }, + "_CPTokenFieldTokenDisclosureButton": { + "alignment": "CPNumber", + "bezel-color": "CPNull", + "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "image": "CPNull", + "image-color": "CPNull", + "image-offset": "CPNumber", + "image-position": "CPNumber", + "image-scaling": "CPNumber", + "image-vertical-offset": "CPNumber", + "invert-image": "CPNumber", + "invert-image-on-push": "CPNumber", + "offset": "{\"x\":15,\"y\":5}", + "vertical-alignment": "CPNumber" + }, + "_CPToolTipWindowView": { + "background-color": "CPColor:rgba(255, 255, 202, 1)", + "border-radius": "CPNumber", + "color": "CPColor:rgba(0, 0, 0, 1)", + "stroke-color": "CPColor:rgba(227, 227, 227, 1)", + "stroke-width": "CPNumber" + }, + "_CPToolbarView": { + "content-inset": "{\"top\":4,\"right\":4,\"bottom\":4,\"left\":10}", + "extra-item-extra-alternate-image": "CPNull", + "extra-item-extra-image": "CPNull", + "extra-item-width": "CPNumber", + "image-item-separator-color": "CPNull", + "image-item-separator-size": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":2,\"height\":32}}", + "item-margin": "CPNumber", + "regular-size-height": "CPNumber", + "small-size-height": "CPNumber" + }, + "_CPWindowView": { + "attached-sheet-shadow-color": "CPColor:rgba(0, 0, 0, 1)", + "bezel-color": "CPNull", + "border-bottom-left-radius": "CPString", + "border-bottom-right-radius": "CPString", + "border-top-left-radius": "CPString", + "border-top-right-radius": "CPString", + "close-active-image": "CPNull", + "close-image": "CPNull", + "close-image-origin": "CPNull", + "close-image-size": "CPNull", + "frame-outset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "minimize-image-origin": "CPNull", + "minimize-image-size": "CPNull", + "resize-indicator": "CPNull", + "shadow-distance": "CPNumber", + "shadow-height": "CPNumber", + "shadow-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "shadown-horizontal-offset": "CPNumber", + "sheet-vertical-offset": "CPNumber", + "size-indicator": "{\"width\":0,\"height\":0}", + "title-alignment": "CPNumber", + "title-bar-height": "CPNumber", + "title-font": "CPFont:system", + "title-line-break-mode": "CPNumber", + "title-margin": "CPNumber", + "title-text-color": "CPColor:rgba(0, 0, 0, 1)", + "title-text-shadow-color": "CPNull", + "title-text-shadow-offset": "{\"width\":0,\"height\":0}", + "title-vertical-alignment": "CPNumber", + "window-shadow-color": "CPColor:rgba(0, 0, 0, 0)", + "zoom-image-origin": "CPNull", + "zoom-image-size": "CPNull" + } + }, + "instanceMethods": { + "CAAnimation": [ + "delegate", + "duration", + "init", + "isRemovedOnCompletion", + "removedOnCompletion", + "runActionForKey:object:arguments:", + "setDelegate:", + "setDuration:", + "setRemovedOnCompletion:", + "setTimingFunction:", + "shouldArchiveValueForKey:", + "timingFunction", + "timingFunction", + "timingFunctionControlPoints" + ], + "CABasicAnimation": [ + "byValue", + "fromValue", + "init", + "setByValue:", + "setFromValue:", + "setToValue:", + "toValue" + ], + "CAKeyframeAnimation": [ + "biasValues", + "calculationMode", + "continuityValues", + "init", + "keyTimes", + "path", + "rotationMode", + "setBiasValues:", + "setCalculationMode:", + "setContinuityValues:", + "setKeyTimes:", + "setPath:", + "setRotationMode:", + "setTensionValues:", + "setTimingFunctions:", + "setValues:", + "tensionValues", + "timingFunctions", + "timingFunctionsControlPoints", + "values" + ], + "CALayer": [ + "addAnimation:forKey:", + "addSublayer:", + "affineTransform", + "anchorPoint", + "backgroundColor", + "backingStoreFrame", + "bounds", + "composite", + "containsPoint:", + "contents", + "convertPoint:fromLayer:", + "convertPoint:toLayer:", + "convertRect:fromLayer:", + "convertRect:toLayer:", + "delegate", + "display", + "drawInContext:", + "frame", + "hidden", + "hitTest:", + "init", + "insertSublayer:above:", + "insertSublayer:atIndex:", + "insertSublayer:below:", + "isHidden", + "needsDisplayOnBoundsChange", + "opacity", + "position", + "registerRunLoopUpdateWithMask:", + "removeAllAnimations", + "removeAnimationForKey:", + "removeFromSuperlayer", + "replaceSublayer:with:", + "setAffineTransform:", + "setAnchorPoint:", + "setBackgroundColor:", + "setBackingStoreFrame:", + "setBounds:", + "setContents:", + "setDelegate:", + "setFrame:", + "setHidden:", + "setMasksToBounds:", + "setNeedsComposite", + "setNeedsDisplay", + "setNeedsDisplayInRect:", + "setNeedsDisplayOnBoundsChange:", + "setOpacity:", + "setPosition:", + "setSublayerTransform:", + "setZPosition:", + "sublayerTransform", + "sublayers", + "superlayer", + "transformToLayer" + ], + "CAMediaTimingFunction": [ + "controlPoints", + "getControlPointAtIndex:values:", + "initWithControlPoints::::" + ], + "CAPropertyAnimation": [ + "additive", + "cumulative", + "init", + "isAdditive", + "isCumulative", + "keyPath", + "setAdditive:", + "setCumulative:", + "setKeyPath:" + ], + "CPAccordionView": [ + "addItem:", + "collapseItemAtIndex:", + "collapsedItemIndexes", + "expandItemAtIndex:", + "expandedItemIndexes", + "initWithFrame:", + "insertItem:atIndex:", + "itemHeaderPrototype", + "items", + "layoutSubviews", + "removeAllItems", + "removeItem:", + "removeItemAtIndex:", + "setEnabled:forItemAtIndex:", + "setFrameSize:", + "setItemHeaderPrototype:", + "toggleItemAtIndex:" + ], + "CPAccordionViewItem": [ + "identifier", + "init", + "initWithIdentifier:", + "label", + "setIdentifier:", + "setLabel:", + "setView:", + "view" + ], + "CPActionBinding": [ + "init" + ], + "CPAlert": [ + "accessoryView", + "addButtonWithTitle:", + "alertStyle", + "beginSheetModalForWindow:", + "beginSheetModalForWindow:didEndBlock:", + "beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:", + "buttons", + "delegate", + "didEndSelector", + "icon", + "informativeText", + "init", + "layout", + "messageText", + "runModal", + "runModalWithDidEndBlock:", + "setAccessoryView:", + "setAccessoryView:", + "setAlertStyle:", + "setDelegate:", + "setDelegate:", + "setDidEndSelector:", + "setIcon:", + "setInformativeText:", + "setMessageText:", + "setShowsHelp:", + "setShowsSuppressionButton:", + "setShowsSuppressionButton:", + "setTheme:", + "setTitle:", + "setTitle:", + "setValue:forThemeAttribute:", + "setValue:forThemeAttribute:inState:", + "setWindowStyle:", + "showsHelp", + "showsSuppressionButton", + "suppressionButton", + "theme", + "themeView", + "title", + "window", + "windowStyle" + ], + "CPAnimation": [ + "animationCurve", + "animationTimerDidFire:", + "currentProgress", + "currentValue", + "delegate", + "duration", + "frameRate", + "initWithDuration:animationCurve:", + "isAnimating", + "setAnimationCurve:", + "setCurrentProgress:", + "setDelegate:", + "setDuration:", + "setFrameRate:", + "startAnimation", + "stopAnimation" + ], + "CPAnimationContext": [ + "actionFromAction:forAnimatedSubview:", + "completionHandler", + "duration", + "getAnimations:getTimers:usingAction:cssAnimate:", + "init", + "setCompletionHandler:", + "setDuration:", + "setTimingFunction:", + "timingFunction" + ], + "CPAppearance": [ + "allowsVibrancy", + "description", + "encodeWithCoder:", + "initWithAppearanceNamed:bundle:", + "initWithCoder:", + "isEqual:", + "setAllowsVibrancy:" + ], + "CPApplication": [ + "abortModal", + "activateIgnoringOtherApps:", + "addWindowsItem:title:filename:", + "applicationIconImage", + "arguments", + "arrangeInFront:", + "beginModalSessionForWindow:", + "beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:", + "changeWindowsItem:title:filename:", + "currentEvent", + "deactivate", + "delegate", + "doCommandBySelector:", + "endSheet:", + "endSheet:returnCode:", + "finishLaunching", + "hide:", + "hideOtherApplications:", + "init", + "isActive", + "keyWindow", + "mainMenu", + "mainWindow", + "modalWindow", + "namedArguments", + "orderFrontColorPanel:", + "orderFrontStandardAboutPanel:", + "orderFrontStandardAboutPanelWithOptions:", + "orderedWindows", + "removeWindowsItem:", + "replyToApplicationShouldTerminate:", + "run", + "runModalForWindow:", + "runModalSession:", + "sendAction:to:from:", + "sendEvent:", + "setApplicationIconImage:", + "setArguments:", + "setCallback:forNextEventMatchingMask:untilDate:inMode:dequeue:", + "setDelegate:", + "setMainMenu:", + "setMenu:", + "setTarget:selector:forNextEventMatchingMask:untilDate:inMode:dequeue:", + "setThemeBlend:", + "setWindowsMenu:", + "stopModal", + "stopModalWithCode:", + "targetForAction:", + "targetForAction:to:from:", + "terminate:", + "themeBlend", + "tryToPerform:with:", + "updateWindowsItem:", + "windowWithWindowNumber:", + "windows", + "windowsMenu" + ], + "CPArray": [ + "addObserver:forKeyPath:options:context:", + "addObserver:toObjectsAtIndexes:forKeyPath:options:context:", + "arrayByAddingObject:", + "arrayByAddingObjectsFromArray:", + "arrayByApplyingBlock:", + "componentsJoinedByString:", + "containsObject:", + "containsObjectIdenticalTo:", + "copy", + "count", + "description", + "encodeWithCoder:", + "enumerateObjectsUsingBlock:", + "enumerateObjectsWithOptions:usingBlock:", + "filterUsingPredicate:", + "filteredArrayUsingPredicate:", + "firstObject", + "firstObjectCommonWithArray:", + "hash", + "indexOfObject:", + "indexOfObject:inRange:", + "indexOfObject:inSortedRange:options:usingComparator:", + "indexOfObjectIdenticalTo:", + "indexOfObjectIdenticalTo:inRange:", + "indexOfObjectPassingTest:", + "indexOfObjectPassingTest:context:", + "indexOfObjectWithOptions:passingTest:", + "indexOfObjectWithOptions:passingTest:context:", + "indexesOfObjectsPassingTest:", + "indexesOfObjectsPassingTest:context:", + "indexesOfObjectsWithOptions:passingTest:", + "indexesOfObjectsWithOptions:passingTest:context:", + "init", + "initWithArray:", + "initWithArray:copyItems:", + "initWithCapacity:", + "initWithCoder:", + "initWithObjects:", + "initWithObjects:count:", + "isEqual:", + "isEqualToArray:", + "lastObject", + "makeObjectsPerformSelector:", + "makeObjectsPerformSelector:withObject:", + "makeObjectsPerformSelector:withObjects:", + "mutableCopy", + "objectAtIndex:", + "objectEnumerator", + "objectPassingTest:", + "objectsAtIndexes:", + "pathsMatchingExtensions:", + "removeObserver:forKeyPath:", + "removeObserver:fromObjectsAtIndexes:forKeyPath:", + "reverseObjectEnumerator", + "setValue:forKey:", + "setValue:forKeyPath:", + "sortedArrayUsingDescriptors:", + "sortedArrayUsingFunction:", + "sortedArrayUsingFunction:context:", + "sortedArrayUsingSelector:", + "subarrayWithRange:", + "valueForKey:", + "valueForKeyPath:" + ], + "CPArrayController": [ + "add:", + "addObject:", + "addObjects:", + "alwaysUsesMultipleValuesMarker", + "arrangeObjects:", + "arrangedObjects", + "automaticallyRearrangesObjects", + "avoidsEmptySelection", + "awakeFromCib", + "canInsert", + "canSelectNext", + "canSelectPrevious", + "clearsFilterPredicateOnInsertion", + "contentArray", + "contentSet", + "encodeWithCoder:", + "filterPredicate", + "init", + "initWithCoder:", + "insert:", + "insertObject:atArrangedObjectIndex:", + "prepareContent", + "preservesSelection", + "rearrangeObjects", + "remove:", + "removeObject:", + "removeObjectAtArrangedObjectIndex:", + "removeObjects:", + "removeObjectsAtArrangedObjectIndexes:", + "selectNext:", + "selectPrevious:", + "selectedObjects", + "selectionIndex", + "selectionIndexes", + "selectsInsertedObjects", + "setAlwaysUsesMultipleValuesMarker:", + "setAutomaticallyRearrangesObjects:", + "setAvoidsEmptySelection:", + "setClearsFilterPredicateOnInsertion:", + "setContent:", + "setFilterPredicate:", + "setPreservesSelection:", + "setSelectedObjects:", + "setSelectionIndex:", + "setSelectionIndexes:", + "setSelectsInsertedObjects:", + "setSortDescriptors:", + "sortDescriptors" + ], + "CPAttributedString": [ + "addAttribute:value:range:", + "addAttributes:range:", + "appendAttributedString:", + "attribute:atIndex:effectiveRange:", + "attribute:atIndex:longestEffectiveRange:inRange:", + "attributedSubstringFromRange:", + "attributesAtIndex:effectiveRange:", + "attributesAtIndex:longestEffectiveRange:inRange:", + "beginEditing", + "deleteCharactersInRange:", + "encodeWithCoder:", + "endEditing", + "init", + "initWithAttributedString:", + "initWithCoder:", + "initWithString:", + "initWithString:attributes:", + "insertAttributedString:atIndex:", + "isEqual:", + "isEqualToAttributedString:", + "itemNumberInTextList:atIndex:", + "length", + "mutableString", + "rangeOfTextList:atIndex:", + "removeAttribute:range:", + "replaceCharactersInRange:withAttributedString:", + "replaceCharactersInRange:withString:", + "setAttributedString:", + "setAttributes:range:", + "string" + ], + "CPBasePlatform": [], + "CPBasePlatformString": [], + "CPBezierPath": [ + "SVGString", + "addClip", + "appendBezierPath:", + "appendBezierPathWithArcFromPoint:toPoint:radius:", + "appendBezierPathWithOvalInRect:", + "appendBezierPathWithPoints:count:", + "appendBezierPathWithRect:", + "appendBezierPathWithRoundedRect:xRadius:yRadius:", + "bounds", + "closePath", + "controlPointBounds", + "currentPoint", + "curveToPoint:controlPoint1:controlPoint2:", + "elementCount", + "fill", + "getLineDash:count:phase:", + "getLineDash:phase:", + "init", + "isEmpty", + "lineToPoint:", + "lineWidth", + "moveToPoint:", + "removeAllPoints", + "setClip", + "setLineDash:count:phase:", + "setLineDash:phase:", + "setLineWidth:", + "stroke" + ], + "CPBinder": [ + "continuouslyUpdatesValue", + "handlesContentAsCompoundValue", + "initWithBinding:name:to:keyPath:options:from:", + "observeValueForKeyPath:ofObject:change:context:", + "raiseIfNotApplicable:forKeyPath:options:", + "reverseSetValueFor:", + "reverseTransformValue:withOptions:", + "setPlaceholderValue:withMarker:forBinding:", + "setValue:forBinding:", + "setValueFor:", + "source", + "suppressSpecificNotificationFromObject:keyPath:", + "transformValue:withOptions:", + "unsuppressSpecificNotificationFromObject:keyPath:", + "valueForBinding:" + ], + "CPBox": [ + "autoresizesSubview", + "borderColor", + "borderRect", + "borderType", + "borderWidth", + "boxType", + "contentView", + "contentViewMargins", + "cornerRadius", + "drawRect:", + "encodeWithCoder:", + "fillColor", + "initWithCoder:", + "initWithFrame:", + "isCSSBased", + "isTransparent", + "layoutSubviews", + "refreshDisplay", + "setAutoresizesSubviews:", + "setBorderColor:", + "setBorderType:", + "setBorderWidth:", + "setBoxType:", + "setContentView:", + "setContentViewMargins:", + "setCornerRadius:", + "setFillColor:", + "setFrameFromContentFrame:", + "setTitle:", + "setTitleColor:", + "setTitleFont:", + "setTitlePosition:", + "setTransparent:", + "setValue:forKey:", + "sizeToFit", + "title", + "titleColor", + "titleFont", + "titlePosition", + "titleRect", + "titleView" + ], + "CPBrowser": [ + "acceptsFirstResponder", + "addColumn", + "allowsEmptySelection", + "allowsMultipleSelection", + "autohidesScroller", + "canDragRowsWithIndexes:inColumn:withEvent:", + "columnAtPoint:", + "columnContentWidthForColumnWidth:", + "columnOfTableView:", + "columnWidthForColumnContentWidth:", + "defaultColumnWidth", + "delegate", + "doClick:", + "doDoubleClick:", + "doubleAction", + "draggingImageForRowsWithIndexes:inColumn:withEvent:offset:", + "draggingViewForRowsWithIndexes:inColumn:withEvent:offset:", + "encodeWithCoder:", + "imageWidth", + "initWithCoder:", + "initWithFrame:", + "isLeafItem:", + "itemAtRow:inColumn:", + "keyDown:", + "lastColumn", + "loadColumnZero", + "minColumnWidth", + "parentForItemsInColumn:", + "prototypeView", + "rectOfRow:inColumn:", + "registerForDraggedTypes:", + "reloadColumn:", + "rowAtPoint:", + "rowHeight", + "scrollColumnToVisible:", + "scrollRowToVisible:inColumn:", + "selectRow:inColumn:", + "selectRowIndexes:inColumn:", + "selectedColumn", + "selectedItem", + "selectedItems", + "selectedRowInColumn:", + "selectedRowIndexesInColumn:", + "sendAction", + "setAllowsEmptySelection:", + "setAllowsMultipleSelection:", + "setAutohidesScroller:", + "setBackgroundColor:", + "setDefaultColumnWidth:", + "setDelegate:", + "setDoubleAction:", + "setImageWidth:", + "setLastColumn:", + "setMinColumnWidth:", + "setPrototypeView:", + "setRowHeight:", + "setTableViewClass:", + "setWidth:ofColumn:", + "tableViewClass", + "tableViewInColumn:", + "tile", + "trackMouse:", + "widthOfColumn:" + ], + "CPBundle": [ + "bundleIdentifier", + "bundlePath", + "bundleURL", + "classNamed:", + "description", + "environments", + "infoDictionary", + "initWithPath:", + "initWithURL:", + "isLoaded", + "loadCibFile:externalNameTable:", + "loadCibFile:externalNameTable:loadDelegate:", + "loadWithDelegate:", + "localizations", + "localizedStringForKey:value:table:", + "mostEligibleEnvironment", + "objectForInfoDictionaryKey:", + "pathForResource:", + "pathForResource:ofType:", + "pathForResource:ofType:inDirectory:", + "pathForResource:ofType:inDirectory:forLocalization:", + "principalClass", + "resourcePath", + "resourceURL", + "staticResourceURLs" + ], + "CPButton": [ + "allowsMixedState", + "alternateImage", + "alternateTitle", + "bezelRectForBounds:", + "bezelStyle", + "contentRectForBounds:", + "createEphemeralSubviewNamed:", + "encodeWithCoder:", + "highlight:", + "highlightsBy", + "hoveredImage", + "image", + "imageDimsWhenDisabled", + "imageOffset", + "initWithCoder:", + "initWithFrame:", + "invalidateTimers", + "isBordered", + "keyEquivalent", + "keyEquivalentModifierMask", + "layoutSubviews", + "mouseDown:", + "nextState", + "onContinousEvent:", + "performClick:", + "performKeyEquivalent:", + "rectForEphemeralSubviewNamed:", + "setAllowsMixedState:", + "setAlternateImage:", + "setAlternateTitle:", + "setBezelStyle:", + "setBordered:", + "setButtonType:", + "setControlSize:", + "setHighlightsBy:", + "setHoveredImage:", + "setImage:", + "setImageDimsWhenDisabled:", + "setImageOffset:", + "setKeyEquivalent:", + "setKeyEquivalentModifierMask:", + "setNextState", + "setObjectValue:", + "setPeriodicDelay:interval:", + "setShowsStateBy:", + "setState:", + "setTitle:", + "showsStateBy", + "sizeToFit", + "state", + "stopTracking:at:mouseIsUp:", + "title", + "viewWillMoveToWindow:" + ], + "CPButtonBar": [ + "awakeFromCib", + "buttons", + "createEphemeralSubviewNamed:", + "encodeWithCoder:", + "hasResizeControl", + "initWithCoder:", + "initWithFrame:", + "layoutSubviews", + "observeValueForKeyPath:ofObject:change:context:", + "rectForEphemeralSubviewNamed:", + "resizeControlFrame", + "resizeControlIsLeftAligned", + "rightButtons", + "setButtons:", + "setFrameSize:", + "setHasResizeControl:", + "setResizeControlIsLeftAligned:", + "setRightButtons:" + ], + "CPByteCountFormatter": [ + "allowedUnits", + "allowsNonnumericFormatting", + "countStyle", + "encodeWithCoder:", + "getObjectValue:forString:errorDescription:", + "includesActualByteCount", + "includesCount", + "includesUnit", + "init", + "initWithCoder:", + "isAdaptive", + "setAdaptive:", + "setAllowedUnits:", + "setAllowsNonnumericFormatting:", + "setCountStyle:", + "setIncludesActualByteCount:", + "setIncludesCount:", + "setIncludesUnit:", + "setZeroPadsFractionDigits:", + "stringForObjectValue:", + "stringFromByteCount:", + "zeroPadsFractionDigits" + ], + "CPCache": [ + "countLimit", + "delegate", + "init", + "name", + "objectForKey:", + "removeAllObjects", + "removeObjectForKey:", + "setCountLimit:", + "setCountLimit:", + "setDelegate:", + "setDelegate:", + "setName:", + "setObject:forKey:", + "setObject:forKey:cost:", + "setTotalCostLimit:", + "setTotalCostLimit:", + "totalCostLimit" + ], + "CPCharacterSet": [ + "characterIsMember:", + "encodeWithCoder:", + "hasMemberInPlane:", + "init", + "initWithCoder:", + "invert" + ], + "CPCheckBox": [ + "initWithFrame:", + "setValue:forThemeAttribute:", + "takeStateFromKeyPath:ofObjects:", + "takeValueFromKeyPath:ofObjects:" + ], + "CPCib": [ + "connection:didFailWithError:", + "connection:didReceiveData:", + "connectionDidFinishLoading:", + "encodeWithCoder:", + "initWithCibNamed:bundle:", + "initWithCibNamed:bundle:loadDelegate:", + "initWithCoder:", + "initWithContentsOfURL:", + "initWithContentsOfURL:loadDelegate:", + "instantiateCibWithExternalNameTable:", + "instantiateCibWithOwner:topLevelObjects:" + ], + "CPCibBindingConnector": [ + "encodeWithCoder:", + "establishConnection", + "initWithCoder:" + ], + "CPCibConnector": [ + "destination", + "encodeWithCoder:", + "initWithCoder:", + "label", + "replaceObject:withObject:", + "replaceObjects:", + "setDestination:", + "setLabel:", + "setSource:", + "source" + ], + "CPCibControlConnector": [ + "establishConnection" + ], + "CPCibHelpConnector": [ + "encodeWithCoder:", + "establishConnection", + "initWithCoder:" + ], + "CPCibOutletConnector": [ + "establishConnection" + ], + "CPCibRuntimeAttributesConnector": [ + "encodeWithCoder:", + "establishConnection", + "initWithCoder:" + ], + "CPClipView": [ + "autoscroll:", + "constrainScrollPoint:", + "documentView", + "documentVisibleRect", + "encodeWithCoder:", + "initWithCoder:", + "resizeSubviewsWithOldSize:", + "scrollToPoint:", + "setBoundsOrigin:", + "setDocumentView:", + "viewBoundsChanged:", + "viewFrameChanged:" + ], + "CPCoder": [ + "allowsKeyedCoding", + "encodeBycopyObject:", + "encodeConditionalObject:", + "encodeDataObject:", + "encodeObject:", + "encodePoint:", + "encodePropertyList:", + "encodeRect:", + "encodeRootObject:", + "encodeSize:", + "encodeValueOfObjJType:at:" + ], + "CPCollectionView": [ + "acceptsFirstResponder", + "allowsEmptySelection", + "allowsMultipleSelection", + "backgroundColors", + "content", + "delegate", + "deleteBackward:", + "displayItems:frameSize:itemSize:columns:rows:count:", + "draggingEnded:", + "draggingEntered:", + "draggingExited:", + "draggingUpdated:", + "draggingViewForItemsAtIndexes:withEvent:offset:", + "encodeWithCoder:", + "frameForItemAtIndex:", + "frameForItemsAtIndexes:", + "initWithCoder:", + "initWithFrame:", + "isFirstResponder", + "isSelectable", + "itemAtIndex:", + "itemPrototype", + "items", + "keyDown:", + "maxItemSize", + "maxNumberOfColumns", + "maxNumberOfRows", + "menuForEvent:", + "minItemSize", + "mouseDown:", + "mouseDragged:", + "mouseUp:", + "moveDown:", + "moveDownAndModifySelection:", + "moveLeft:", + "moveLeftAndModifySelection:", + "moveRight:", + "moveRightAndModifySelection:", + "moveUp:", + "moveUpAndModifySelection:", + "newItemForRepresentedObject:", + "numberOfColumns", + "numberOfRows", + "pasteboard:provideDataForType:", + "performDragOperation:", + "rectForItemAtIndex:", + "rectForItemsAtIndexes:", + "reloadContent", + "resizeSubviewsWithOldSize:", + "resizeWithOldSuperviewSize:", + "selectionIndexes", + "setAllowsEmptySelection:", + "setAllowsMultipleSelection:", + "setAutoresizingMask:", + "setBackgroundColors:", + "setContent:", + "setDelegate:", + "setItemPrototype:", + "setMaxItemSize:", + "setMaxNumberOfColumns:", + "setMaxNumberOfRows:", + "setMinItemSize:", + "setSelectable:", + "setSelectionIndexes:", + "setUniformSubviewsResizing:", + "setUniformSubviewsResizing:", + "setVerticalMargin:", + "tile", + "tileIfNeeded:", + "uniformSubviewsResizing", + "verticalMargin" + ], + "CPCollectionViewItem": [ + "collectionView", + "copy", + "isSelected", + "setRepresentedObject:", + "setSelected:" + ], + "CPColor": [ + "alphaComponent", + "applyCSSColorForView:onDOMElement:styleNode:previousState:", + "blueComponent", + "brightnessComponent", + "colorUsingColorSpaceName:", + "colorWithAlphaComponent:", + "components", + "cssAfterDictionary", + "cssBeforeDictionary", + "cssDictionary", + "cssString", + "description", + "encodeWithCoder:", + "greenComponent", + "hasCSSAfterDictionary", + "hasCSSBeforeDictionary", + "hasCSSDictionary", + "hexString", + "hsbComponents", + "hueComponent", + "initWithCoder:", + "isCSSBased", + "isEqual:", + "patternImage", + "redComponent", + "saturationComponent", + "set", + "setCssAfterDictionary:", + "setCssBeforeDictionary:", + "setCssDictionary:", + "setFill", + "setStroke" + ], + "CPColorPanel": [ + "action", + "color", + "init", + "mode", + "opacity", + "orderFront:", + "setAction:", + "setColor:", + "setColor:updatePicker:", + "setMode:", + "setOpacity:", + "setTarget:", + "target" + ], + "CPColorPicker": [ + "colorPanel", + "initWithPickerMask:colorPanel:", + "provideNewButtonImage", + "setColor:", + "setMode:" + ], + "CPColorSpace": [ + "CGColorSpace", + "initWithCGColorSpace:" + ], + "CPColorWell": [ + "acceptsFirstResponder", + "activate:", + "becomeFirstResponder", + "bezelRectForBounds:", + "changeColor:", + "color", + "contentBorderRectForBounds:", + "contentRectForBounds:", + "createEphemeralSubviewNamed:", + "deactivate", + "draggingEntered:", + "draggingExited:", + "draggingSourceOperationMaskForLocal:", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "isActive", + "isBordered", + "isFirstResponder", + "layoutSubviews", + "mouseDown:", + "mouseDragged:", + "pasteboard:provideDataForType:", + "performDragOperation:", + "rectForEphemeralSubviewNamed:", + "resignFirstResponder", + "setBordered:", + "setColor:", + "takeColorFrom:" + ], + "CPColorWellValueBinder": [ + "setPlaceholderValue:withMarker:forBinding:", + "setValue:forBinding:", + "valueForBinding:" + ], + "CPColorWheelColorPicker": [ + "brightnessSliderDidChange:", + "colorWheelDidChange:", + "currentMode", + "initView", + "initWithPickerMask:colorPanel:", + "provideNewAlternateButtonImage", + "provideNewButtonImage", + "provideNewView:", + "setColor:", + "supportsMode:", + "updateColor" + ], + "CPComboBox": [ + "addItemWithObjectValue:", + "addItemsWithObjectValues:", + "comboBoxCompletedString:", + "comboBoxSelectionDidChange:", + "comboBoxSelectionIsChanging:", + "comboBoxWillDismiss:", + "comboBoxWillPopUp:", + "completedString:", + "completes", + "createEphemeralSubviewNamed:", + "dataSource", + "delegate", + "deselectItemAtIndex:", + "encodeWithCoder:", + "forceSelection", + "hasVerticalScroller", + "indexOfItemWithObjectValue:", + "indexOfSelectedItem", + "initWithCoder:", + "initWithFrame:", + "insertItemWithObjectValue:atIndex:", + "intercellSpacing", + "interpretKeyEvents:", + "isButtonBordered", + "itemHeight", + "itemObjectValueAtIndex:", + "itemWasClicked:", + "layoutSubviews", + "list:displayValueForObjectValue:", + "list:objectValueForItemAtIndex:", + "list:stringValueForObjectValue:", + "listDelegate", + "listDidDismiss:", + "listIsVisible", + "noteNumberOfItemsChanged", + "numberOfItems", + "numberOfItemsInList:", + "numberOfVisibleItems", + "numberOfVisibleItemsInList:", + "objectValueOfSelectedItem", + "objectValues", + "paste:", + "performKeyEquivalent:", + "popUpList", + "popupButtonRectForBounds:", + "rectForEphemeralSubviewNamed:", + "reloadData", + "reloadDataSourceForSelector:", + "removeAllItems", + "removeItemAtIndex:", + "removeItemWithObjectValue:", + "resignFirstResponder", + "scrollItemAtIndexToTop:", + "scrollItemAtIndexToVisible:", + "selectItemAtIndex:", + "selectItemWithObjectValue:", + "sendAction:to:", + "setAlignment:", + "setButtonBordered:", + "setCompletes:", + "setContent:", + "setContentValues:", + "setDataSource:", + "setDelegate:", + "setFont:", + "setForceSelection:", + "setHasVerticalScroller:", + "setIntercellSpacing:", + "setItemHeight:", + "setListDelegate:", + "setNumberOfVisibleItems:", + "setObjectValue:", + "setUsesDataSource:", + "takeStringValueFromList", + "textDidChange:", + "usesDataSource" + ], + "CPComparisonPredicate": [ + "comparisonPredicateModifier", + "customSelector", + "encodeWithCoder:", + "evaluateWithObject:", + "evaluateWithObject:substitutionVariables:", + "initWithCoder:", + "initWithLeftExpression:rightExpression:customSelector:", + "initWithLeftExpression:rightExpression:modifier:type:options:", + "isEqual:", + "leftExpression", + "options", + "predicateFormat", + "predicateOperatorType", + "predicateWithSubstitutionVariables:", + "rightExpression" + ], + "CPCompoundPredicate": [ + "compoundPredicateType", + "encodeWithCoder:", + "evaluateWithObject:", + "evaluateWithObject:substitutionVariables:", + "initWithCoder:", + "initWithType:subpredicates:", + "isEqual:", + "predicateFormat", + "predicateWithSubstitutionVariables:", + "subpredicates" + ], + "CPControl": [ + "acceptsFirstMouse:", + "action", + "alignment", + "baseWritingDirection", + "continueTracking:at:", + "controlSize", + "doubleValue", + "encodeWithCoder:", + "floatValue", + "font", + "formatter", + "highlight:", + "imagePosition", + "imageScaling", + "initWithCoder:", + "initWithFrame:", + "intValue", + "integerValue", + "isContinuous", + "isEnabled", + "isHighlighted", + "lineBreakMode", + "mouseDown:", + "mouseDownFlags", + "mouseEntered:", + "mouseExited:", + "nextState", + "objectValue", + "performClick:", + "sendAction:to:", + "sendActionOn:", + "sendsActionOnEndEditing", + "setAction:", + "setAlignment:", + "setBaseWritingDirection:", + "setBaseWritingDirection:", + "setContinuous:", + "setControlSize:", + "setDoubleValue:", + "setEnabled:", + "setFloatValue:", + "setFont:", + "setFormatter:", + "setHighlighted:", + "setImagePosition:", + "setImageScaling:", + "setIntValue:", + "setIntegerValue:", + "setLineBreakMode:", + "setObjectValue:", + "setSendsActionOnEndEditing:", + "setState:", + "setStringValue:", + "setTarget:", + "setTextColor:", + "setTextColor:inThemeStates:", + "setTextShadowColor:", + "setTextShadowOffset:", + "setVerticalAlignment:", + "startTrackingAt:", + "stopTracking:at:mouseIsUp:", + "stringValue", + "takeDoubleValueFrom:", + "takeFloatValueFrom:", + "takeIntValueFrom:", + "takeIntegerValueFrom:", + "takeObjectValueFrom:", + "takeStringValueFrom:", + "target", + "textColor", + "textDidBeginEditing:", + "textDidChange:", + "textDidEndEditing:", + "textShadowColor", + "textShadowOffset", + "trackMouse:", + "tracksMouseOutsideOfFrame", + "unhighlightButtonTimerDidFinish:", + "updateTrackingAreas", + "verticalAlignment" + ], + "CPController": [ + "commitEditing", + "discardEditing", + "encodeWithCoder:", + "init", + "initWithCoder:", + "isEditing", + "objectDidBeginEditing:", + "objectDidEndEditing:" + ], + "CPControllerSelectionProxy": [ + "addObserver:forKeyPath:options:context:", + "controllerDidChange", + "controllerWillChange", + "count", + "initWithController:", + "keyEnumerator", + "observeValueForKeyPath:ofObject:change:context:", + "removeObserver:forKeyPath:", + "setValue:forKey:", + "setValue:forKeyPath:", + "valueForKey:", + "valueForKeyPath:" + ], + "CPCookie": [ + "expires", + "initWithName:", + "name", + "setValue:expires:domain:", + "value" + ], + "CPCountedSet": [ + "addObject:", + "countForObject:", + "removeAllObjects", + "removeObject:" + ], + "CPCursor": [ + "encodeWithCoder:", + "hotSpot", + "image", + "initWithCSSString:", + "initWithCoder:", + "initWithImage:foregroundColorHint:backgroundColorHint:hotSpot:", + "initWithImage:hotSpot:", + "isSetOnMouseEntered", + "isSetOnMouseExited", + "mouseEntered:", + "mouseExited:", + "pop", + "push", + "set", + "setOnMouseEntered:", + "setOnMouseExited:" + ], + "CPDOMWindowLayer": [ + "clipWindow:toRect:", + "initWithLevel:", + "insertWindow:atIndex:", + "level", + "orderedWindows", + "removeClipForWindow:", + "removeWindow:" + ], + "CPData": [ + "JSONObject", + "base64", + "bytes", + "description", + "initWithJSONObject:", + "initWithPlistObject:", + "initWithPlistObject:format:", + "initWithRawString:", + "initWithString:", + "length", + "plistObject", + "rawString", + "setJSONObject:", + "setPlistObject:", + "setPlistObject:format:", + "setRawString:", + "setString:", + "string" + ], + "CPDate": [ + "compare:", + "copy", + "dateByAddingTimeInterval:", + "description", + "earlierDate:", + "encodeWithCoder:", + "initWithCoder:", + "initWithString:", + "initWithTimeInterval:sinceDate:", + "initWithTimeIntervalSince1970:", + "initWithTimeIntervalSinceNow:", + "initWithTimeIntervalSinceReferenceDate:", + "isEqual:", + "isEqualToDate:", + "laterDate:", + "timeIntervalSince1970", + "timeIntervalSinceDate:", + "timeIntervalSinceNow", + "timeIntervalSinceReferenceDate" + ], + "CPDateFormatter": [ + "AMSymbol", + "AMSymbol", + "PMSymbol", + "PMSymbol", + "allowNaturalLanguage", + "dateFormat", + "dateFromString:", + "dateStyle", + "defaultDate", + "doesRelativeDateFormatting", + "editingStringForObjectValue:", + "encodeWithCoder:", + "formatterBehavior", + "getObjectValue:forString:errorDescription:", + "init", + "initWithCoder:", + "initWithDateFormat:allowNaturalLanguage:", + "locale", + "monthSymbols", + "quarterSymbols", + "setAMSymbol:", + "setAMSymbol:", + "setDateFormat:", + "setDateStyle:", + "setDefaultDate:", + "setDoesRelativeDateFormatting:", + "setFormatterBehavior:", + "setLocale:", + "setMonthSymbols:", + "setPMSymbol:", + "setPMSymbol:", + "setQuarterSymbols:", + "setShortMonthSymbols:", + "setShortQuarterSymbols:", + "setShortStandaloneMonthSymbols:", + "setShortStandaloneQuarterSymbols:", + "setShortStandaloneWeekdaySymbols:", + "setShortWeekdaySymbols:", + "setStandaloneMonthSymbols:", + "setStandaloneQuarterSymbols:", + "setStandaloneWeekdaySymbols:", + "setSymbol:forKey:languageCode:", + "setSymbols:forLanguageCode:", + "setTimeStyle:", + "setTimeZone:", + "setTwoDigitStartDate:", + "setVeryShortMonthSymbols:", + "setVeryShortStandaloneMonthSymbols:", + "setVeryShortStandaloneWeekdaySymbols:", + "setVeryShortWeekdaySymbols:", + "setWeekdaySymbols:", + "shortMonthSymbols", + "shortQuarterSymbols", + "shortStandaloneMonthSymbols", + "shortStandaloneQuarterSymbols", + "shortStandaloneWeekdaySymbols", + "shortWeekdaySymbols", + "standaloneMonthSymbols", + "standaloneQuarterSymbols", + "standaloneWeekdaySymbols", + "stringForObjectValue:", + "stringFromDate:", + "symbolForKey:languageCode:", + "symbolsForLanguageCode:", + "timeStyle", + "timeZone", + "twoDigitStartDate", + "veryShortMonthSymbols", + "veryShortStandaloneMonthSymbols", + "veryShortStandaloneWeekdaySymbols", + "veryShortWeekdaySymbols", + "weekdaySymbols" + ], + "CPDatePicker": [ + "acceptsFirstResponder", + "becomeFirstResponder", + "copy", + "datePickerElements", + "datePickerMode", + "datePickerStyle", + "dateValue", + "delegate", + "drawsBackground", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "isBezeled", + "isBezeled", + "isBordered", + "isBordered", + "keyDown:", + "layoutSubviews", + "locale", + "maxDate", + "minDate", + "objectValue", + "resignFirstResponder", + "setBackgroundColor:", + "setBezeled:", + "setBezeled:", + "setBordered:", + "setBordered:", + "setControlSize:", + "setDatePickerElements:", + "setDatePickerElements:", + "setDatePickerMode:", + "setDatePickerMode:", + "setDatePickerStyle:", + "setDatePickerStyle:", + "setDateValue:", + "setDateValue:", + "setDelegate:", + "setDelegate:", + "setDrawsBackground:", + "setDrawsBackground:", + "setEnabled:", + "setLocale:", + "setLocale:", + "setMaxDate:", + "setMaxDate:", + "setMinDate:", + "setMinDate:", + "setObjectValue:", + "setTextColor:", + "setTextFont:", + "setTextFont:", + "setTimeInterval:", + "setTimeInterval:", + "setTimeZone:", + "setTimeZone:", + "textFont", + "textFont", + "timeInterval", + "timeZone" + ], + "CPDecimalNumber": [ + "UID", + "boolValue", + "charValue", + "compare:", + "decimalNumberByAdding:", + "decimalNumberByAdding:withBehavior:", + "decimalNumberByDividingBy:", + "decimalNumberByDividingBy:withBehavior:", + "decimalNumberByMultiplyingBy:", + "decimalNumberByMultiplyingBy:withBehavior:", + "decimalNumberByMultiplyingByPowerOf10:", + "decimalNumberByMultiplyingByPowerOf10:withBehavior:", + "decimalNumberByRaisingToPower:", + "decimalNumberByRaisingToPower:withBehavior:", + "decimalNumberByRoundingAccordingToBehavior:", + "decimalNumberBySubtracting:", + "decimalNumberBySubtracting:withBehavior:", + "decimalValue", + "description", + "descriptionWithLocale:", + "doubleValue", + "encodeWithCoder:", + "floatValue", + "init", + "initWithBool:", + "initWithChar:", + "initWithCoder:", + "initWithDecimal:", + "initWithDouble:", + "initWithFloat:", + "initWithInt:", + "initWithLong:", + "initWithLongLong:", + "initWithMantissa:exponent:isNegative:", + "initWithShort:", + "initWithString:", + "initWithString:locale:", + "initWithUnsignedChar:", + "initWithUnsignedInt:", + "initWithUnsignedLong:", + "initWithUnsignedLongLong:", + "initWithUnsignedShort:", + "intValue", + "isEqualToNumber:", + "longLongValue", + "longValue", + "objCType", + "shortValue", + "stringValue", + "unsignedCharValue", + "unsignedIntValue", + "unsignedLongValue", + "unsignedShortValue" + ], + "CPDecimalNumberHandler": [ + "encodeWithCoder:", + "exceptionDuringOperation:error:leftOperand:rightOperand:", + "init", + "initWithCoder:", + "initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:", + "roundingMode", + "scale" + ], + "CPDelayedPerform": [ + "initWithObject:selector:argument:", + "isEqualToPerform:", + "perform" + ], + "CPDictionary": [ + "addEntriesFromDictionary:", + "allKeys", + "allKeysForObject:", + "allValues", + "containsKey:", + "copy", + "count", + "description", + "encodeWithCoder:", + "enumerateKeysAndObjectsUsingBlock:", + "enumerateKeysAndObjectsWithOptions:usingBlock:", + "initWithCoder:", + "initWithDictionary:", + "initWithObjects:forKeys:", + "initWithObjectsAndKeys:", + "inverseChangeDictionary", + "isEqual:", + "isEqualToDictionary:", + "keyEnumerator", + "keysOfEntriesPassingTest:", + "keysOfEntriesWithOptions:passingTest:", + "keysSortedByValueUsingComparator:", + "keysSortedByValueUsingSelector:", + "objectEnumerator", + "objectForKey:", + "removeAllObjects", + "removeObjectForKey:", + "removeObjectsForKeys:", + "setObject:forKey:", + "setValue:forKey:", + "valueForKey:" + ], + "CPDisclosureButton": [ + "drawRect:", + "initWithFrame:", + "setState:" + ], + "CPDocument": [ + "addViewController:forWindowController:", + "addWindowController:", + "alertDidEnd:returnCode:", + "canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:", + "close", + "connection:didFailWithError:", + "connection:didReceiveData:", + "connection:didReceiveResponse:", + "connectionDidFinishLoading:", + "dataOfType:error:", + "displayName", + "fileType", + "fileURL", + "hasUndoManager", + "init", + "initForURL:withContentsOfURL:ofType:delegate:didReadSelector:contextInfo:", + "initWithContentsOfURL:ofType:delegate:didReadSelector:contextInfo:", + "initWithType:error:", + "isDocumentEdited", + "makeViewAndWindowControllers", + "makeWindowControllers", + "readFromData:ofType:error:", + "readFromURL:ofType:delegate:didReadSelector:contextInfo:", + "removeViewController:", + "removeWindowController:", + "saveDocument:", + "saveDocumentAs:", + "saveDocumentWithDelegate:didSaveSelector:contextInfo:", + "saveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:", + "setFileType:", + "setFileURL:", + "setHasUndoManager:", + "setUndoManager:", + "shouldCloseWindowController:delegate:shouldCloseSelector:contextInfo:", + "showWindows", + "undoManager", + "updateChangeCount:", + "view", + "viewCibName", + "viewControllerDidLoadCib:", + "viewControllerForWindowController:", + "viewControllerWillLoadCib:", + "viewControllers", + "windowCibName", + "windowControllerDidLoadCib:", + "windowControllerWillLoadCib:", + "windowControllers", + "windowWillReturnUndoManager:" + ], + "CPDocumentController": [ + "addDocument:", + "clearRecentDocuments:", + "closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo:", + "currentDocument", + "defaultType", + "document:didRead:contextInfo:", + "documentClassForType:", + "documentForURL:", + "documentForWindow:", + "documents", + "hasEditedDocuments", + "init", + "makeDocumentForURL:withContentsOfURL:ofType:delegate:didReadSelector:contextInfo:", + "makeDocumentWithContentsOfURL:ofType:delegate:didReadSelector:contextInfo:", + "makeUntitledDocumentOfType:error:", + "newDocument:", + "noteNewRecentDocument:", + "noteNewRecentDocumentURL:", + "openDocument:", + "openDocumentWithContentsOfURL:display:error:", + "openUntitledDocumentOfType:display:", + "recentDocumentURLs", + "removeDocument:", + "reopenDocumentForURL:withContentsOfURL:error:", + "typeForContentsOfURL:error:" + ], + "CPDoubleClickActionBinding": [ + "init" + ], + "CPDragServer": [ + "animationDidEnd:", + "animationDidStop:", + "dragImage:fromWindow:at:offset:event:pasteboard:source:slideBack:", + "dragView:fromWindow:at:offset:event:pasteboard:source:slideBack:", + "draggedView", + "draggedWindow", + "draggingDestination", + "draggingEndedInPlatformWindow:globalLocation:operation:", + "draggingLocation", + "draggingOffset", + "draggingPasteboard", + "draggingSource", + "draggingSourceUpdatedWithGlobalLocation:", + "draggingStartedInPlatformWindow:globalLocation:", + "draggingUpdatedInPlatformWindow:location:", + "init", + "isDragging", + "performDragOperationInPlatformWindow:", + "trackDragging:" + ], + "CPDraggingInfo": [ + "draggedImage", + "draggedImageLocation", + "draggedView", + "draggedViewLocation", + "draggingDestinationWindow", + "draggingLocation", + "draggingPasteboard", + "draggingSource" + ], + "CPEnumerator": [ + "allObjects", + "nextObject" + ], + "CPError": [ + "code", + "description", + "domain", + "encodeWithCoder:", + "initWithCoder:", + "initWithDomain:code:userInfo:", + "localizedDescription", + "localizedFailureReason", + "localizedRecoveryOptions", + "localizedRecoverySuggestion", + "recoveryAttempter", + "userInfo" + ], + "CPEvent": [ + "buttonNumber", + "characters", + "charactersIgnoringModifiers", + "clickCount", + "data1", + "data2", + "deltaX", + "deltaY", + "deltaZ", + "description", + "globalLocation", + "hasPreciseScrollingDeltas", + "isARepeat", + "keyCode", + "locationInWindow", + "modifierFlags", + "pressure", + "scrollingDeltaX", + "scrollingDeltaY", + "subtype", + "timestamp", + "trackingArea", + "type", + "window", + "windowNumber" + ], + "CPException": [ + "copy", + "description", + "encodeWithCoder:", + "initWithCoder:", + "initWithName:reason:userInfo:", + "isEqual:", + "name", + "raise", + "reason", + "userInfo" + ], + "CPExpression": [ + "arguments", + "collection", + "constantValue", + "expressionBlock", + "expressionType", + "falseExpression", + "function", + "initWithExpressionType:", + "keyPath", + "leftExpression", + "operand", + "predicate", + "rightExpression", + "trueExpression", + "variable" + ], + "CPFont": [ + "ascender", + "controlSizeCorrespondingToFontSize", + "copy", + "cssString", + "defaultLineHeightForFont", + "descender", + "description", + "encodeWithCoder:", + "familyName", + "fontDescriptor", + "fontName", + "initWithCoder:", + "isBold", + "isEqual:", + "isItalic", + "isSystem", + "isSystemSize", + "pointSize", + "size" + ], + "CPFontDescriptor": [ + "cssString", + "encodeWithCoder:", + "fontAttributes", + "fontDescriptorByAddingAttributes:", + "fontDescriptorWithSize:", + "fontDescriptorWithSymbolicTraits:", + "fontFamilyCSSString", + "fontSizeCSSString", + "fontStyleCSSString", + "fontVariantCSSString", + "fontWeightCSSString", + "initWithCoder:", + "initWithFontAttributes:", + "objectForKey:", + "pointSize", + "symbolicTraits" + ], + "CPFontManager": [ + "action", + "addFontTrait:", + "availableFonts", + "convertFont:", + "convertFont:toFace:", + "convertFont:toHaveTrait:", + "convertFont:toNotHaveTrait:", + "convertFont:toSize:", + "delegate", + "fontPanel:", + "fontWithNameIsAvailable:", + "init", + "isMultiple", + "modifyFont:", + "modifyFontViaPanel:", + "orderFrontFontPanel:", + "selectedFont", + "sendAction", + "setAction:", + "setDelegate:", + "setMultiple:", + "setSelectedFont:isMultiple:", + "setTarget:", + "target", + "traitsOfFont:", + "weightOfFont:" + ], + "CPFontPanel": [ + "acceptsFirstResponder", + "browser:child:ofItem:", + "browser:isLeafItem:", + "browser:numberOfChildrenOfItem:", + "browser:objectValueForItem:", + "browserClicked:", + "changeColor:", + "currentFont", + "currentSize", + "currentTrait", + "dblClicked:", + "init", + "orderFront:", + "panelConvertFont:", + "reloadDefaultFontFamilies", + "setCurrentFont:", + "setCurrentSize:", + "setCurrentTrait:", + "setPanelFont:isMultiple:", + "textViewDidChangeSelection:", + "windowDidResize:", + "worksWhenModal" + ], + "CPFormatter": [ + "editingStringForObjectValue:", + "encodeWithCoder:", + "getObjectValue:forString:errorDescription:", + "initWithCoder:", + "isPartialStringValid:newEditingString:errorDescription:", + "isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:", + "stringForObjectValue:" + ], + "CPFunctionOperation": [ + "addExecutionFunction:", + "executionFunctions", + "init", + "main" + ], + "CPGradient": [ + "drawFromPoint:toPoint:options:", + "drawInBezierPath:angle:", + "drawInRect:angle:", + "initWithColors:", + "initWithColors:atLocations:colorSpace:", + "initWithStartingColor:endingColor:" + ], + "CPGraphicsContext": [ + "graphicsPort", + "initWithGraphicsPort:", + "isFlipped", + "restoreGraphicsState", + "saveGraphicsState" + ], + "CPHTTPURLResponse": [ + "allHeaderFields", + "statusCode" + ], + "CPImage": [ + "applyCSSImageForView:onDOMElement:styleNode:previousState:", + "cssAfterDictionary", + "cssBeforeDictionary", + "cssDictionary", + "data", + "delegate", + "description", + "drawAtPoint:fromRect:operation:fraction:", + "duplicate", + "encodeWithCoder:", + "filename", + "hasCSSAfterDictionary", + "hasCSSBeforeDictionary", + "hasCSSDictionary", + "image", + "init", + "initByReferencingFile:size:", + "initWithCSSDictionary:beforeDictionary:afterDictionary:size:", + "initWithCoder:", + "initWithContentsOfFile:", + "initWithContentsOfFile:size:", + "initWithData:", + "isCSSBased", + "isMaterialIconImage", + "isNinePartImage", + "isSingleImage", + "isThreePartImage", + "load", + "loadStatus", + "name", + "setCssAfterDictionary:", + "setCssBeforeDictionary:", + "setCssDictionary:", + "setDelegate:", + "setName:", + "setSize:", + "size" + ], + "CPImageView": [ + "encodeWithCoder:", + "hasShadow", + "hideOrDisplayContents", + "image", + "imageAlignment", + "imageDidLoad:", + "imageRect", + "imageScaling", + "initWithCoder:", + "initWithFrame:", + "isEditable", + "layoutSubviews", + "mouseDown:", + "performDragOperation:", + "setEditable:", + "setHasShadow:", + "setImage:", + "setImageAlignment:", + "setImageScaling:", + "setObjectValue:" + ], + "CPImageViewValueBinder": [ + "setPlaceholderValue:withMarker:forBinding:", + "setValue:forBinding:", + "valueForBinding:" + ], + "CPIndexPath": [ + "compare:", + "description", + "encodeWithCoder:", + "indexAtPosition:", + "indexPathByAddingIndex:", + "indexPathByRemovingLastIndex", + "indexes", + "indexes", + "initWithCoder:", + "initWithIndexes:", + "initWithIndexes:length:", + "isEqual:", + "length", + "setIndexes:", + "setIndexes:" + ], + "CPIndexSet": [ + "addIndex:", + "addIndexes:", + "addIndexesInRange:", + "containsIndex:", + "containsIndexes:", + "containsIndexesInRange:", + "copy", + "count", + "description", + "encodeWithCoder:", + "enumerateIndexesInRange:options:usingBlock:", + "enumerateIndexesUsingBlock:", + "enumerateIndexesWithOptions:usingBlock:", + "firstIndex", + "getIndexes:maxCount:inIndexRange:", + "indexGreaterThanIndex:", + "indexGreaterThanOrEqualToIndex:", + "indexInRange:options:passingTest:", + "indexLessThanIndex:", + "indexLessThanOrEqualToIndex:", + "indexPassingTest:", + "indexWithOptions:passingTest:", + "indexesInRange:options:passingTest:", + "indexesPassingTest:", + "indexesWithOptions:passingTest:", + "init", + "initWithCoder:", + "initWithIndex:", + "initWithIndexSet:", + "initWithIndexesInRange:", + "intersectsIndexesInRange:", + "isEqual:", + "isEqualToIndexSet:", + "lastIndex", + "mutableCopy", + "removeAllIndexes", + "removeIndex:", + "removeIndexes:", + "removeIndexesInRange:", + "shiftIndexesStartingAtIndex:by:" + ], + "CPInvocation": [ + "argumentAtIndex:", + "encodeWithCoder:", + "initWithCoder:", + "initWithMethodSignature:", + "invoke", + "invokeWithTarget:", + "returnValue", + "selector", + "setArgument:atIndex:", + "setReturnValue:", + "setSelector:", + "setTarget:", + "target" + ], + "CPInvocationOperation": [ + "init", + "initWithInvocation:", + "initWithTarget:selector:object:", + "invocation", + "main", + "result" + ], + "CPIsNilTransformer": [ + "transformedValue:" + ], + "CPIsNotNilTransformer": [ + "transformedValue:" + ], + "CPJSONPConnection": [ + "cancel", + "initWithRequest:callback:delegate:", + "initWithRequest:callback:delegate:startImmediately:", + "removeScriptTag", + "start" + ], + "CPKeyBinding": [ + "description", + "initWithKey:modifierFlags:selectors:", + "initWithPhysicalKeyString:selectors:", + "isEqual:", + "key", + "modifierFlags", + "selectors" + ], + "CPKeyedArchiver": [ + "classNameForClass:", + "delegate", + "encodeBool:forKey:", + "encodeConditionalObject:forKey:", + "encodeDouble:forKey:", + "encodeFloat:forKey:", + "encodeInt:forKey:", + "encodeNumber:forKey:", + "encodeObject:forKey:", + "encodePoint:forKey:", + "encodeRect:forKey:", + "encodeSize:forKey:", + "finishEncoding", + "initForWritingWithMutableData:", + "outputFormat", + "setClassName:forClass:", + "setDelegate:", + "setOutputFormat:" + ], + "CPKeyedUnarchiver": [ + "allowsKeyedCoding", + "classForClassName:", + "containsValueForKey:", + "decodeBoolForKey:", + "decodeBytesForKey:", + "decodeDoubleForKey:", + "decodeFloatForKey:", + "decodeIntForKey:", + "decodeObjectForKey:", + "decodePointForKey:", + "decodeRectForKey:", + "decodeSizeForKey:", + "delegate", + "finishDecoding", + "initForReadingWithData:", + "setClass:forClassName:", + "setDelegate:" + ], + "CPLayoutManager": [ + "addTemporaryAttributes:forCharacterRange:", + "addTextContainer:", + "boundingRectForGlyphRange:inTextContainer:", + "characterIndexForGlyphAtIndex:", + "characterRangeForGlyphRange:actualGlyphRange:", + "drawBackgroundForGlyphRange:atPoint:", + "drawGlyphsForGlyphRange:atPoint:", + "encodeWithCoder:", + "extraLineFragmentRect", + "extraLineFragmentTextContainer", + "extraLineFragmentUsedRect", + "firstTextView", + "glyphIndexForPoint:inTextContainer:", + "glyphIndexForPoint:inTextContainer:fractionOfDistanceThroughGlyph:", + "glyphRangeForBoundingRect:inTextContainer:", + "glyphRangeForTextContainer:", + "init", + "initWithCoder:", + "insertTextContainer:atIndex:", + "invalidateDisplayForGlyphRange:", + "invalidateLayoutForCharacterRange:isSoft:actualCharacterRange:", + "layoutManagerOwnsFirstResponderInWindow:", + "lineFragmentRectForGlyphAtIndex:effectiveRange:", + "lineFragmentUsedRectForGlyphAtIndex:effectiveRange:", + "locationForGlyphAtIndex:", + "numberOfCharacters", + "numberOfGlyphs", + "rectArrayForCharacterRange:withinSelectedCharacterRange:inTextContainer:rectCount:", + "removeTemporaryAttribute:forCharacterRange:", + "removeTextContainerAtIndex:", + "setExtraLineFragmentRect:usedRect:textContainer:", + "setLineFragmentFactory:", + "setLineFragmentRect:forGlyphRange:usedRect:", + "setLocation:forStartOfGlyphRange:", + "setTemporaryAttributes:forCharacterRange:", + "setTextContainer:forGlyphRange:", + "setTextStorage:", + "setTypesetter:", + "temporaryAttributesAtCharacterIndex:effectiveRange:", + "textContainerChangedTextView:", + "textContainerForGlyphAtIndex:effectiveRange:", + "textContainerForGlyphAtIndex:effectiveRange:withoutAdditionalLayout:", + "textContainers", + "textStorage", + "textStorage:edited:range:changeInLength:invalidatedRange:", + "textViewForBeginningOfSelection", + "typesetter", + "usedRectForTextContainer:" + ], + "CPLevelIndicator": [ + "createEphemeralSubviewNamed:", + "criticalValue", + "encodeWithCoder:", + "hitTest:", + "initWithCoder:", + "initWithFrame:", + "isEditable", + "layoutSubviews", + "levelIndicatorStyle", + "maxValue", + "minValue", + "mouseDown:", + "numberOfMajorTickMarks", + "numberOfTickMarks", + "rectForEphemeralSubviewNamed:", + "setCriticalValue:", + "setCriticalValue:", + "setEditable:", + "setLevelIndicatorStyle:", + "setMaxValue:", + "setMaxValue:", + "setMinValue:", + "setMinValue:", + "setNumberOfMajorTickMarks:", + "setNumberOfTickMarks:", + "setTickMarkPosition:", + "setWarningValue:", + "setWarningValue:", + "tickMarkPosition", + "warningValue" + ], + "CPLocale": [ + "encodeWithCoder:", + "initWithCoder:", + "initWithLocaleIdentifier:", + "localeIdentifier", + "objectForKey:" + ], + "CPMapTable": [ + "count", + "dictionaryRepresentation", + "init", + "keyEnumerator", + "objectEnumerator", + "objectForKey:", + "removeAllObjects", + "removeObjectForKey:", + "setObject:forKey:" + ], + "CPMarkdownParser": [], + "CPMenu": [ + "addItem:", + "addItemWithTitle:action:keyEquivalent:", + "autoenablesItems", + "awakeFromCib", + "cancelTracking", + "countOfItems", + "delegate", + "encodeWithCoder:", + "font", + "highlightedItem", + "indexOfItem:", + "indexOfItemWithRepresentedObject:", + "indexOfItemWithSubmenu:", + "indexOfItemWithTag:", + "indexOfItemWithTarget:andAction:", + "indexOfItemWithTitle:", + "init", + "initWithCoder:", + "initWithTitle:", + "insertItem:atIndex:", + "insertItemWithTitle:action:keyEquivalent:atIndex:", + "insertObject:inItemsAtIndex:", + "isTornOff", + "itemArray", + "itemAtIndex:", + "itemChanged:", + "itemWithTag:", + "itemWithTitle:", + "itemsAtIndexes:", + "menuBarHeight", + "minimumWidth", + "numberOfItems", + "objectInItemsAtIndex:", + "performActionForItemAtIndex:", + "performKeyEquivalent:", + "popUpMenuPositioningItem:atLocation:inView:callback:", + "removeAllItems", + "removeItem:", + "removeItemAtIndex:", + "removeObjectFromItemsAtIndex:", + "setAutoenablesItems:", + "setDelegate:", + "setFont:", + "setMinimumWidth:", + "setShowsStateColumn:", + "setSubmenu:forItem:", + "setSupermenu:", + "setTitle:", + "showsStateColumn", + "submenuAction:", + "supermenu", + "title", + "update" + ], + "CPMenuItem": [ + "action", + "alternateImage", + "copy", + "description", + "encodeWithCoder:", + "font", + "hasSubmenu", + "image", + "indentationLevel", + "init", + "initWithCoder:", + "initWithTitle:action:keyEquivalent:", + "isAlternate", + "isEnabled", + "isHidden", + "isHiddenOrHasHiddenAncestor", + "isHighlighted", + "isSeparatorItem", + "keyEquivalent", + "keyEquivalentModifierMask", + "keyEquivalentStringRepresentation", + "menu", + "mixedStateImage", + "mnemonic", + "mnemonicLocation", + "mutableCopy", + "offStateImage", + "onStateImage", + "representedObject", + "setAction:", + "setAlternate:", + "setAlternateImage:", + "setEnabled:", + "setFont:", + "setHidden:", + "setImage:", + "setIndentationLevel:", + "setKeyEquivalent:", + "setKeyEquivalentModifierMask:", + "setMenu:", + "setMixedStateImage:", + "setMnemonicLocation:", + "setOffStateImage:", + "setOnStateImage:", + "setRepresentedObject:", + "setState:", + "setSubmenu:", + "setTag:", + "setTarget:", + "setTextColor:", + "setTitle:", + "setTitleWithMnemonicLocation:", + "setToolTip:", + "setView:", + "state", + "submenu", + "tag", + "target", + "title", + "toolTip", + "view" + ], + "CPMultipleValueAndBinding": [ + "init" + ], + "CPMultipleValueOrBinding": [ + "init" + ], + "CPMutableArray": [ + "addObject:", + "addObjectsFromArray:", + "exchangeObjectAtIndex:withObjectAtIndex:", + "insertObject:atIndex:", + "insertObject:inArraySortedByDescriptors:", + "insertObjects:atIndexes:", + "removeAllObjects", + "removeLastObject", + "removeObject:", + "removeObject:inRange:", + "removeObjectAtIndex:", + "removeObjectIdenticalTo:", + "removeObjectIdenticalTo:inRange:", + "removeObjectsAtIndexes:", + "removeObjectsInArray:", + "removeObjectsInRange:", + "replaceObjectAtIndex:withObject:", + "replaceObjectsAtIndexes:withObjects:", + "replaceObjectsInRange:withObjectsFromArray:", + "replaceObjectsInRange:withObjectsFromArray:range:", + "setArray:", + "sortUsingDescriptors:", + "sortUsingFunction:context:", + "sortUsingSelector:" + ], + "CPMutableAttributedString": [ + "replaceOccurrencesOfString:withString:options:range:" + ], + "CPMutableDictionary": [], + "CPMutableIndexSet": [], + "CPMutableParagraphStyle": [ + "addTabStop:", + "copyWithZone:", + "initWithCoder:", + "initWithParagraphStyle:", + "removeTabStop:", + "setAlignment:", + "setBaseWritingDirection:", + "setDefaultTabInterval:", + "setFirstLineHeadIndent:", + "setHeadIndent:", + "setLineBreakMode:", + "setLineHeightMultiple:", + "setLineSpacing:", + "setMaximumLineHeight:", + "setMinimumLineHeight:", + "setParagraphSpacing:", + "setParagraphSpacingBefore:", + "setTabStops:", + "setTailIndent:", + "setTextLists:" + ], + "CPMutableSet": [ + "addObjectsFromArray:", + "filterUsingPredicate:", + "initWithCapacity:", + "intersectSet:", + "minusSet:", + "removeAllObjects", + "removeObject:", + "removeObjectsInArray:", + "setSet:", + "unionSet:" + ], + "CPNegateBooleanTransformer": [ + "reverseTransformedValue:", + "transformedValue:" + ], + "CPNinePartImage": [ + "encodeWithCoder:", + "filename", + "imageSlices", + "initWithCoder:", + "initWithImageSlices:", + "isNinePartImage", + "isSingleImage", + "isThreePartImage" + ], + "CPNotification": [ + "init", + "initWithName:object:userInfo:", + "name", + "object", + "userInfo" + ], + "CPNotificationCenter": [ + "addObserver:selector:name:object:", + "addObserverForName:object:queue:usingBlock:", + "init", + "postNotification:", + "postNotificationName:object:", + "postNotificationName:object:userInfo:", + "removeObserver:", + "removeObserver:name:object:" + ], + "CPNotificationQueue": [ + "dequeueNotificationsMatching:coalesceMask:", + "enqueueNotification:postingStyle:", + "enqueueNotification:postingStyle:coalesceMask:forModes:", + "initWithNotificationCenter:" + ], + "CPNull": [ + "encodeWithCoder:", + "initWithCoder:", + "isEqual:", + "valueForKey:" + ], + "CPNumber": [ + "UID", + "boolValue", + "compare:", + "decimalValue", + "description", + "descriptionWithLocale:", + "doubleValue", + "encodeWithCoder:", + "floatValue", + "initWithBool:", + "initWithChar:", + "initWithCoder:", + "initWithDouble:", + "initWithFloat:", + "initWithInt:", + "initWithLong:", + "initWithLongLong:", + "initWithShort:", + "initWithUnsignedChar:", + "initWithUnsignedInt:", + "initWithUnsignedLong:", + "initWithUnsignedShort:", + "intValue", + "integerValue", + "isEqualToNumber:", + "longLongValue", + "longValue", + "shortValue", + "stringValue", + "unsignedCharValue", + "unsignedIntValue", + "unsignedLongValue", + "unsignedShortValue" + ], + "CPNumberFormatter": [ + "currencyCode", + "currencySymbol", + "editingStringForObjectValue:", + "encodeWithCoder:", + "generatesDecimalNumbers", + "getObjectValue:forString:errorDescription:", + "groupingSeparator", + "init", + "initWithCoder:", + "maximum", + "maximumFractionDigits", + "minimum", + "minimumFractionDigits", + "numberFromString:", + "numberStyle", + "perMillSymbol", + "roundingMode", + "setCurrencyCode:", + "setCurrencySymbol:", + "setGeneratesDecimalNumbers:", + "setGroupingSeparator:", + "setMaximum:", + "setMaximum:", + "setMaximumFractionDigits:", + "setMaximumFractionDigits:", + "setMinimum:", + "setMinimum:", + "setMinimumFractionDigits:", + "setMinimumFractionDigits:", + "setNumberStyle:", + "setNumberStyle:", + "setPerMillSymbol:", + "setRoundingMode:", + "setRoundingMode:", + "stringForObjectValue:", + "stringFromNumber:" + ], + "CPObject": [ + "UID", + "actualTheme", + "actualValueForThemeAttribute:", + "actualValueForThemeAttribute:inState:", + "addObserver:forKeyPath:options:context:", + "applyChange:toKeyPath:", + "autorelease", + "awakeAfterUsingCoder:", + "awakeAfterUsingCoder:", + "awakeFromCib", + "bind:toObject:withKeyPath:options:", + "class", + "classForCoder", + "classForKeyedArchiver", + "className", + "conformsToProtocol:", + "copy", + "currentValueForThemeAttribute:", + "dealloc", + "description", + "dictionaryWithValuesForKeys:", + "didChange:valuesAtIndexes:forKey:", + "didChangeValueForKey:", + "didChangeValueForKey:withSetMutation:usingObjects:", + "doesNotRecognizeSelector:", + "exposedBindings", + "forwardInvocation:", + "forwardingTargetForSelector:", + "hasThemeAttribute:", + "hasThemeState:", + "hasThemeStates:", + "hash", + "implementsSelector:", + "infoForBinding:", + "init", + "isEqual:", + "isKindOfClass:", + "isMemberOfClass:", + "isProxy", + "kvoValueForKey:", + "methodForSelector:", + "methodSignatureForSelector:", + "mutableArrayValueForKey:", + "mutableArrayValueForKeyPath:", + "mutableCopy", + "mutableSetValueForKey:", + "mutableSetValueForKeyPath:", + "objectDidChangeTheme", + "performSelector:", + "performSelector:withObject:", + "performSelector:withObject:afterDelay:", + "performSelector:withObject:afterDelay:inModes:", + "performSelector:withObject:withObject:", + "performSelector:withObjects:", + "registerThemeValues:", + "registerThemeValues:inherit:", + "release", + "removeObserver:forKeyPath:", + "replacementObjectForArchiver:", + "replacementObjectForCoder:", + "replacementObjectForKeyedArchiver:", + "respondsToSelector:", + "retain", + "self", + "setTheme:", + "setThemeClass:", + "setThemeState:", + "setThemeStates:", + "setValue:forKey:", + "setValue:forKeyPath:", + "setValue:forThemeAttribute:", + "setValue:forThemeAttribute:inState:", + "setValue:forThemeAttribute:inStates:", + "setValue:forUndefinedKey:", + "setValuesForKeysWithDictionary:", + "superclass", + "theme", + "themeClass", + "themeState", + "unbind:", + "unsetThemeState:", + "unsetThemeStates:", + "valueClassForBinding:", + "valueForKey:", + "valueForKeyPath:", + "valueForThemeAttribute:", + "valueForThemeAttribute:inState:", + "valueForThemeAttribute:inStates:", + "valueForUndefinedKey:", + "valueType", + "willChange:valuesAtIndexes:forKey:", + "willChangeValueForKey:", + "willChangeValueForKey:withSetMutation:usingObjects:" + ], + "CPObjectController": [ + "add:", + "addObject:", + "addObserver:forKeyPath:options:context:", + "automaticallyPreparesContent", + "awakeFromCib", + "canAdd", + "canRemove", + "content", + "encodeWithCoder:", + "entityName", + "fetchPredicate", + "init", + "initWithCoder:", + "initWithContent:", + "isEditable", + "newObject", + "objectClass", + "observedKeys", + "prepareContent", + "remove:", + "removeObject:", + "removeObserver:forKeyPath:", + "selectedObjects", + "selection", + "setAutomaticallyPreparesContent:", + "setContent:", + "setEditable:", + "setEntityName:", + "setFetchPredicate:", + "setObjectClass:", + "setUsesLazyFetching:", + "usesLazyFetching" + ], + "CPOpenPanel": [ + "URLs", + "allowsMultipleSelection", + "canChooseDirectories", + "canChooseFiles", + "directoryURL", + "runModal", + "setAllowsMultipleSelection:", + "setCanChooseDirectories:", + "setCanChooseFiles:", + "setDirectoryURL:" + ], + "CPOperation": [ + "addDependency:", + "cancel", + "completionFunction", + "dependencies", + "init", + "isCancelled", + "isConcurrent", + "isExecuting", + "isFinished", + "isReady", + "main", + "observeValueForKeyPath:ofObject:change:context:", + "queuePriority", + "removeDependency:", + "setCompletionFunction:", + "setQueuePriority:", + "start", + "waitUntilFinished" + ], + "CPOperationQueue": [ + "addOperation:", + "addOperationWithFunction:", + "addOperations:waitUntilFinished:", + "cancelAllOperations", + "init", + "isSuspended", + "maxConcurrentOperationCount", + "name", + "operationCount", + "operations", + "setName:", + "setSuspended:", + "waitUntilAllOperationsAreFinished" + ], + "CPOutlineView": [ + "addTableColumn:", + "collapseItem:", + "content", + "dataSource", + "delegate", + "encodeWithCoder:", + "expandItem:", + "expandItem:expandChildren:", + "frameOfDataViewAtColumn:row:", + "frameOfOutlineDisclosureControlAtRow:", + "indentationMarkerFollowsDataView", + "indentationPerLevel", + "initWithCoder:", + "initWithFrame:", + "isExpandable:", + "isItemExpanded:", + "itemAtRow:", + "keyDown:", + "levelForItem:", + "levelForRow:", + "numberOfRowsInTableView:", + "outlineTableColumn", + "parentForItem:", + "reloadItem:", + "reloadItem:reloadChildren:", + "removeTableColumn:", + "rowForItem:", + "selectionIndexPaths", + "selectionShouldChangeInTableView:", + "setContent:", + "setDataSource:", + "setDelegate:", + "setDisclosureControlPrototype:", + "setDropItem:dropChildIndex:", + "setIndentationMarkerFollowsDataView:", + "setIndentationPerLevel:", + "setOutlineTableColumn:", + "setSelectionIndexPaths:", + "tableView:acceptDrop:row:dropOperation:", + "tableView:heightOfRow:", + "tableView:isGroupRow:", + "tableView:menuForTableColumn:row:", + "tableView:objectValueForTableColumn:row:", + "tableView:selectionIndexesForProposedSelection:", + "tableView:setObjectValue:forTableColumn:row:", + "tableView:shouldEditTableColumn:row:", + "tableView:shouldSelectRow:", + "tableView:shouldSelectTableColumn:", + "tableView:sortDescriptorsDidChange:", + "tableView:validateDrop:proposedRow:proposedDropOperation:", + "tableView:willDisplayView:forTableColumn:row:", + "tableView:willRemoveView:forTableColumn:row:", + "tableView:writeRowsWithIndexes:toPasteboard:" + ], + "CPPanel": [ + "becomesKeyOnlyIfNeeded", + "canBecomeKeyWindow", + "canBecomeMainWindow", + "cancel:", + "cancelOperation:", + "isFloatingPanel", + "setBecomesKeyOnlyIfNeeded:", + "setFloatingPanel:", + "setWorksWhenModal:", + "worksWhenModal" + ], + "CPParagraphStyle": [ + "alignment", + "baseWritingDirection", + "copy", + "defaultTabInterval", + "encodeWithCoder:", + "firstLineHeadIndent", + "headIndent", + "init", + "initWithCoder:", + "initWithParagraphStyle:", + "isEqual:", + "lineBreakMode", + "lineHeightMultiple", + "lineSpacing", + "maximumLineHeight", + "minimumLineHeight", + "mutableCopy", + "paragraphSpacing", + "paragraphSpacingBefore", + "tabStops", + "tailIndent", + "textLists" + ], + "CPPasteboard": [ + "addTypes:owner:", + "availableTypeFromArray:", + "changeCount", + "dataForType:", + "declareTypes:owner:", + "propertyListForType:", + "setData:forType:", + "setPropertyList:forType:", + "setString:forType:", + "stringForType:", + "types" + ], + "CPPlatform": [], + "CPPlatformPasteboard": [ + "beforeCopyEvent:", + "beforePasteEvent:", + "createDOMElements", + "destroyDOMElements", + "init", + "nativeBeforeClipboardEvent:", + "nativeCopyOrCutEvent:", + "nativePasteEvent:", + "setDOMWindow:", + "windowDidSendKeyEvent:", + "windowMaySendKeyEvent:", + "windowShouldNotStopPropagation", + "windowShouldStopPropagation", + "windowShouldSuppressKeyEvent" + ], + "CPPlatformString": [], + "CPPlatformWindow": [ + "blurEvent:", + "contentBounds", + "contentRect", + "contextMenuEvent:", + "convertBaseToScreen:", + "convertScreenToBase:", + "createDOMElements", + "deminiaturize:", + "dragEvent:", + "focusEvent:", + "hitTest:", + "init", + "initWithContentRect:", + "initWithWindow:", + "isVisible", + "keyEvent:", + "layerAtLevel:create:", + "miniaturize:", + "mouseEvent:", + "moveWindow:fromLevel:toLevel:", + "nativeContentRect", + "order:window:relativeTo:", + "orderBack:", + "orderFront:", + "orderOut:", + "orderedWindowsAtLevel:", + "registerDOMWindow", + "resizeEvent:", + "scrollEvent:", + "setContentRect:", + "setHasShadow:", + "setLevel:", + "setSelectedRange:inElement:", + "setShadowStyle:", + "supportsFullPlatformWindows", + "title", + "touchEvent:", + "updateFromNativeContentRect", + "updateNativeContentRect", + "usableContentFrame", + "visibleFrame" + ], + "CPPopUpButton": [ + "addItem:", + "addItemWithTitle:", + "addItemsWithTitles:", + "indexOfItem:", + "indexOfItemWithRepresentedObject:", + "indexOfItemWithTag:", + "indexOfItemWithTarget:action:", + "indexOfItemWithTitle:", + "indexOfSelectedItem", + "initWithCoder:", + "initWithFrame:", + "initWithFrame:pullsDown:", + "insertItemWithTitle:atIndex:", + "itemArray", + "itemAtIndex:", + "itemTitleAtIndex:", + "itemTitles", + "itemWithTitle:", + "lastItem", + "mouseDown:", + "numberOfItems", + "objectValue", + "observeValueForKeyPath:ofObject:change:context:", + "preferredEdge", + "pullsDown", + "removeAllItems", + "removeItemAtIndex:", + "removeItemWithTitle:", + "rightMouseDown:", + "selectItem:", + "selectItemAtIndex:", + "selectItemWithTag:", + "selectItemWithTitle:", + "selectedIndex", + "selectedItem", + "setImage:", + "setObjectValue:", + "setPreferredEdge:", + "setPullsDown:", + "setSelectedIndex:", + "setTitle:", + "synchronizeTitleAndSelectedItem", + "takeValueFromKeyPath:ofObjects:", + "titleOfSelectedItem" + ], + "CPPopover": [ + "animates", + "appearance", + "behavior", + "close", + "contentSize", + "contentViewController", + "delegate", + "encodeWithCoder:", + "init", + "initWithCoder:", + "isShown", + "performClose:", + "positioningRect", + "setAnimates:", + "setAppearance:", + "setBehavior:", + "setBehaviour:", + "setContentSize:", + "setContentViewController:", + "setDelegate:", + "setPositioningRect:", + "showRelativeToRect:ofView:preferredEdge:" + ], + "CPPredicate": [ + "description", + "evaluateWithObject:", + "evaluateWithObject:substitutionVariables:", + "predicateFormat", + "predicateWithSubstitutionVariables:" + ], + "CPPredicateEditor": [ + "action", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "objectValue", + "rowTemplates", + "setAction:", + "setObjectValue:", + "setRowTemplates:", + "setTarget:", + "target" + ], + "CPPredicateEditorRowTemplate": [ + "compoundTypes", + "copy", + "description", + "displayableSubpredicatesOfPredicate:", + "encodeWithCoder:", + "initWithCoder:", + "initWithCompoundTypes:", + "initWithLeftExpressions:rightExpressionAttributeType:modifier:operators:options:", + "initWithLeftExpressions:rightExpressions:modifier:operators:options:", + "leftAttributeType", + "leftExpressionAttributeType", + "leftExpressions", + "leftIsWildcard", + "matchForPredicate:", + "modifier", + "operators", + "options", + "predicateWithSubpredicates:", + "rightAttributeType", + "rightExpressionAttributeType", + "rightExpressions", + "rightIsWildcard", + "setLeftIsWildcard:", + "setPredicate:", + "setRightIsWildcard:", + "setTemplateViews:", + "templateViews" + ], + "CPPredicateEditorValueBinder": [ + "setPlaceholderValue:withMarker:forBinding:", + "setValue:forBinding:" + ], + "CPPredicateScanner": [ + "initWithString:args:", + "nextArg", + "parse", + "parseAdditionExpression", + "parseAnd", + "parseBinaryExpression", + "parseComparison", + "parseExpression", + "parseFunctionalExpression", + "parseMultiplicationExpression", + "parseNot", + "parseOr", + "parsePowerExpression", + "parsePredicate", + "parseSimpleExpression", + "scanPredicateKeyword:" + ], + "CPPredicateUtilities": [], + "CPPredicate_BOOL": [ + "evaluateWithObject:", + "evaluateWithObject:substitutionVariables:", + "initWithBool:", + "isEqual:", + "predicateFormat" + ], + "CPProgressIndicator": [ + "controlSize", + "controlTint", + "createEphemeralSubviewNamed:", + "doubleValue", + "drawBar", + "drawRect:", + "encodeWithCoder:", + "incrementBy:", + "initWithCoder:", + "initWithFrame:", + "isBezeled", + "isDisplayedWhenStopped", + "isIndeterminate", + "layoutSubviews", + "maxValue", + "minValue", + "rectForEphemeralSubviewNamed:", + "setBezeled:", + "setControlSize:", + "setControlTint:", + "setDisplayedWhenStopped:", + "setDoubleValue:", + "setFrameSize:", + "setIndeterminate:", + "setMaxValue:", + "setMinValue:", + "setStyle:", + "setUsesThreadedAnimation:", + "sizeToFit", + "startAnimation:", + "stopAnimation:", + "updateBackgroundColor", + "usesThreadedAnimation" + ], + "CPPropertyListSerialization": [], + "CPProxy": [ + "UID", + "class", + "description", + "forward::", + "forwardInvocation:", + "hash", + "isEqual:", + "isKindOfClass:", + "isMemberOfClass:", + "isProxy", + "methodSignatureForSelector:", + "performSelector:", + "performSelector:withObject:", + "performSelector:withObject:withObject:", + "respondsToSelector:", + "self", + "superclass" + ], + "CPRadio": [ + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "initWithFrame:radioGroup:", + "nextState", + "radioGroup", + "sendAction:to:", + "setAction:", + "setObjectValue:", + "setRadioGroup:", + "viewDidMoveToSuperview" + ], + "CPRadioGroup": [ + "action", + "enabled", + "encodeWithCoder:", + "hidden", + "init", + "initWithCoder:", + "radios", + "selectRadioAtIndex:", + "selectRadioWithTag:", + "selectedRadio", + "selectedRadioIndex", + "setAction:", + "setEnabled:", + "setHidden:", + "setTarget:", + "size", + "target" + ], + "CPResponder": [ + "acceptsFirstResponder", + "becomeFirstResponder", + "cursorUpdate:", + "doCommandBySelector:", + "encodeWithCoder:", + "flagsChanged:", + "initWithCoder:", + "insertBackTab:", + "insertLineBreak:", + "insertNewline:", + "insertTab:", + "insertText:", + "interpretKeyEvents:", + "keyDown:", + "keyUp:", + "menu", + "mouseDown:", + "mouseDragged:", + "mouseEntered:", + "mouseExited:", + "mouseMoved:", + "mouseUp:", + "nextResponder", + "noResponderFor:", + "performKeyEquivalent:", + "resignFirstResponder", + "rightMouseDown:", + "rightMouseUp:", + "scrollWheel:", + "setMenu:", + "setNextResponder:", + "tryToPerform:with:", + "undoManager" + ], + "CPRuleEditor": [ + "acceptsFirstResponder", + "addRow:", + "allowsEmptyCompoundRows", + "animation", + "animationDidEnd:", + "bind:toObject:withKeyPath:options:", + "boundArrayKeyPath", + "canRemoveAllRows", + "criteriaForRow:", + "criteriaKeyPath", + "delegate", + "displayValuesForRow:", + "displayValuesKeyPath", + "draggedView:endedAt:operation:", + "draggingEntered:", + "draggingExited:", + "draggingUpdated:", + "encodeWithCoder:", + "font", + "formattingDictionary", + "formattingStringsFilename", + "initWithCoder:", + "initWithFrame:", + "insertRowAtIndex:withType:asSubrowOfRow:animate:", + "isEditable", + "keyDown:", + "keyUp:", + "mouseDragged:", + "nestingMode", + "numberOfRows", + "observeValueForKeyPath:ofObject:change:context:", + "parentRowForRow:", + "pasteboard:provideDataForType:", + "performDragOperation:", + "predicate", + "predicateForRow:", + "prepareForDragOperation:", + "reloadCriteria", + "reloadPredicate", + "removeRowAtIndex:", + "removeRowsAtIndexes:includeSubrows:", + "rowClass", + "rowHeight", + "rowTypeForRow:", + "rowTypeKeyPath", + "selectAll:", + "selectRowIndexes:byExtendingSelection:", + "selectedRowIndexes", + "setAllowsEmptyCompoundRows:", + "setAnimation:", + "setBoundArrayKeyPath:", + "setCanRemoveAllRows:", + "setCriteria:andDisplayValues:forRowAtIndex:", + "setCriteriaKeyPath:", + "setDelegate:", + "setDisplayValuesKeyPath:", + "setEditable:", + "setFormattingDictionary:", + "setFormattingStringsFilename:", + "setFrameSize:", + "setNeedsDisplay:", + "setNestingMode:", + "setRowClass:", + "setRowHeight:", + "setRowTypeKeyPath:", + "setStandardLocalizer:", + "setSubrowsKeyPath:", + "standardLocalizer", + "subrowIndexesForRow:", + "subrowsKeyPath", + "unbind:", + "wantsPeriodicDraggingUpdates" + ], + "CPRulerMarker": [ + "drawRect:", + "encodeWithCoder:", + "image", + "imageOrigin", + "imageRectInRuler", + "initWithCoder:", + "initWithRulerView:markerLocation:image:imageOrigin:", + "isDragging", + "isMovable", + "isRemovable", + "markerLocation", + "representedObject", + "ruler", + "setImage:", + "setImageOrigin:", + "setMarkerLocation:", + "setMovable:", + "setRemovable:", + "setRepresentedObject:", + "thicknessRequiredInRuler", + "trackMouse:adding:" + ], + "CPRulerView": [ + "accessoryView", + "addMarker:", + "baselineLocation", + "clientView", + "drawHashMarksAndLabelsInRect:", + "drawMarkersInRect:", + "drawRect:", + "encodeWithCoder:", + "initWithCoder:", + "initWithScrollView:orientation:", + "invalidateHashMarks", + "isFlipped", + "markers", + "measurementUnits", + "menuForEvent:", + "mouseDown:", + "moveRulerlineFromLocation:toLocation:", + "orientation", + "originOffset", + "removeMarker:", + "requiredThickness", + "reservedThicknessForAccessoryView", + "reservedThicknessForMarkers", + "ruleThickness", + "scrollView", + "setAccessoryView:", + "setClientView:", + "setMarkers:", + "setMeasurementUnits:", + "setOrientation:", + "setOriginOffset:", + "setReservedThicknessForAccessoryView:", + "setReservedThicknessForMarkers:", + "setRuleThickness:", + "setScrollView:", + "trackMarker:withMouseEvent:" + ], + "CPRunLoop": [ + "addTimer:forMode:", + "cancelPerformSelector:target:argument:", + "init", + "invalidateTimerWithDelayedPerform:", + "limitDateForMode:", + "performBlock:argument:order:modes:", + "performSelector:target:argument:order:modes:", + "performSelectors" + ], + "CPSavePanel": [ + "URL", + "allowedFileTypes", + "allowsOtherFileTypes", + "canCreateDirectories", + "canSelectHiddenExtension", + "init", + "isExtensionHidden", + "runModal", + "setAllowedFileTypes:", + "setAllowsOtherFileTypes:", + "setCanCreateDirectories:", + "setCanSelectHiddenExtension:", + "setExtensionHidden:" + ], + "CPScanner": [ + "caseSensitive", + "charactersToBeSkipped", + "copy", + "description", + "initWithString:", + "isAtEnd", + "locale", + "scanCharactersFromSet:", + "scanCharactersFromSet:intoString:", + "scanDouble:", + "scanFloat", + "scanFloat:", + "scanInt", + "scanInt:", + "scanLocation", + "scanString:", + "scanString:intoString:", + "scanUpToCharactersFromSet:", + "scanUpToCharactersFromSet:intoString:", + "scanUpToString:", + "scanUpToString:intoString:", + "scanWithParseFunction:", + "setCaseSensitive:", + "setCharactersToBeSkipped:", + "setLocale:", + "setScanLocation:", + "string" + ], + "CPScreen": [ + "visibleFrame" + ], + "CPScrollView": [ + "allowsMagnification", + "autohidesScrollers", + "awakeFromCib", + "borderType", + "bottomCornerView", + "contentSize", + "contentView", + "delegate", + "documentView", + "documentVisibleRect", + "drawRect:", + "encodeWithCoder:", + "flashScrollers", + "hasHorizontalRuler", + "hasHorizontalScroller", + "hasVerticalRuler", + "hasVerticalScroller", + "horizontalLineScroll", + "horizontalPageScroll", + "horizontalRulerView", + "horizontalScroller", + "initWithCoder:", + "initWithFrame:", + "lineScroll", + "magnification", + "maxMagnification", + "minMagnification", + "moveByOffset:", + "moveDown:", + "moveLeft:", + "moveRight:", + "moveUp:", + "pageScroll", + "reflectScrolledClipView:", + "resizeSubviewsWithOldSize:", + "rulersVisible", + "scrollPageDown:", + "scrollPageUp:", + "scrollToBeginningOfDocument:", + "scrollToEndOfDocument:", + "scrollWheel:", + "scrollerKnobStyle", + "scrollerStyle", + "setAllowsMagnification:", + "setAutohidesScrollers:", + "setBorderType:", + "setBottomCornerView:", + "setContentView:", + "setDelegate:", + "setDocumentView:", + "setHasHorizontalRuler:", + "setHasHorizontalScroller:", + "setHasVerticalRuler:", + "setHasVerticalScroller:", + "setHorizontalLineScroll:", + "setHorizontalPageScroll:", + "setHorizontalRulerView:", + "setHorizontalScroller:", + "setLineScroll:", + "setMagnification:", + "setMagnification:centeredAtPoint:", + "setMaxMagnification:", + "setMinMagnification:", + "setPageScroll:", + "setRulersVisible:", + "setScrollerKnobStyle:", + "setScrollerStyle:", + "setVerticalLineScroll:", + "setVerticalPageScroll:", + "setVerticalRulerView:", + "setVerticalScroller:", + "tile", + "verticalLineScroll", + "verticalPageScroll", + "verticalRulerView", + "verticalScroller", + "viewWillMoveToWindow:" + ], + "CPScroller": [ + "allowFadingOut", + "animationDidEnd:", + "checkSpaceForParts", + "createEphemeralSubviewNamed:", + "createViewForPart:", + "currentValueForThemeAttribute:", + "drawArrow:highlight:", + "drawKnob", + "drawKnobSlot", + "drawParts", + "encodeWithCoder:", + "fadeIn", + "fadeOut", + "hitPart", + "initWithCoder:", + "initWithFrame:", + "isVertical", + "knobProportion", + "layoutSubviews", + "mouseDown:", + "mouseEntered:", + "mouseExited:", + "rectForEphemeralSubviewNamed:", + "rectForPart:", + "scrollerWidth", + "setFloatValue:knobProportion:", + "setFrameSize:", + "setKnobProportion:", + "setObjectValue:", + "setStyle:", + "style", + "testPart:", + "trackKnob:", + "trackScrollButtons:", + "usableParts" + ], + "CPSearchField": [ + "cancelButton", + "cancelButtonRectForBounds:", + "cancelOperation:", + "contentRectForBounds:", + "cursorUpdate:", + "defaultSearchMenuTemplate", + "encodeWithCoder:", + "hitTest:", + "initWithCoder:", + "initWithFrame:", + "isOpaque", + "layoutSubviews", + "maximumRecents", + "menu", + "menuDidClose:", + "menuWillOpen:", + "mouseDown:", + "recentSearches", + "recentsAutosaveName", + "resetCancelButton", + "resetSearchButton", + "resignFirstResponder", + "searchButton", + "searchButtonRectForBounds:", + "searchMenuTemplate", + "searchTextRectForBounds:", + "sendAction:to:", + "sendsSearchStringImmediately", + "sendsWholeSearchString", + "setCancelButton:", + "setFrameSize:", + "setMaximumRecents:", + "setPlaceholderString:", + "setRecentSearches:", + "setRecentsAutosaveName:", + "setSearchButton:", + "setSearchMenuTemplate:", + "setSendsSearchStringImmediately:", + "setSendsWholeSearchString:", + "textDidEndEditing:", + "themedLayoutFunctionCompletionHandler", + "unbind:", + "updateSearchButton", + "updateTrackingAreas" + ], + "CPSecureTextField": [ + "isSecure" + ], + "CPSegmentedControl": [ + "bezelFrameForSegment:", + "bind:toObject:withKeyPath:options:", + "contentFrameForSegment:", + "createEphemeralSubviewNamed:", + "drawSegment:highlight:", + "drawSegmentBezel:highlight:", + "encodeWithCoder:", + "frameForSegment:", + "imageForSegment:", + "initWithCoder:", + "initWithFrame:", + "insertSegments:atIndexes:", + "isEnabledForSegment:", + "isSelectedForSegment:", + "isTracking", + "labelForSegment:", + "layoutSubviews", + "menuForSegment:", + "mouseDown:", + "mouseUp:", + "rectForEphemeralSubviewNamed:", + "removeSegmentsAtIndexes:", + "segmentCount", + "segments", + "selectSegmentWithTag:", + "selectedSegment", + "selectedTag", + "setControlSize:", + "setEnabled:forSegment:", + "setFont:", + "setImage:forSegment:", + "setLabel:forSegment:", + "setMenu:forSegment:", + "setSegmentCount:", + "setSegments:", + "setSelected:forSegment:", + "setSelectedSegment:", + "setTag:forSegment:", + "setTrackingMode:", + "setWidth:forSegment:", + "tagForSegment:", + "testSegment:", + "tile", + "tileWithChangedSegment:", + "trackSegment:", + "trackingMode", + "widthForSegment:" + ], + "CPSet": [ + "allObjects", + "anyObject", + "containsObject:", + "copy", + "count", + "description", + "encodeWithCoder:", + "enumerateObjectsUsingBlock:", + "filterUsingPredicate:", + "filteredSetUsingPredicate:", + "filteredSetUsingPredicate:", + "init", + "initWithArray:", + "initWithCoder:", + "initWithObjects:", + "initWithObjects:count:", + "initWithSet:", + "initWithSet:copyItems:", + "intersectsSet:", + "isEqual:", + "isEqualToSet:", + "isSubsetOfSet:", + "makeObjectsPerformSelector:", + "makeObjectsPerformSelector:withObject:", + "makeObjectsPerformSelector:withObjects:", + "member:", + "mutableCopy", + "objectEnumerator", + "objectsPassingTest:", + "setByAddingObject:", + "setByAddingObjectsFromArray:", + "setByAddingObjectsFromSet:", + "setValue:forKey:", + "sortedArrayUsingDescriptors:", + "valueForKey:", + "valueForKeyPath:" + ], + "CPShadow": [ + "cssString", + "set", + "setShadowBlurRadius:", + "setShadowColor:", + "setShadowOffset:", + "shadowBlurRadius", + "shadowColor", + "shadowOffset" + ], + "CPShadowView": [ + "bottomInset", + "frameForContentFrame:", + "horizontalInset", + "initWithFrame:", + "layoutSubviews", + "leftInset", + "rightInset", + "setFrameForContentFrame:", + "setWeight:", + "topInset", + "verticalInset" + ], + "CPSimpleTypesetter": [ + "currentTextContainer", + "layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:nextGlyphIndex:", + "layoutManager", + "setCurrentTextContainer:", + "setLayoutManager:", + "textContainers", + "textTabForWidth:writingDirection:" + ], + "CPSlider": [ + "allowsTickMarkValuesOnly", + "altIncrementValue", + "closestTickMarkValueToValue:", + "continueTracking:at:", + "createEphemeralSubviewNamed:", + "drawRect:", + "encodeWithCoder:", + "indexOfTickMarkAtPoint:", + "initWithCoder:", + "initWithFrame:", + "isContinuous", + "isVertical", + "knobRectForBounds:", + "knobThickness", + "layoutSubviews", + "leftTrackRectForBounds:", + "maxValue", + "minValue", + "numberOfTickMarks", + "rectForEphemeralSubviewNamed:", + "rectOfTickMarkAtIndex:", + "rightTrackRectForBounds:", + "setAllowsTickMarkValuesOnly:", + "setAllowsTickMarkValuesOnly:", + "setAltIncrementValue:", + "setContinuous:", + "setFrameSize:", + "setMaxValue:", + "setMinValue:", + "setNumberOfTickMarks:", + "setNumberOfTickMarks:", + "setObjectValue:", + "setSliderType:", + "setSliderType:", + "setTickMarkPosition:", + "setTickMarkPosition:", + "setTrackFillColor:", + "setValue:", + "sliderType", + "sliderType", + "startTrackingAt:", + "stopTracking:at:mouseIsUp:", + "takeValueFromKeyPath:ofObjects:", + "tickMarkPosition", + "tickMarkValueAtIndex:", + "trackFillColor", + "trackRectForBounds:", + "tracksMouseOutsideOfFrame", + "value" + ], + "CPSliderColorPicker": [ + "controlTextDidEndEditing:", + "currentMode", + "initView", + "initWithPickerMask:colorPanel:", + "provideNewAlternateButtonImage", + "provideNewButtonImage", + "provideNewView:", + "setColor:", + "sliderChanged:", + "supportsMode:", + "updateHSBSliders:", + "updateHex:", + "updateLabels", + "updateRGBSliders:" + ], + "CPSortDescriptor": [ + "ascending", + "compareObject:withObject:", + "description", + "encodeWithCoder:", + "initWithCoder:", + "initWithKey:ascending:", + "initWithKey:ascending:selector:", + "key", + "reversedSortDescriptor", + "selector" + ], + "CPSound": [ + "delegate", + "duration", + "init", + "initWithContentsOfFile:byReference:", + "initWithContentsOfURL:byReference:", + "initWithData:", + "isPlaying", + "loops", + "name", + "pause", + "play", + "resume", + "setDelegate:", + "setDelegate:", + "setLoops:", + "setName:", + "setVolume:", + "stop", + "volume" + ], + "CPSplitView": [ + "addArrangedSubview:", + "addSubview:", + "adjustSubviews", + "arrangedSubviews", + "arrangesAllSubviews", + "attachButtonBar:", + "autosaveName", + "cursorAtPoint:hitDividerAtIndex:", + "cursorUpdate:", + "delegate", + "dividerColor", + "dividerStyle", + "dividerThickness", + "drawDividerInRect:", + "effectiveRectOfDividerAtIndex:", + "encodeWithCoder:", + "hitTest:", + "initWithCoder:", + "initWithFrame:", + "insertArrangedSubview:atIndex:", + "isPaneSplitter", + "isSubviewCollapsed:", + "isVertical", + "layoutSubviews", + "maxPossiblePositionOfDividerAtIndex:", + "minPossiblePositionOfDividerAtIndex:", + "mouseDown:", + "rectOfDividerAtIndex:", + "removeArrangedSubview:", + "replaceSubview:with:", + "resizeSubviewsWithOldSize:", + "setArrangesAllSubviews:", + "setAutosaveName:", + "setButtonBar:forDividerAtIndex:", + "setDelegate:", + "setDividerStyle:", + "setFrameSize:", + "setIsPaneSplitter:", + "setPosition:ofDividerAtIndex:", + "setVertical:", + "trackDivider:", + "updateTrackingAreas", + "viewDidMoveToWindow", + "willRemoveSubview:" + ], + "CPStackView": [ + "addArrangedSubview:", + "addView:inGravity:", + "alignment", + "arrangedSubviews", + "customSpacingAfterView:", + "detachesHiddenViews", + "distribution", + "edgeInsets", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "insertView:atIndex:inGravity:", + "layoutSubviews", + "orientation", + "removeArrangedSubview:", + "removeView:", + "resizeSubviewsWithOldSize:", + "setAlignment:", + "setCustomSpacing:afterView:", + "setDetachesHiddenViews:", + "setDistribution:", + "setEdgeInsets:", + "setOrientation:", + "setSpacing:", + "setViews:inGravity:", + "setVisibilityPriority:forView:", + "spacing", + "viewsInGravity:", + "visibilityPriorityForView:" + ], + "CPStepper": [ + "autorepeat", + "encodeWithCoder:", + "increment", + "initWithCoder:", + "initWithFrame:", + "layoutSubviews", + "maxValue", + "minValue", + "performClickDown:", + "performClickUp:", + "setAutorepeat:", + "setControlSize:", + "setDoubleValue:", + "setEnabled:", + "setFrame:", + "setIncrement:", + "setMaxValue:", + "setMinValue:", + "setValueWraps:", + "valueWraps" + ], + "CPString": [ + "UID", + "boolValue", + "capitalizedString", + "caseInsensitiveCompare:", + "characterAtIndex:", + "commonPrefixWithString:", + "commonPrefixWithString:options:", + "compare:", + "compare:options:", + "compare:options:range:", + "componentsSeparatedByCharactersInSet:", + "componentsSeparatedByString:", + "containsString:", + "cssString", + "description", + "doubleValue", + "floatValue", + "hasPrefix:", + "hasSuffix:", + "initWithFormat:", + "initWithString:", + "intValue", + "integerValue", + "isEqual:", + "isEqualToString:", + "lastPathComponent", + "length", + "lowercaseString", + "objectFromJSON", + "pathComponents", + "pathExtension", + "rangeOfString:", + "rangeOfString:options:", + "rangeOfString:options:range:", + "sizeWithFont:", + "sizeWithFont:inWidth:", + "string", + "stringByAppendingFormat:", + "stringByAppendingPathComponent:", + "stringByAppendingPathExtension:", + "stringByAppendingString:", + "stringByDeletingLastPathComponent", + "stringByDeletingPathExtension", + "stringByEscapingRegexControlCharacters", + "stringByPaddingToLength:withString:startingAtIndex:", + "stringByReplacingCharactersInRange:withString:", + "stringByReplacingOccurrencesOfString:withString:", + "stringByReplacingOccurrencesOfString:withString:options:range:", + "stringByStandardizingPath", + "stringByTrimmingCharactersInSet:", + "stringByTrimmingWhitespace", + "stripDiacritics", + "substringFromIndex:", + "substringToIndex:", + "substringWithRange:", + "uppercaseString" + ], + "CPTabView": [ + "acceptsFirstMouse:", + "addTabViewItem:", + "awakeFromCib", + "backgroundColor", + "binderForBinding:", + "delegate", + "encodeWithCoder:", + "font", + "indexOfTabViewItem:", + "indexOfTabViewItemWithIdentifier:", + "initWithCoder:", + "initWithFrame:", + "insertTabViewItem:atIndex:", + "items", + "layoutSubviews", + "mouseDown:", + "numberOfTabViewItems", + "removeTabViewItem:", + "selectFirstTabViewItem:", + "selectLastTabViewItem:", + "selectNextTabViewItem:", + "selectPreviousTabViewItem:", + "selectTabViewItem:", + "selectTabViewItemAtIndex:", + "selectedTabViewItem", + "setBackgroundColor:", + "setDelegate:", + "setFont:", + "setItems:", + "setTabViewType:", + "tabViewItemAtIndex:", + "tabViewItems", + "tabViewType", + "tileWithChangedItem:" + ], + "CPTabViewItem": [ + "auxiliaryView", + "enabled", + "encodeWithCoder:", + "frame", + "identifier", + "image", + "image", + "init", + "initWithCoder:", + "initWithIdentifier:", + "label", + "selected", + "setAuxiliaryView:", + "setEnabled:", + "setFrame:", + "setIdentifier:", + "setImage:", + "setImage:", + "setLabel:", + "setSelected:", + "setTag:", + "setView:", + "setViewController:", + "setWidth:", + "tabState", + "tabView", + "tag", + "view", + "viewController", + "width" + ], + "CPTableCellView": [ + "awakeFromCib", + "description", + "imageView", + "objectValue", + "recursivelyPerformSelector:withObject:startingFrom:", + "setImageView:", + "setObjectValue:", + "setTextField:", + "setThemeState:", + "textField", + "unsetThemeState:" + ], + "CPTableColumn": [ + "bind:toObject:withKeyPath:options:", + "dataCell", + "dataCellForRow:", + "dataView", + "dataViewForRow:", + "description", + "disableResizingPosting", + "encodeWithCoder:", + "headerCell", + "headerToolTip", + "headerView", + "identifier", + "init", + "initWithCoder:", + "initWithIdentifier:", + "isEditable", + "isHidden", + "maxWidth", + "minWidth", + "resizingMask", + "setDataCell:", + "setDataView:", + "setDisableResizingPosting:", + "setEditable:", + "setHeaderCell:", + "setHeaderToolTip:", + "setHeaderView:", + "setHidden:", + "setIdentifier:", + "setMaxWidth:", + "setMinWidth:", + "setResizingMask:", + "setSortDescriptorPrototype:", + "setTableView:", + "setWidth:", + "sizeToFit", + "sortDescriptorPrototype", + "tableView", + "width" + ], + "CPTableColumnValueBinder": [ + "createsSortDescriptor", + "setValueFor:" + ], + "CPTableContentBinder": [ + "content", + "setContent:", + "setValueFor:" + ], + "CPTableHeaderView": [ + "columnAtPoint:", + "cursorUpdate:", + "draggedColumn", + "draggedDistance", + "encodeWithCoder:", + "headerRectOfColumn:", + "initWithCoder:", + "initWithFrame:", + "isDragging", + "layoutSubviews", + "mouseDown:", + "mouseDragged:", + "mouseUp:", + "resizedColumn", + "setTableView:", + "tableView", + "updateTrackingAreas", + "viewDidMoveToWindow" + ], + "CPTableView": [ + "acceptsFirstResponder", + "addTableColumn:", + "allowsColumnReordering", + "allowsColumnResizing", + "allowsColumnSelection", + "allowsEmptySelection", + "allowsMultipleSelection", + "alternatingRowBackgroundColors", + "autosaveName", + "autosaveTableColumns", + "becomeKeyWindow", + "bind:toObject:withKeyPath:options:", + "canDragRowsWithIndexes:atPoint:", + "clickedColumn", + "clickedRow", + "columnAtPoint:", + "columnAutoresizingStyle", + "columnForView:", + "columnIndexesInRect:", + "columnWithIdentifier:", + "concludeDragOperation:", + "continueTracking:at:", + "cornerView", + "dataSource", + "delegate", + "deselectAll", + "deselectAll:", + "deselectColumn:", + "deselectRow:", + "disableAutomaticResizing", + "doubleAction", + "doubleClickArgument", + "doubleClickTarget", + "dragImageForRowsWithIndexes:tableColumns:event:offset:", + "dragViewForRowsWithIndexes:tableColumns:event:offset:", + "draggedImage:endedAt:operation:", + "draggedView:endedAt:operation:", + "draggingDestinationFeedbackStyle", + "draggingEnded:", + "draggingEntered:", + "draggingExited:", + "draggingUpdated:", + "drawBackgroundInClipRect:", + "drawGridInClipRect:", + "drawRow:clipRect:", + "editColumn:row:withEvent:select:", + "editedColumn", + "editedRow", + "encodeWithCoder:", + "enumerateAvailableViewsUsingBlock:", + "exposedRect", + "frameOfDataViewAtColumn:row:", + "getColumn:row:forView:", + "gridColor", + "gridStyleMask", + "headerView", + "highlightSelectionInClipRect:", + "highlightedTableColumn", + "hitTest:", + "initWithCoder:", + "initWithFrame:", + "intercellSpacing", + "isColumnSelected:", + "isRowSelected:", + "keyDown:", + "layoutSubviews", + "load", + "makeViewWithIdentifier:owner:", + "menuForEvent:", + "moveColumn:toColumn:", + "needsPanelToBecomeKey", + "noteHeightOfRowsWithIndexesChanged:", + "noteNumberOfRowsChanged", + "numberOfColumns", + "numberOfRows", + "numberOfSelectedColumns", + "numberOfSelectedRows", + "observeValueForKeyPath:ofObject:change:context:", + "performDragOperation:", + "prepareForDragOperation:", + "preparedViewAtColumn:row:", + "rectOfColumn:", + "rectOfRow:", + "reloadData", + "reloadDataForRowIndexes:columnIndexes:", + "removeTableColumn:", + "resignKeyWindow", + "resizeWithOldSuperviewSize:", + "rowAtPoint:", + "rowForView:", + "rowHeight", + "rowsInRect:", + "scrollColumnToVisible:", + "scrollRowToVisible:", + "selectAll:", + "selectColumnIndexes:byExtendingSelection:", + "selectRowIndexes:byExtendingSelection:", + "selectedColumn", + "selectedColumnIndexes", + "selectedRow", + "selectedRowIndexes", + "selectionGradientColors", + "selectionHighlightColor", + "selectionHighlightStyle", + "setAllowsColumnReordering:", + "setAllowsColumnResizing:", + "setAllowsColumnSelection:", + "setAllowsEmptySelection:", + "setAllowsMultipleSelection:", + "setAlternatingRowBackgroundColors:", + "setAutosaveName:", + "setAutosaveTableColumns:", + "setBoundsOrigin:", + "setBoundsSize:", + "setColumnAutoresizingStyle:", + "setCornerView:", + "setDataSource:", + "setDelegate:", + "setDisableAutomaticResizing:", + "setDoubleAction:", + "setDoubleClickArgument:", + "setDoubleClickTarget:", + "setDraggingDestinationFeedbackStyle:", + "setDraggingSourceOperationMask:forLocal:", + "setDropRow:dropOperation:", + "setFrameOrigin:", + "setFrameSize:", + "setGridColor:", + "setGridStyleMask:", + "setHeaderView:", + "setHighlightedTableColumn:", + "setIndicatorImage:inTableColumn:", + "setIntercellSpacing:", + "setNeedsDisplay:", + "setNeedsLayout", + "setRowHeight:", + "setSelectionGradientColors:", + "setSelectionHighlightColor:", + "setSelectionHighlightStyle:", + "setSortDescriptors:", + "setUsesAlternatingRowBackgroundColors:", + "setVerticalMotionCanBeginDrag:", + "sizeLastColumnToFit", + "sortDescriptors", + "startTrackingAt:", + "stopTracking:at:mouseIsUp:", + "superviewBoundsChanged:", + "superviewFrameChanged:", + "tableColumnWithIdentifier:", + "tableColumns", + "tile", + "trackMouse:", + "tracksMouseOutsideOfFrame", + "unfocusedSelectionGradientColors", + "unfocusedSelectionHighlightColor", + "usesAlternatingRowBackgroundColors", + "verticalMotionCanBeginDrag", + "viewAtColumn:row:makeIfNecessary:", + "viewWillMoveToSuperview:", + "viewWillMoveToWindow:", + "wantsPeriodicDraggingUpdates" + ], + "CPText": [ + "changeFont:", + "copy:", + "copyFont:", + "delete:", + "encodeWithCoder:", + "font:", + "initWithCoder:", + "isEditable", + "isHorizontallyResizable", + "isRichText", + "isRulerVisible", + "isSelectable", + "isVerticallyResizable", + "maxSize", + "minSize", + "paste:", + "pasteFont:", + "replaceCharactersInRange:withString:", + "scrollRangeToVisible:", + "selectedAll:", + "selectedRange", + "setEditable:", + "setEditable:", + "setFont:", + "setFont:range:", + "setHorizontallyResizable:", + "setMaxSize:", + "setMinSize:", + "setRichText:", + "setSelectable:", + "setSelectable:", + "setString:", + "setUsesFontPanel:", + "setVerticallyResizable:", + "string", + "underline:", + "usesFontPanel" + ], + "CPTextAttachment": [ + "bounds", + "contents", + "encodeWithCoder:", + "fileType", + "image", + "init", + "initWithCoder:", + "initWithData:ofType:", + "setBounds:", + "setContents:", + "setFileType:", + "setImage:" + ], + "CPTextContainer": [ + "containerSize", + "containsPoint:", + "encodeWithCoder:", + "heightTracksTextView", + "init", + "initWithCoder:", + "initWithContainerSize:", + "isSimpleRectangularTextContainer", + "layoutManager", + "lineFragmentPadding", + "lineFragmentRectForProposedRect:sweepDirection:movementDirection:remainingRect:", + "setContainerSize:", + "setContainerSize:", + "setHeightTracksTextView:", + "setLayoutManager:", + "setLineFragmentPadding:", + "setTextView:", + "setTextView:", + "setWidthTracksTextView:", + "textView", + "textViewFrameChanged:", + "widthTracksTextView" + ], + "CPTextField": [ + "acceptsFirstMouse:", + "acceptsFirstResponder", + "backgroundColor", + "becomeFirstResponder", + "bezelRectForBounds:", + "bezelStyle", + "contentRectForBounds:", + "copy:", + "createEphemeralSubviewNamed:", + "cursorUpdate:", + "cut:", + "delegate", + "delete:", + "deleteBackward:", + "deleteForward:", + "doCommandBySelector:", + "drawsBackground", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "insertNewline:", + "insertNewlineIgnoringFieldEditor:", + "insertTabIgnoringFieldEditor:", + "isBezeled", + "isBordered", + "isEditable", + "isSecure", + "isSelectable", + "keyDown:", + "keyUp:", + "layoutSubviews", + "mouseDown:", + "mouseDragged:", + "mouseUp:", + "needsPanelToBecomeKey", + "objectValue", + "paste:", + "placeholderString", + "rectForEphemeralSubviewNamed:", + "resignFirstResponder", + "rightMouseDown:", + "selectAll:", + "selectText:", + "selectedRange", + "setBackgroundColor:", + "setBezelStyle:", + "setBezeled:", + "setBordered:", + "setControlSize:", + "setDelegate:", + "setDrawsBackground:", + "setEditable:", + "setEnabled:", + "setFont:", + "setObjectValue:", + "setPlaceholderString:", + "setSecure:", + "setSelectable:", + "setSelectedRange:", + "setTextColor:", + "setTextFieldBackgroundColor:", + "setValue:forThemeAttribute:", + "sizeToFit", + "takeValueFromKeyPath:ofObjects:", + "textDidBeginEditing:", + "textDidBlur:", + "textDidChange:", + "textDidEndEditing:", + "textDidFocus:", + "textFieldBackgroundColor", + "updateTrackingAreas", + "validateUserInterfaceItem:", + "viewDidHide", + "viewDidUnhide" + ], + "CPTextList": [ + "description", + "encodeWithCoder:", + "initWithCoder:", + "initWithMarkerFormat:options:", + "initWithMarkerFormat:options:startingItemNumber:", + "isOrdered", + "listOptions", + "markerForItemNumber:", + "markerFormat", + "setStartingItemNumber:", + "startingItemNumber" + ], + "CPTextStorage": [ + "addAttributes:range:", + "addLayoutManager:", + "attributedSubstringFromRange:", + "beginEditing", + "changeInLength", + "delegate", + "deleteCharactersInRange:", + "edited:range:changeInLength:", + "editedMask", + "editedRange", + "endEditing", + "font", + "foregroundColor", + "init", + "initWithString:", + "initWithString:attributes:", + "invalidateAttributesInRange:", + "layoutManagers", + "processEditing", + "removeAttribute:range:", + "removeLayoutManager:", + "replaceCharactersInRange:withAttributedString:", + "replaceCharactersInRange:withString:", + "setChangeInLength:", + "setDelegate:", + "setDelegate:", + "setEditedMask:", + "setFont:", + "setForegroundColor:" + ], + "CPTextTab": [ + "alignment", + "copy", + "encodeWithCoder:", + "initWithCoder:", + "initWithTextAlignment:location:options:", + "initWithType:location:", + "isEqual:", + "location", + "options", + "tabStopType" + ], + "CPTextView": [ + "acceptsFirstMouse:", + "acceptsFirstResponder", + "alignCenter:", + "alignJustified:", + "alignLeft:", + "alignRight:", + "allowsUndo", + "becomeFirstResponder", + "becomeKeyWindow", + "bold:", + "cancelOperation:", + "changeColor:", + "changeFont:", + "changeTextList:", + "copy:", + "copyFont:", + "copyRuler:", + "cut:", + "delegate", + "delete:", + "deleteBackward:", + "deleteBackward:handleSmart:", + "deleteForward:", + "deleteToBeginningOfLine:", + "deleteToBeginningOfParagraph:", + "deleteToEndOfLine:", + "deleteToEndOfParagraph:", + "deleteWordBackward:", + "deleteWordForward:", + "didChangeText", + "displayRectIgnoringOpacity:inContext:", + "doCommandBySelector:", + "draggingUpdated:", + "drawInsertionPointInRect:color:turnedOn:", + "drawRect:", + "encodeWithCoder:", + "exposedRect", + "font", + "initWithCoder:", + "initWithFrame:", + "initWithFrame:textContainer:", + "insertBacktab:", + "insertImage:", + "insertLineBreak:", + "insertNewline:", + "insertNewlineIgnoringFieldEditor:", + "insertTab:", + "insertTabIgnoringFieldEditor:", + "insertText:", + "insertionPointColor", + "invalidateTextContainerOrigin", + "isEditable", + "isHorizontallyResizable", + "isRulerVisible", + "isSelectable", + "isVerticallyResizable", + "italic:", + "keyDown:", + "keyUp:", + "layoutManager", + "lowerBaseline:", + "maxSize", + "menuForEvent:", + "minSize", + "mouseDown:", + "mouseDragged:", + "mouseUp:", + "moveBackward:", + "moveBackwardAndModifySelection:", + "moveDown:", + "moveDownAndModifySelection:", + "moveLeft:", + "moveLeftAndModifySelection:", + "moveParagraphBackward:", + "moveParagraphBackwardAndModifySelection:", + "moveParagraphForward:", + "moveParagraphForwardAndModifySelection:", + "moveRight:", + "moveRightAndModifySelection:", + "moveToBeginningOfDocument:", + "moveToBeginningOfDocumentAndModifySelection:", + "moveToBeginningOfParagraph:", + "moveToBeginningOfParagraphAndModifySelection:", + "moveToEndOfDocument:", + "moveToEndOfDocumentAndModifySelection:", + "moveToEndOfParagraph:", + "moveToEndOfParagraphAndModifySelection:", + "moveToLeftEndOfLine:", + "moveToLeftEndOfLine:byExtending:", + "moveToLeftEndOfLineAndModifySelection:", + "moveToRightEndOfLine:", + "moveToRightEndOfLine:byExtending:", + "moveToRightEndOfLineAndModifySelection:", + "moveUp:", + "moveUpAndModifySelection:", + "moveWordBackward:", + "moveWordBackwardAndModifySelection:", + "moveWordForward:", + "moveWordForwardAndModifySelection:", + "moveWordLeft:", + "moveWordLeftAndModifySelection:", + "moveWordRight:", + "moveWordRightAndModifySelection:", + "needsPanelToBecomeKey", + "objectValue", + "paste:", + "pasteAsPlainText:", + "pasteFont:", + "pasteRuler:", + "performDragOperation:", + "raiseBaseline:", + "redo:", + "replaceCharactersInRange:withString:", + "resignFirstResponder", + "resignKeyWindow", + "respondsToSelector:", + "rulerView:didAddMarker:", + "rulerView:didMoveMarker:", + "rulerView:didRemoveMarker:", + "rulerView:handleMouseDown:", + "rulerView:shouldAddMarker:", + "rulerView:shouldMoveMarker:", + "rulerView:shouldRemoveMarker:", + "rulerView:willAddMarker:atLocation:", + "rulerView:willMoveMarker:toLocation:", + "scrollRangeToVisible:", + "selectAll:", + "selectedRange", + "selectedRanges", + "selectedTextAttributes", + "selectionAffinity", + "selectionGranularity", + "selectionRangeForProposedRange:granularity:", + "setAllowsUndo:", + "setBoundsSize:", + "setConstrainedFrameSize:", + "setDelegate:", + "setDelegate:", + "setFont:", + "setFont:range:", + "setFrameSize:", + "setHorizontallyResizable:", + "setInsertionPointColor:", + "setMaxSize:", + "setMinSize:", + "setObjectValue:", + "setRulerVisible:", + "setSelectedRange:", + "setSelectedRange:affinity:stillSelecting:", + "setSelectedTextAttributes:", + "setSelectionGranularity:", + "setString:", + "setTextColor:", + "setTextColor:", + "setTextColor:range:", + "setTextContainer:", + "setTextContainer:", + "setTextContainerInset:", + "setTextContainerInset:", + "setTextList:", + "setTypingAttributes:", + "setTypingAttributes:", + "setUsesFontPanel:", + "setUsesRuler:", + "setVerticallyResizable:", + "shouldChangeTextInRange:replacementString:", + "shouldDrawInsertionPoint", + "sizeToFit", + "string", + "stringValue", + "subscript:", + "superscript:", + "superviewBoundsChanged:", + "superviewFrameChanged:", + "textColor", + "textContainer", + "textContainerInset", + "textContainerOrigin", + "textStorage", + "toggleRuler:", + "typingAttributes", + "underline:", + "undo:", + "unscript:", + "updateInsertionPointStateAndRestartTimer:", + "updateRuler", + "usesFontPanel", + "usesRuler", + "validateUserInterfaceItem:", + "viewWillMoveToSuperview:" + ], + "CPTheme": [ + "applyDynamicSet:", + "attributeNamesForClass:", + "attributeWithName:forClass:", + "attributesForClass:", + "classNames", + "encodeWithCoder:", + "initWithCoder:", + "initWithName:", + "isCSSBased", + "name", + "setCSSResourcesPath:", + "takeThemeFromObject:", + "valueForAttributeWithName:forClass:", + "valueForAttributeWithName:inState:forClass:" + ], + "CPThemeBlend": [ + "bundle", + "bundleDidFinishLoading:", + "initWithContentsOfURL:", + "loadWithDelegate:", + "themeNames", + "themes" + ], + "CPThreePartImage": [ + "encodeWithCoder:", + "filename", + "imageSlices", + "initWithCoder:", + "initWithImageSlices:isVertical:", + "isNinePartImage", + "isSingleImage", + "isThreePartImage", + "isVertical" + ], + "CPTimeZone": [ + "abbreviation", + "abbreviationForDate:", + "data", + "daylightSavingTimeOffset", + "daylightSavingTimeOffsetForDate:", + "description", + "initWithName:", + "initWithName:data:", + "isDaylightSavingTime", + "isDaylightSavingTimeForDate:", + "isEqualToTimeZone:", + "localizedName:locale:", + "name", + "secondFromGMT", + "secondsFromGMT", + "secondsFromGMTForDate:" + ], + "CPTimer": [ + "fire", + "fireDate", + "initWithFireDate:interval:callback:repeats:", + "initWithFireDate:interval:invocation:repeats:", + "initWithFireDate:interval:target:selector:userInfo:repeats:", + "invalidate", + "isValid", + "setFireDate:", + "timeInterval", + "userInfo" + ], + "CPTitleWithPatternBinding": [ + "init" + ], + "CPTokenField": [ + "becomeFirstResponder", + "buttonType", + "cancelOperation:", + "completionDelay", + "deleteBackward:", + "deleteForward:", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "insertNewline:", + "insertTab:", + "insertText:", + "keyDown:", + "keyUp:", + "layoutSubviews", + "mouseDown:", + "mouseUp:", + "moveDown:", + "moveLeft:", + "moveLeftAndModifySelection:", + "moveRight:", + "moveRightAndModifySelection:", + "moveUp:", + "objectValue", + "performKeyEquivalent:", + "resignFirstResponder", + "sendAction:to:", + "setButtonType:", + "setButtonType:", + "setCompletionDelay:", + "setDelegate:", + "setEditable:", + "setEnabled:", + "setObjectValue:", + "setTokenizingCharacterSet:", + "stringValue", + "textDidChange:", + "tokenizingCharacterSet" + ], + "CPToolbar": [ + "delegate", + "displayMode", + "encodeWithCoder:", + "identifier", + "init", + "initWithCoder:", + "initWithIdentifier:", + "isVisible", + "items", + "itemsSortedByVisibilityPriority", + "setDelegate:", + "setDisplayMode:", + "setDisplayMode:", + "setSizeMode:", + "setSizeMode:", + "setVisible:", + "sizeMode", + "toolbarItemDidChange:", + "validateVisibleItems", + "visibleItems" + ], + "CPToolbarItem": [ + "action", + "alternateImage", + "autovalidates", + "copy", + "encodeWithCoder:", + "image", + "init", + "initWithCoder:", + "initWithItemIdentifier:", + "isEnabled", + "itemIdentifier", + "label", + "maxSize", + "minSize", + "paletteLabel", + "setAction:", + "setAlternateImage:", + "setAutovalidates:", + "setEnabled:", + "setImage:", + "setLabel:", + "setMaxSize:", + "setMinSize:", + "setPaletteLabel:", + "setTag:", + "setTarget:", + "setToolTip:", + "setView:", + "setVisibilityPriority:", + "tag", + "target", + "toolTip", + "toolbar", + "validate", + "view", + "visibilityPriority" + ], + "CPTrackingArea": [ + "encodeWithCoder:", + "implementedOwnerMethods", + "initWithCoder:", + "initWithRect:options:owner:userInfo:", + "options", + "owner", + "rect", + "setView:", + "userInfo", + "view", + "windowRect" + ], + "CPTreeController": [ + "add:", + "addChild:", + "addSelectionIndexPaths:", + "alwaysUsesMultipleValuesMarker", + "arrangedObjects", + "avoidsEmptySelection", + "awakeFromCib", + "canAddChild", + "canInsert", + "canInsertChild", + "childrenKeyPath", + "childrenKeyPathForNode:", + "contentArray", + "countKeyPath", + "countKeyPathForNode:", + "encodeWithCoder:", + "init", + "initWithCoder:", + "insert:", + "insertChild:", + "insertObject:atArrangedObjectIndexPath:", + "insertObjects:atArrangedObjectIndexPaths:", + "leafKeyPath", + "leafKeyPathForNode:", + "moveNode:toIndexPath:", + "moveNodes:toIndexPath:", + "prepareContent", + "preservesSelection", + "rearrangeObjects", + "remove:", + "removeObjectAtArrangedObjectIndexPath:", + "removeObjectsAtArrangedObjectIndexPaths:", + "removeSelectionIndexPaths:", + "selectedNodes", + "selectedObjects", + "selectionIndexPath", + "selectionIndexPaths", + "selectsInsertedObjects", + "setAlwaysUsesMultipleValuesMarker:", + "setAvoidsEmptySelection:", + "setChildrenKeyPath:", + "setContent:", + "setCountKeyPath:", + "setLeafKeyPath:", + "setPreservesSelection:", + "setSelectionIndexPath:", + "setSelectionIndexPaths:", + "setSelectsInsertedObjects:", + "setSortDescriptors:", + "sortDescriptors" + ], + "CPTreeNode": [ + "childNodes", + "countOfChildNodes", + "descendantNodeAtIndexPath:", + "encodeWithCoder:", + "indexPath", + "init", + "initWithCoder:", + "initWithRepresentedObject:", + "insertObject:inChildNodesAtIndex:", + "isLeaf", + "mutableChildNodes", + "objectInChildNodesAtIndex:", + "parentNode", + "removeObjectFromChildNodesAtIndex:", + "replaceObjectInChildNodesAtIndex:withObject:", + "representedObject", + "sortWithSortDescriptors:recursively:" + ], + "CPTypesetter": [ + "actionForControlCharacterAtIndex:", + "currentTextContainer", + "layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:nextGlyphIndex:", + "layoutManager", + "textContainers" + ], + "CPURL": [ + "URLByDeletingLastPathComponent", + "absoluteString", + "absoluteURL", + "baseURL", + "description", + "encodeWithCoder:", + "fragment", + "host", + "init", + "initWithCoder:", + "initWithScheme:host:path:", + "initWithString:", + "initWithString:relativeToURL:", + "isEqual:", + "isEqualToURL:", + "isFileURL", + "lastPathComponent", + "parameterString", + "password", + "path", + "pathComponents", + "pathExtension", + "port", + "relativePath", + "relativeString", + "resourceValueForKey:", + "scheme", + "setResourceValue:forKey:", + "standardizedURL", + "staticResourceData", + "user" + ], + "CPURLConnection": [ + "cancel", + "currentRequest", + "delegate", + "initWithRequest:delegate:", + "initWithRequest:delegate:startImmediately:", + "isLocalFileConnection", + "operation", + "originalRequest", + "start" + ], + "CPURLRequest": [ + "HTTPBody", + "HTTPMethod", + "URL", + "allHTTPHeaderFields", + "cachePolicy", + "copy", + "init", + "initWithURL:", + "initWithURL:cachePolicy:timeoutInterval:", + "setHTTPBody:", + "setHTTPMethod:", + "setURL:", + "setURL:", + "setValue:forHTTPHeaderField:", + "setWithCredentials:", + "timeoutInterval", + "valueForHTTPHeaderField:", + "withCredentials" + ], + "CPURLResponse": [ + "URL", + "initWithURL:" + ], + "CPUnarchiveFromDataTransformer": [ + "reverseTransformedValue:", + "transformedValue:" + ], + "CPUndoManager": [ + "beginUndoGrouping", + "canRedo", + "canUndo", + "disableUndoRegistration", + "enableUndoRegistration", + "encodeWithCoder:", + "endUndoGrouping", + "groupingLevel", + "groupsByEvent", + "init", + "initWithCoder:", + "isRedoing", + "isUndoRegistrationEnabled", + "isUndoing", + "observeChangesForKeyPath:ofObject:", + "observeValueForKeyPath:ofObject:change:context:", + "prepareWithInvocationTarget:", + "redo", + "redoActionName", + "redoMenuItemTitle", + "redoMenuTitleForUndoActionName:", + "registerUndoWithTarget:selector:object:", + "removeAllActions", + "removeAllActionsWithTarget:", + "runLoopModes", + "setActionName:", + "setGroupsByEvent:", + "setRunLoopModes:", + "stopObservingChangesForKeyPath:ofObject:", + "undo", + "undoActionName", + "undoMenuItemTitle", + "undoMenuTitleForUndoActionName:", + "undoNestedGroup" + ], + "CPUserDefaults": [ + "URLForKey:", + "arrayForKey:", + "boolForKey:", + "dataForKey:", + "dictionaryForKey:", + "domainDidChange:", + "doubleForKey:", + "floatForKey:", + "init", + "integerForKey:", + "objectForKey:", + "objectForKey:inDomain:", + "persistentDomainNames", + "persistentStoreForDomain:", + "registerDefaults:", + "registerDefaultsFromContentsOfFile:", + "reloadDataFromStoreForDomain:", + "removeObjectForKey:", + "removeObjectForKey:inDomain:", + "setBool:forKey:", + "setDouble:forKey:", + "setFloat:forKey:", + "setInteger:forKey:", + "setObject:forKey:", + "setObject:forKey:inDomain:", + "setPersistentStoreClass:forDomain:reloadData:", + "setURL:forKey:", + "stringArrayForKey:", + "stringForKey:", + "synchronize", + "volatileDomainNames" + ], + "CPUserDefaultsController": [ + "appliesImmediately", + "defaults", + "encodeWithCoder:", + "hasUnappliedChanges", + "initWithCoder:", + "initWithDefaults:initialValues:", + "initialValues", + "revert:", + "revertToInitialValues:", + "save:", + "setAppliesImmediately:", + "setInitialValues:", + "values" + ], + "CPUserDefaultsCookieStore": [ + "data", + "setData:", + "setDomain:" + ], + "CPUserDefaultsLocalStore": [ + "data", + "init", + "setData:" + ], + "CPUserDefaultsStore": [ + "data", + "domain", + "setData:", + "setDomain:" + ], + "CPUserNotification": [ + "activationType", + "actualDeliveryDate", + "contentImage", + "deliveryDate", + "deliveryRepeatInterval", + "deliveryTimeZone", + "identifier", + "informativeText", + "init", + "isPresented", + "isRemote", + "setContentImage:", + "setDeliveryDate:", + "setDeliveryRepeatInterval:", + "setDeliveryTimeZone:", + "setIdentifier:", + "setInformativeText:", + "setTitle:", + "setUserInfo:", + "title", + "userInfo" + ], + "CPUserNotificationCenter": [ + "deliverNotification:", + "deliveredNotifications", + "init", + "removeAllDeliveredNotifications", + "removeDeliveredNotification:", + "removeScheduledNotification:", + "scheduleNotification:", + "scheduledNotifications", + "setDelegate:", + "setDeliveredNotifications:", + "setScheduledNotifications:" + ], + "CPUserSessionManager": [ + "init", + "setStatus:", + "setUserIdentifier:", + "status", + "userIdentifier" + ], + "CPValue": [ + "JSObject", + "encodeWithCoder:", + "initWithCoder:", + "initWithJSObject:" + ], + "CPValueTransformer": [ + "reverseTransformedValue:", + "transformedValue:" + ], + "CPValueWithPatternBinding": [ + "init" + ], + "CPView": [ + "acceptsFirstMouse:", + "addSubview:", + "addSubview:positioned:relativeTo:", + "addTrackingArea:", + "adjustScroll:", + "allowsVibrancy", + "alphaValue", + "animationForKey:", + "animations", + "animator", + "appearance", + "autoresizesSubviews", + "autoresizingMask", + "autoscroll:", + "backgroundColor", + "becomeFirstResponder", + "bounds", + "boundsOrigin", + "boundsSize", + "canBecomeKeyView", + "center", + "clipsToBounds", + "convertPoint:fromView:", + "convertPoint:toView:", + "convertPointFromBase:", + "convertPointToBase:", + "convertRect:fromView:", + "convertRect:toView:", + "convertRectFromBase:", + "convertRectToBase:", + "convertSize:fromView:", + "convertSize:toView:", + "createEphemeralSubviewNamed:", + "debug_description", + "didAddSubview:", + "display", + "displayIfNeeded", + "displayIfNeededInRect:", + "displayRect:", + "displayRectIgnoringOpacity:inContext:", + "dragImage:at:offset:event:pasteboard:source:slideBack:", + "dragView:at:offset:event:pasteboard:source:slideBack:", + "drawRect:", + "effectiveAppearance", + "enclosingMenuItem", + "enclosingScrollView", + "encodeWithCoder:", + "enterFullScreenMode", + "enterFullScreenMode:withOptions:", + "ephemeralSubviewNamed:", + "exitFullScreenMode", + "exitFullScreenModeWithOptions:", + "frame", + "frameOrigin", + "frameRectOfView:inSuperviewSize:", + "frameSize", + "frameWithNewSuperviewSize:", + "hasCustomDrawRect", + "hasCustomLayoutSubviews", + "hitTest:", + "hitTests", + "identifier", + "inLiveResize", + "init", + "initWithCoder:", + "initWithFrame:", + "isCSSBased", + "isDescendantOf:", + "isFlipped", + "isHidden", + "isHiddenOrHasHiddenAncestor", + "isInFullScreenMode", + "isOpaque", + "layer", + "layout", + "layoutEphemeralSubviewNamed:positioned:relativeToEphemeralSubviewNamed:", + "layoutIfNeeded", + "layoutSubviews", + "lockFocus", + "menuForEvent:", + "mouseDown:", + "mouseDownCanMoveWindow", + "needsDisplay", + "needsLayout", + "needsPanelToBecomeKey", + "nextKeyView", + "nextValidKeyView", + "objectDidChangeTheme", + "performKeyEquivalent:", + "postsBoundsChangedNotifications", + "postsFrameChangedNotifications", + "previousKeyView", + "previousValidKeyView", + "rectForEphemeralSubviewNamed:", + "reflectScrolledClipView:", + "registerForDraggedTypes:", + "registeredDraggedTypes", + "removeFromSuperview", + "removeTrackingArea:", + "replaceSubview:with:", + "resignFirstResponder", + "resizeSubviewsWithOldSize:", + "resizeWithOldSuperviewSize:", + "rightMouseDown:", + "rotateByAngle:", + "scaleSize", + "scaleUnitSquareToSize:", + "scrollClipView:toPoint:", + "scrollPoint:", + "scrollRect:by:", + "scrollRectToVisible:", + "setAllowsVibrancy:", + "setAlphaValue:", + "setAnimations:", + "setAppearance:", + "setAutoresizesSubviews:", + "setAutoresizingMask:", + "setBackgroundColor:", + "setBounds:", + "setBoundsOrigin:", + "setBoundsSize:", + "setCenter:", + "setClipsToBounds:", + "setDOMClassName:", + "setFrame:", + "setFrameOrigin:", + "setFrameSize:", + "setHidden:", + "setHitTests:", + "setIdentifier:", + "setLayer:", + "setNeedsDisplay:", + "setNeedsDisplayInRect:", + "setNeedsLayout", + "setNeedsLayout:", + "setNextKeyView:", + "setPostsBoundsChangedNotifications:", + "setPostsFrameChangedNotifications:", + "setScaleSize:", + "setSubviews:", + "setTag:", + "setThemeClass:", + "setThemeState:", + "setToolTip:", + "setValue:forThemeAttribute:", + "setValue:forThemeAttribute:inState:", + "setWantsLayer:", + "subviews", + "superview", + "tag", + "toolTip", + "trackingAreas", + "unlockFocus", + "unregisterDraggedTypes", + "unsetThemeState:", + "updateTrackingAreas", + "viewDidEndLiveResize", + "viewDidHide", + "viewDidLayout", + "viewDidMoveToSuperview", + "viewDidMoveToWindow", + "viewDidUnhide", + "viewWillDraw", + "viewWillLayout", + "viewWillMoveToSuperview:", + "viewWillMoveToWindow:", + "viewWillStartLiveResize", + "viewWithTag:", + "visibleRect", + "wantsLayer", + "willRemoveSubview:", + "window" + ], + "CPViewAnimation": [ + "initWithViewAnimations:", + "setCurrentProgress:", + "setViewAnimations:", + "startAnimation", + "stopAnimation", + "viewAnimations" + ], + "CPViewAnimator": [ + "initWithTarget:", + "needsPeriodicFrameUpdatesForKeyPath:", + "removeFromSuperview", + "setAlphaValue:", + "setBackgroundColor:", + "setFrame:", + "setFrameOrigin:", + "setFrameSize:", + "setHidden:", + "setWantsPeriodicFrameUpdates:", + "wantsPeriodicFrameUpdates" + ], + "CPViewController": [ + "automaticallyNotifiesObserversOfIsViewLoaded", + "cibBundle", + "cibExternalNameTable", + "cibName", + "encodeWithCoder:", + "init", + "initWithCibName:bundle:", + "initWithCibName:bundle:externalNameTable:", + "initWithCibName:bundle:owner:", + "initWithCoder:", + "isViewLoaded", + "loadView", + "loadViewWithCompletionHandler:", + "nextResponder", + "representedObject", + "setRepresentedObject:", + "setTitle:", + "setView:", + "setView:", + "title", + "view", + "view", + "viewDidAppear", + "viewDidDisappear", + "viewDidLoad", + "viewWillAppear", + "viewWillDisappear" + ], + "CPVisualEffectView": [ + "blendingMode", + "encodeWithCoder:", + "initWithCoder:", + "initWithFrame:", + "layoutSubviews", + "maskImage", + "material", + "setAppearance:", + "setBlendingMode:", + "setMaskImage:", + "setMaterial:", + "setState:", + "setState:", + "state" + ], + "CPWebScriptObject": [ + "callWebScriptMethod:withArguments:", + "evaluateWebScript:", + "initWithWindow:", + "window" + ], + "CPWebView": [ + "DOMWindow", + "UIDelegate", + "backForwardList", + "canGoBack", + "canGoForward", + "close", + "computedStyleForElement:pseudoElement:", + "downloadDelegate", + "drawsBackground", + "effectiveScrollMode", + "encodeWithCoder:", + "frameLoadDelegate", + "goBack", + "goBack:", + "goForward", + "goForward:", + "initWithCoder:", + "initWithFrame:", + "initWithFrame:frameName:groupName:", + "isLoading", + "loadHTMLString:", + "loadHTMLString:baseURL:", + "mainFrameURL", + "objectByEvaluatingJavaScriptFromString:", + "policyDelegate", + "print:", + "reload:", + "resourceLoadDelegate", + "setBackgroundColor:", + "setDownloadDelegate:", + "setDrawsBackground:", + "setFrameLoadDelegate:", + "setFrameSize:", + "setMainFrameURL:", + "setPolicyDelegate:", + "setResourceLoadDelegate:", + "setScrollMode:", + "setUIDelegate:", + "stopLoading:", + "stringByEvaluatingJavaScriptFromString:", + "takeStringURLFrom:", + "viewDidUnhide", + "windowScriptObject" + ], + "CPWindow": [ + "acceptsFirstResponder", + "acceptsMouseMovedEvents", + "addChildWindow:ordered:", + "alphaValue", + "animationDidEnd:", + "animationResizeTime:", + "attachedSheet", + "autorecalculatesKeyViewLoop", + "autoresizingMask", + "awakeFromCib", + "backgroundColor", + "becomeKeyWindow", + "becomeMainWindow", + "becomesKeyOnlyIfNeeded", + "canBecomeKeyWindow", + "canBecomeMainWindow", + "center", + "childWindows", + "close", + "containsPoint:", + "contentRectForFrameRect:", + "contentView", + "convertBaseToBridge:", + "convertBaseToGlobal:", + "convertBaseToPlatformWindow:", + "convertBaseToScreen:", + "convertBridgeToBase:", + "convertGlobalToBase:", + "convertPlatformWindowToBase:", + "convertScreenToBase:", + "defaultButton", + "defaultButtonCell", + "delegate", + "deminiaturize:", + "disableKeyEquivalentForDefaultButton", + "disableKeyEquivalentForDefaultButtonCell", + "doCommandBySelector:", + "dragImage:at:offset:event:pasteboard:source:slideBack:", + "dragView:at:offset:event:pasteboard:source:slideBack:", + "enableKeyEquivalentForDefaultButton", + "enableKeyEquivalentForDefaultButtonCell", + "firstResponder", + "frame", + "frameRectForContentRect:", + "hasShadow", + "ignoresMouseEvents", + "init", + "initWithContentRect:styleMask:", + "initialFirstResponder", + "isDocumentEdited", + "isDocumentSaving", + "isExcludedFromWindowsMenu", + "isFullBridge", + "isFullPlatformWindow", + "isKeyWindow", + "isMainWindow", + "isMiniaturized", + "isMovable", + "isMovableByWindowBackground", + "isSheet", + "isVisible", + "keyDown:", + "level", + "makeFirstResponder:", + "makeKeyAndOrderFront:", + "makeKeyWindow", + "makeMainWindow", + "maxSize", + "minSize", + "miniaturize:", + "orderBack:", + "orderFront:", + "orderOut:", + "orderWindow:relativeTo:", + "parentWindow", + "performClose:", + "performKeyEquivalent:", + "performMiniaturize:", + "platformWindow", + "recalculateKeyViewLoop", + "redo:", + "registerForDraggedTypes:", + "registeredDraggedTypes", + "releasedWhenClosed", + "removeChildWindow:", + "representedFilename", + "representedURL", + "resignKeyWindow", + "resignMainWindow", + "resizeIndicatorOffset", + "resizeWithOldPlatformWindowSize:", + "screen", + "selectKeyViewFollowingView:", + "selectKeyViewPrecedingView:", + "selectNextKeyView:", + "selectPreviousKeyView:", + "sendEvent:", + "setAcceptsMouseMovedEvents:", + "setAlphaValue:", + "setAutorecalculatesKeyViewLoop:", + "setAutoresizingMask:", + "setBackgroundColor:", + "setContentView:", + "setDefaultButton:", + "setDefaultButtonCell:", + "setDelegate:", + "setDocumentEdited:", + "setDocumentSaving:", + "setExcludedFromWindowsMenu:", + "setFrame:", + "setFrame:display:", + "setFrame:display:animate:", + "setFrameOrigin:", + "setFrameSize:", + "setFullBridge:", + "setFullPlatformWindow:", + "setHasShadow:", + "setIgnoresMouseEvents:", + "setInitialFirstResponder:", + "setLevel:", + "setMaxSize:", + "setMinSize:", + "setMovable:", + "setMovableByWindowBackground:", + "setParentWindow:", + "setPlatformWindow:", + "setReleasedWhenClosed:", + "setRepresentedFilename:", + "setRepresentedURL:", + "setResizeIndicatorOffset:", + "setShadowStyle:", + "setShowsResizeIndicator:", + "setTitle:", + "setTitleWithRepresentedFilename:", + "setToolbar:", + "setValue:forKey:", + "setWindowController:", + "showsResizeIndicator", + "styleMask", + "title", + "toggleToolbarShown:", + "toolbar", + "undo:", + "undoManager", + "unregisterDraggedTypes", + "validateUserInterfaceItem:", + "windowController", + "windowNumber", + "worksWhenModal" + ], + "CPWindowController": [ + "addDocument:", + "close", + "document", + "documents", + "init", + "initWithWindow:", + "initWithWindowCibName:", + "initWithWindowCibName:owner:", + "initWithWindowCibPath:owner:", + "isWindowLoaded", + "loadWindow", + "owner", + "removeDocument:", + "removeDocumentAndCloseIfNecessary:", + "setDocument:", + "setDocumentEdited:", + "setShouldCloseDocument:", + "setSupportsMultipleDocuments:", + "setViewController:", + "setViewControllerContainerView:", + "setWindow:", + "shouldCloseDocument", + "showWindow:", + "supportsMultipleDocuments", + "synchronizeWindowTitleWithDocumentName", + "viewController", + "viewControllerContainerView", + "window", + "windowCibName", + "windowCibPath", + "windowDidLoad", + "windowTitleForDocumentDisplayName:", + "windowWillLoad" + ], + "CPWorkspace": [ + "openFile:", + "openURL:" + ], + "HandImageLayer": [ + "hitTest:", + "setBounds:" + ], + "HandLayer": [ + "drawLayer:inContext:", + "handIsHitAtPoint:", + "imageDidLoad:", + "initWithSize:", + "setBounds:", + "setImage:", + "setNeedsDisplay", + "setRotationRadians:" + ], + "HoursLayer": [ + "drawInContext:", + "font", + "init", + "radius", + "setDrawsHours:", + "setFont:", + "setRadius:", + "setTextColor:", + "textColor" + ] + }, + "classMethods": { + "CAAnimation": [ + "animation", + "defaultValueForKey:" + ], + "CABasicAnimation": [], + "CAKeyframeAnimation": [], + "CALayer": [ + "layer", + "runLoopUpdateLayers" + ], + "CAMediaTimingFunction": [ + "functionWithControlPoints::::", + "functionWithName:" + ], + "CAPropertyAnimation": [ + "animationWithKeyPath:" + ], + "CPAccordionView": [], + "CPAccordionViewItem": [], + "CPActionBinding": [], + "CPAlert": [ + "alertWithError:", + "alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:" + ], + "CPAnimation": [], + "CPAnimationContext": [ + "beginGrouping", + "contextStack", + "currentContext", + "endGrouping", + "runAnimationGroup:completionHandler:" + ], + "CPAppearance": [ + "appearanceNamed:", + "currentAppearance", + "setCurrentAppearance:" + ], + "CPApplication": [ + "defaultThemeName", + "sharedApplication" + ], + "CPArray": [ + "alloc", + "array", + "arrayWithArray:", + "arrayWithObject:", + "arrayWithObjects:", + "arrayWithObjects:count:" + ], + "CPArrayController": [ + "initialize", + "keyPathsForValuesAffectingArrangedObjects", + "keyPathsForValuesAffectingCanRemove", + "keyPathsForValuesAffectingCanSelectNext", + "keyPathsForValuesAffectingCanSelectPrevious", + "keyPathsForValuesAffectingContentArray", + "keyPathsForValuesAffectingSelectedObjects", + "keyPathsForValuesAffectingSelection", + "keyPathsForValuesAffectingSelectionIndex", + "keyPathsForValuesAffectingSelectionIndexes" + ], + "CPAttributedString": [], + "CPBasePlatform": [ + "activateIgnoringOtherApps:", + "bootstrap", + "deactivate", + "hide:", + "hideOtherApplications:", + "isBrowser", + "supportsDragAndDrop", + "supportsNativeMainMenu", + "terminateApplication" + ], + "CPBasePlatformString": [ + "bootstrap", + "sizeOfString:withFont:forWidth:" + ], + "CPBezierPath": [ + "bezierPath", + "bezierPathWithOvalInRect:", + "bezierPathWithRect:", + "bezierPathWithRoundedRect:xRadius:yRadius:", + "defaultLineWidth", + "fillRect:", + "setDefaultLineWidth:", + "strokeLineFromPoint:toPoint:", + "strokeRect:" + ], + "CPBinder": [ + "allBindingsForObject:", + "exposeBinding:forClass:", + "exposedBindingsForClass:", + "getBinding:forObject:", + "infoForBinding:forObject:", + "isBindingAllowed:forObject:", + "unbind:forObject:", + "unbindAllForObject:" + ], + "CPBox": [ + "boxEnclosingView:", + "defaultThemeClass", + "themeAttributes" + ], + "CPBrowser": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPBundle": [ + "bundleForClass:", + "bundleWithIdentifier:", + "bundleWithPath:", + "bundleWithURL:", + "loadCibFile:externalNameTable:", + "loadCibFile:externalNameTable:loadDelegate:", + "loadCibNamed:owner:", + "loadCibNamed:owner:loadDelegate:", + "mainBundle" + ], + "CPButton": [ + "buttonWithTitle:", + "buttonWithTitle:theme:", + "defaultThemeClass", + "themeAttributes" + ], + "CPButtonBar": [ + "actionPopupButton", + "defaultThemeClass", + "minusButton", + "plusButton", + "themeAttributes" + ], + "CPByteCountFormatter": [ + "stringFromByteCount:countStyle:" + ], + "CPCache": [], + "CPCharacterSet": [ + "alphanumericCharacterSet", + "characterSetWithCharactersInString:", + "characterSetWithRange:", + "controlCharacterSet", + "decimalDigitCharacterSet", + "decomposableCharacterSet", + "illegalCharacterSet", + "letterCharacterSet", + "lowercaseLetterCharacterSet", + "nonBaseCharacterSet", + "punctuationCharacterSet", + "uppercaseLetterCharacterSet", + "whitespaceAndNewlineCharacterSet", + "whitespaceCharacterSet" + ], + "CPCheckBox": [ + "checkBoxWithTitle:", + "checkBoxWithTitle:theme:", + "defaultThemeClass" + ], + "CPCib": [], + "CPCibBindingConnector": [], + "CPCibConnector": [], + "CPCibControlConnector": [], + "CPCibHelpConnector": [], + "CPCibOutletConnector": [], + "CPCibRuntimeAttributesConnector": [], + "CPClipView": [], + "CPCoder": [], + "CPCollectionView": [], + "CPCollectionViewItem": [], + "CPColor": [ + "alternateSelectedControlColor", + "blackColor", + "blueColor", + "brownColor", + "checkerBoardColor", + "clearColor", + "colorWithCSSDictionary:", + "colorWithCSSDictionary:beforeDictionary:afterDictionary:", + "colorWithCSSString:", + "colorWithCalibratedHue:saturation:brightness:alpha:", + "colorWithCalibratedRed:green:blue:alpha:", + "colorWithCalibratedWhite:alpha:", + "colorWithHexString:", + "colorWithHue:saturation:brightness:", + "colorWithHue:saturation:brightness:alpha:", + "colorWithPatternImage:", + "colorWithRed:green:blue:alpha:", + "colorWithSRGBRed:green:blue:alpha:", + "colorWithWhite:alpha:", + "cyanColor", + "darkGrayColor", + "defaultThemeClass", + "grayColor", + "greenColor", + "lightGrayColor", + "magentaColor", + "orangeColor", + "purpleColor", + "randomColor", + "redColor", + "restorePreviousCSSState:forDOMElement:", + "secondarySelectedControlColor", + "selectedTextBackgroundColor", + "shadowColor", + "themeAttributes", + "whiteColor", + "yellowColor" + ], + "CPColorPanel": [ + "provideColorPickerClass:", + "setPickerMode:", + "sharedColorPanel" + ], + "CPColorPicker": [], + "CPColorSpace": [ + "sRGBColorSpace" + ], + "CPColorWell": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPColorWellValueBinder": [], + "CPColorWheelColorPicker": [], + "CPComboBox": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPComparisonPredicate": [ + "predicateWithLeftExpression:rightExpression:customSelector:", + "predicateWithLeftExpression:rightExpression:modifier:type:options:" + ], + "CPCompoundPredicate": [ + "andPredicateWithSubpredicates:", + "notPredicateWithSubpredicate:", + "orPredicateWithSubpredicates:" + ], + "CPControl": [ + "initialize", + "themeAttributes" + ], + "CPController": [], + "CPControllerSelectionProxy": [], + "CPCookie": [], + "CPCountedSet": [], + "CPCursor": [ + "IBeamCursor", + "IBeamCursorForVerticalLayout", + "arrowCursor", + "closedHandCursor", + "contextualMenuCursor", + "crosshairCursor", + "currentCursor", + "disappearingItemCursor", + "dragCopyCursor", + "dragLinkCursor", + "hide", + "initialize", + "openHandCursor", + "operationNotAllowedCursor", + "pointingHandCursor", + "pop", + "resizeDownCursor", + "resizeEastWestCursor", + "resizeLeftCursor", + "resizeLeftRightCursor", + "resizeNorthSouthCursor", + "resizeNortheastCursor", + "resizeNortheastSouthwestCursor", + "resizeNorthwestCursor", + "resizeNorthwestSoutheastCursor", + "resizeRightCursor", + "resizeSoutheastCursor", + "resizeSouthwestCursor", + "resizeUpCursor", + "resizeUpDownCursor", + "setHiddenUntilMouseMoves:", + "unhide" + ], + "CPDOMWindowLayer": [], + "CPData": [ + "alloc", + "data", + "dataWithBase64:", + "dataWithBytes:", + "dataWithJSONObject:", + "dataWithPlistObject:", + "dataWithPlistObject:format:", + "dataWithRawString:", + "dataWithString:" + ], + "CPDate": [ + "alloc", + "date", + "dateWithTimeIntervalSince1970:", + "dateWithTimeIntervalSinceNow:", + "dateWithTimeIntervalSinceReferenceDate:", + "distantFuture", + "distantPast", + "timeIntervalSinceReferenceDate", + "timezoneOffsetString:" + ], + "CPDateFormatter": [ + "dateFormatFromTemplate:options:locale:", + "defaultFormatterBehavior", + "initialize", + "localizedStringFromDate:dateStyle:timeStyle:", + "setDefaultFormatterBehavior:" + ], + "CPDatePicker": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPDecimalNumber": [ + "alloc", + "decimalNumberWithDecimal:", + "decimalNumberWithMantissa:exponent:isNegative:", + "decimalNumberWithString:", + "decimalNumberWithString:locale:", + "defaultBehavior", + "maximumDecimalNumber", + "minimumDecimalNumber", + "notANumber", + "numberWithBool:", + "numberWithChar:", + "numberWithDouble:", + "numberWithFloat:", + "numberWithInt:", + "numberWithLong:", + "numberWithLongLong:", + "numberWithShort:", + "numberWithUnsignedChar:", + "numberWithUnsignedInt:", + "numberWithUnsignedLong:", + "numberWithUnsignedLongLong:", + "numberWithUnsignedShort:", + "one", + "setDefaultBehavior:", + "zero" + ], + "CPDecimalNumberHandler": [ + "decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:", + "defaultDecimalNumberHandler" + ], + "CPDelayedPerform": [ + "delayedPerformWithObject:selector:argument:" + ], + "CPDictionary": [ + "alloc", + "dictionary", + "dictionaryWithDictionary:", + "dictionaryWithJSObject:", + "dictionaryWithJSObject:recursively:", + "dictionaryWithObject:forKey:", + "dictionaryWithObjects:forKeys:", + "dictionaryWithObjectsAndKeys:" + ], + "CPDisclosureButton": [], + "CPDocument": [], + "CPDocumentController": [ + "sharedDocumentController" + ], + "CPDoubleClickActionBinding": [], + "CPDragServer": [ + "initialize", + "sharedDragServer" + ], + "CPDraggingInfo": [], + "CPEnumerator": [], + "CPError": [ + "alloc", + "errorWithDomain:code:userInfo:" + ], + "CPEvent": [ + "currentTimestamp", + "enterExitEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:trackingArea:", + "keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:", + "keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:isActionKey:", + "modifierFlags", + "mouseEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:clickCount:pressure:", + "mouseLocation", + "otherEventWithType:location:modifierFlags:timestamp:windowNumber:context:subtype:data1:data2:", + "startPeriodicEventsAfterDelay:withPeriod:", + "stopPeriodicEvents" + ], + "CPException": [ + "alloc", + "exceptionWithName:reason:userInfo:", + "raise:format:", + "raise:reason:" + ], + "CPExpression": [ + "expressionForAggregate:", + "expressionForBlock:arguments:", + "expressionForConditional:trueExpression:falseExpression:", + "expressionForConstantValue:", + "expressionForEvaluatedObject", + "expressionForFunction:arguments:", + "expressionForFunction:selectorName:arguments:", + "expressionForIntersectSet:with:", + "expressionForKeyPath:", + "expressionForMinusSet:with:", + "expressionForSubquery:usingIteratorVariable:predicate:", + "expressionForUnionSet:with:", + "expressionForVariable:" + ], + "CPFont": [ + "boldFontWithName:size:", + "boldFontWithName:size:italic:", + "boldSystemFontOfSize:", + "defaultThemeClass", + "fontWithDescriptor:size:", + "fontWithName:size:", + "fontWithName:size:italic:", + "initialize", + "initializeSystemFontFromTheme:", + "setSystemFontFace:", + "setSystemFontSize:", + "systemFontFace", + "systemFontForControlSize:", + "systemFontOfSize:", + "systemFontSize", + "themeAttributes" + ], + "CPFontDescriptor": [ + "fontDescriptorWithFontAttributes:", + "fontDescriptorWithName:size:" + ], + "CPFontManager": [ + "setFontManagerFactory:", + "setFontPanelFactory:", + "sharedFontManager" + ], + "CPFontPanel": [ + "sharedFontPanel", + "sharedFontPanelExists" + ], + "CPFormatter": [], + "CPFunctionOperation": [ + "functionOperationWithFunction:" + ], + "CPGradient": [], + "CPGraphicsContext": [ + "currentContext", + "graphicsContextWithGraphicsPort:flipped:", + "restoreGraphicsState", + "saveGraphicsState", + "setCurrentContext:" + ], + "CPHTTPURLResponse": [ + "parseHTTPHeaders:" + ], + "CPImage": [ + "cachedImageWithContentsOfFile:", + "dummyCSSImageOfSize:", + "imageNamed:", + "imageWithCSSDictionary:beforeDictionary:afterDictionary:size:", + "imageWithCSSDictionary:size:", + "imageWithMaterialIconNamed:size:", + "imageWithMaterialIconNamed:size:color:" + ], + "CPImageView": [ + "initialize" + ], + "CPImageViewValueBinder": [], + "CPIndexPath": [ + "indexPathWithIndex:", + "indexPathWithIndexes:", + "indexPathWithIndexes:length:" + ], + "CPIndexSet": [ + "indexSet", + "indexSetWithIndex:", + "indexSetWithIndexesInRange:" + ], + "CPInvocation": [ + "invocationWithMethodSignature:" + ], + "CPInvocationOperation": [], + "CPIsNilTransformer": [ + "allowsReverseTransformation", + "transformedValueClass" + ], + "CPIsNotNilTransformer": [ + "allowsReverseTransformation", + "transformedValueClass" + ], + "CPJSONPConnection": [ + "connectionWithRequest:callback:delegate:", + "sendRequest:callback:delegate:" + ], + "CPKeyBinding": [ + "cacheKeyBinding:", + "createKeyBindingsFromJSObject:", + "initialize", + "keyBindingForKey:modifierFlags:", + "selectorsForKey:modifierFlags:" + ], + "CPKeyedArchiver": [ + "allowsKeyedCoding", + "archivedDataWithRootObject:", + "classNameForClass:", + "initialize", + "setClassName:forClass:" + ], + "CPKeyedUnarchiver": [ + "initialize", + "unarchiveObjectWithData:", + "unarchiveObjectWithFile:", + "unarchiveObjectWithFile:asynchronously:" + ], + "CPLayoutManager": [], + "CPLevelIndicator": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPLocale": [ + "ISOCountryCodes", + "ISOLanguageCodes", + "availableLocaleIdentifiers", + "currentLocale", + "systemLocale" + ], + "CPMapTable": [], + "CPMarkdownParser": [ + "attributedStringFromMarkdown:", + "attributedStringWithText:font:bold:italic:code:", + "isTableHeaderLine:", + "isTableRowLine:", + "isTableSeparatorLine:", + "parseInlineMarkdown:isHeader:headerLevel:", + "parseTableCellMarkdown:isHeader:", + "parseTableCells:" + ], + "CPMenu": [ + "initialize", + "menuBarAttributes", + "menuBarHeight", + "menuBarIconImage", + "menuBarTitle", + "menuBarVisible", + "popUpContextMenu:withEvent:forView:", + "popUpContextMenu:withEvent:forView:withFont:", + "setMenuBarAttributes:", + "setMenuBarIconImage:", + "setMenuBarTitle:", + "setMenuBarVisible:", + "setNamedValue:forKey:inAttributes:forTheme:", + "trackingCallbackWithCallback:", + "updateMenuBarAttributesWithTheme:" + ], + "CPMenuItem": [ + "separatorItem" + ], + "CPMultipleValueAndBinding": [], + "CPMultipleValueOrBinding": [], + "CPMutableArray": [ + "arrayWithCapacity:" + ], + "CPMutableAttributedString": [], + "CPMutableDictionary": [], + "CPMutableIndexSet": [], + "CPMutableParagraphStyle": [], + "CPMutableSet": [ + "setWithCapacity:" + ], + "CPNegateBooleanTransformer": [ + "allowsReverseTransformation", + "transformedValueClass" + ], + "CPNinePartImage": [], + "CPNotification": [ + "notificationWithName:object:", + "notificationWithName:object:userInfo:" + ], + "CPNotificationCenter": [ + "defaultCenter" + ], + "CPNotificationQueue": [ + "defaultQueue" + ], + "CPNull": [ + "null" + ], + "CPNumber": [ + "alloc", + "numberWithBool:", + "numberWithChar:", + "numberWithDouble:", + "numberWithFloat:", + "numberWithInt:", + "numberWithLong:", + "numberWithLongLong:", + "numberWithShort:", + "numberWithUnsignedChar:", + "numberWithUnsignedInt:", + "numberWithUnsignedLong:", + "numberWithUnsignedShort:" + ], + "CPNumberFormatter": [ + "localizedStringFromNumber:numberStyle:" + ], + "CPObject": [ + "UID", + "accessInstanceVariablesDirectly", + "actualTheme", + "actualValueForThemeAttribute:", + "actualValueForThemeAttribute:inState:", + "addObserver:forKeyPath:options:context:", + "alloc", + "allocWithCoder:", + "applyChange:toKeyPath:", + "automaticallyNotifiesObserversForKey:", + "autorelease", + "awakeAfterUsingCoder:", + "awakeAfterUsingCoder:", + "awakeFromCib", + "bind:toObject:withKeyPath:options:", + "cancelPreviousPerformRequestsWithTarget:", + "cancelPreviousPerformRequestsWithTarget:selector:object:", + "class", + "class", + "classForCoder", + "classForKeyedArchiver", + "className", + "conformsToProtocol:", + "conformsToProtocol:", + "copy", + "currentValueForThemeAttribute:", + "dealloc", + "defaultThemeClass", + "description", + "description", + "dictionaryWithValuesForKeys:", + "didChange:valuesAtIndexes:forKey:", + "didChangeValueForKey:", + "didChangeValueForKey:withSetMutation:usingObjects:", + "doesNotRecognizeSelector:", + "exposeBinding:", + "exposedBindings", + "forwardInvocation:", + "forwardingTargetForSelector:", + "hasThemeAttribute:", + "hasThemeState:", + "hasThemeStates:", + "hash", + "implementsSelector:", + "infoForBinding:", + "init", + "initialize", + "instanceMethodForSelector:", + "instancesImplementSelector:", + "instancesRespondToSelector:", + "isBindingExclusive:", + "isEqual:", + "isKindOfClass:", + "isKindOfClass:", + "isMemberOfClass:", + "isMemberOfClass:", + "isProxy", + "isSubclassOfClass:", + "keyPathsForValuesAffectingValueForKey:", + "kvoValueForKey:", + "load", + "methodForSelector:", + "methodSignatureForSelector:", + "mutableArrayValueForKey:", + "mutableArrayValueForKeyPath:", + "mutableCopy", + "mutableSetValueForKey:", + "mutableSetValueForKeyPath:", + "new", + "object:performSelector:withObject:afterDelay:inModes:", + "objectDidChangeTheme", + "performSelector:", + "performSelector:withObject:", + "performSelector:withObject:afterDelay:", + "performSelector:withObject:afterDelay:inModes:", + "performSelector:withObject:withObject:", + "performSelector:withObjects:", + "registerThemeValues:", + "registerThemeValues:inherit:", + "release", + "removeObserver:forKeyPath:", + "replacementObjectForArchiver:", + "replacementObjectForCoder:", + "replacementObjectForKeyedArchiver:", + "respondsToSelector:", + "retain", + "self", + "setTheme:", + "setThemeClass:", + "setThemeState:", + "setThemeStates:", + "setValue:forKey:", + "setValue:forKeyPath:", + "setValue:forThemeAttribute:", + "setValue:forThemeAttribute:inState:", + "setValue:forThemeAttribute:inStates:", + "setValue:forUndefinedKey:", + "setValuesForKeysWithDictionary:", + "setVersion:", + "superclass", + "superclass", + "theme", + "themeAttributes", + "themeClass", + "themeState", + "unbind:", + "unsetThemeState:", + "unsetThemeStates:", + "valueClassForBinding:", + "valueForKey:", + "valueForKeyPath:", + "valueForThemeAttribute:", + "valueForThemeAttribute:inState:", + "valueForThemeAttribute:inStates:", + "valueForUndefinedKey:", + "valueType", + "version", + "willChange:valuesAtIndexes:forKey:", + "willChangeValueForKey:", + "willChangeValueForKey:withSetMutation:usingObjects:" + ], + "CPObjectController": [ + "automaticallyNotifiesObserversForKey:", + "initialize", + "keyPathsForValuesAffectingCanAdd", + "keyPathsForValuesAffectingCanInsert", + "keyPathsForValuesAffectingCanRemove", + "keyPathsForValuesAffectingContentObject" + ], + "CPOpenPanel": [ + "openPanel" + ], + "CPOperation": [], + "CPOperationQueue": [ + "currentQueue", + "mainQueue" + ], + "CPOutlineView": [ + "initialize" + ], + "CPPanel": [], + "CPParagraphStyle": [ + "defaultParagraphStyle", + "defaultWritingDirectionForLanguage:" + ], + "CPPasteboard": [ + "generalPasteboard", + "initialize", + "pasteboardWithName:" + ], + "CPPlatform": [ + "activateIgnoringOtherApps:", + "closeAllPlatformWindows", + "deactivate", + "hide:", + "hideOtherApplications:", + "initialize", + "initializeScreenIfNecessary", + "isBrowser", + "mainBodyElement", + "supportsDragAndDrop", + "supportsNativeMainMenu", + "terminateApplication" + ], + "CPPlatformPasteboard": [], + "CPPlatformString": [ + "bootstrap", + "charPositionOfString:withFont:forPoint:", + "createDOMElements", + "createDOMMetricsElements", + "initialize", + "metricsOfFont:", + "sizeOfString:withFont:forWidth:" + ], + "CPPlatformWindow": [ + "clearCharacterKeysToPreventFromPropagating", + "clearKeyCodesToPreventFromPropagating", + "preventCharacterKeyFromPropagating:", + "preventCharacterKeysFromPropagating:", + "preventKeyCodeFromPropagating:", + "preventKeyCodesFromPropagating:", + "primaryPlatformWindow", + "setPrimaryPlatformWindow:", + "supportsMultipleInstances", + "visiblePlatformWindows", + "visiblePlatformWindows" + ], + "CPPopUpButton": [ + "defaultThemeClass", + "isBindingExclusive:", + "keyPathsForValuesAffectingSelectedIndex", + "keyPathsForValuesAffectingSelectedItem", + "keyPathsForValuesAffectingSelectedTag", + "themeAttributes" + ], + "CPPopover": [], + "CPPredicate": [ + "predicateWithFormat:", + "predicateWithFormat:argumentArray:", + "predicateWithFormat:arguments:", + "predicateWithValue:" + ], + "CPPredicateEditor": [], + "CPPredicateEditorRowTemplate": [], + "CPPredicateEditorValueBinder": [], + "CPPredicateScanner": [], + "CPPredicateUtilities": [ + "abs:", + "add:to:", + "average:", + "ceiling:", + "chs:", + "count:", + "divide:by:", + "exp:", + "first:", + "from:substract:", + "fromObject:index:", + "last:", + "ln:", + "max:", + "min:", + "modulus:by:", + "multiply:by:", + "now:", + "raise:to:", + "random:", + "sqrt:", + "sum:" + ], + "CPPredicate_BOOL": [], + "CPProgressIndicator": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPPropertyListSerialization": [ + "dataFromPropertyList:format:", + "dataFromPropertyList:format:errorDescription:", + "propertyListFromData:format:", + "propertyListFromData:format:errorDescription:" + ], + "CPProxy": [ + "UID", + "alloc", + "class", + "class", + "description", + "forward::", + "forwardInvocation:", + "hash", + "initialize", + "isEqual:", + "isKindOfClass:", + "isMemberOfClass:", + "isProxy", + "load", + "methodSignatureForSelector:", + "performSelector:", + "performSelector:withObject:", + "performSelector:withObject:withObject:", + "respondsToSelector:", + "respondsToSelector:", + "self", + "superclass" + ], + "CPRadio": [ + "defaultThemeClass", + "radioWithTitle:", + "radioWithTitle:theme:", + "standardButtonWithTitle:" + ], + "CPRadioGroup": [ + "initialize", + "isBindingExclusive:" + ], + "CPResponder": [], + "CPRuleEditor": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPRulerMarker": [], + "CPRulerView": [ + "initialize", + "registerUnitWithName:abbreviation:unitToPointsConversionFactor:stepUpCycle:stepDownCycle:" + ], + "CPRunLoop": [ + "currentRunLoop", + "initialize", + "mainRunLoop" + ], + "CPSavePanel": [ + "proposedFileURLWithDocumentName:", + "savePanel" + ], + "CPScanner": [ + "scannerWithString:" + ], + "CPScreen": [], + "CPScrollView": [ + "contentSizeForFrameSize:hasHorizontalScroller:hasVerticalScroller:borderType:", + "contentSizeForFrameSize:horizontalScrollerClass:verticalScrollerClass:borderType:controlSize:scrollerStyle:", + "defaultThemeClass", + "frameSizeForContentSize:hasHorizontalScroller:hasVerticalScroller:borderType:", + "frameSizeForContentSize:horizontalScrollerClass:verticalScrollerClass:borderType:controlSize:scrollerStyle:", + "globalScrollerStyle", + "initialize", + "setGlobalScrollerStyle:", + "themeAttributes" + ], + "CPScroller": [ + "defaultThemeClass", + "scrollerOverlay", + "scrollerWidth", + "scrollerWidthForControlSize:", + "scrollerWidthInStyle:", + "themeAttributes" + ], + "CPSearchField": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPSecureTextField": [], + "CPSegmentedControl": [ + "defaultThemeClass", + "isBindingExclusive:", + "themeAttributes" + ], + "CPSet": [ + "alloc", + "set", + "setWithArray:", + "setWithObject:", + "setWithObjects:", + "setWithObjects:count:", + "setWithSet:" + ], + "CPShadow": [ + "shadowWithOffset:blurRadius:color:" + ], + "CPShadowView": [ + "defaultThemeClass", + "frameForContentFrame:withWeight:", + "shadowViewEnclosingView:", + "shadowViewEnclosingView:withWeight:", + "themeAttributes" + ], + "CPSimpleTypesetter": [ + "sharedInstance" + ], + "CPSlider": [ + "defaultThemeClass", + "sliderWithTarget:action:", + "sliderWithValue:minValue:maxValue:target:action:", + "themeAttributes" + ], + "CPSliderColorPicker": [], + "CPSortDescriptor": [ + "sortDescriptorWithKey:ascending:", + "sortDescriptorWithKey:ascending:selector:" + ], + "CPSound": [], + "CPSplitView": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPStackView": [ + "stackViewWithViews:" + ], + "CPStepper": [ + "defaultThemeClass", + "stepper", + "stepperWithInitialValue:minValue:maxValue:", + "themeAttributes" + ], + "CPString": [ + "JSONFromObject:", + "UUID", + "alloc", + "initialize", + "metricsOfFont:", + "pathWithComponents:", + "string", + "stringWithFormat:", + "stringWithHash:", + "stringWithString:" + ], + "CPTabView": [ + "defaultThemeClass", + "isBindingExclusive:", + "themeAttributes" + ], + "CPTabViewItem": [ + "tabViewItemWithViewController:" + ], + "CPTableCellView": [], + "CPTableColumn": [], + "CPTableColumnValueBinder": [], + "CPTableContentBinder": [], + "CPTableHeaderView": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPTableView": [ + "defaultThemeClass", + "themeAttributes" + ], + "CPText": [], + "CPTextAttachment": [], + "CPTextContainer": [], + "CPTextField": [ + "defaultThemeClass", + "labelWithTitle:", + "labelWithTitle:theme:", + "roundedTextFieldWithStringValue:placeholder:width:", + "roundedTextFieldWithStringValue:placeholder:width:theme:", + "textFieldWithStringValue:placeholder:width:", + "textFieldWithStringValue:placeholder:width:theme:", + "themeAttributes" + ], + "CPTextList": [], + "CPTextStorage": [ + "attributedStringWithAttachment:" + ], + "CPTextTab": [], + "CPTextView": [ + "defaultMenu" + ], + "CPTheme": [ + "defaultHudTheme", + "defaultTheme", + "setDefaultHudTheme:", + "setDefaultTheme:", + "themeNamed:", + "updateDefaultThemeDynamicAttributesSetWithSet:" + ], + "CPThemeBlend": [], + "CPThreePartImage": [], + "CPTimeZone": [ + "abbreviationDictionary", + "defaultTimeZone", + "initialize", + "knownTimeZoneNames", + "localTimeZone", + "resetSystemTimeZone", + "setAbbreviationDictionary:", + "setDefaultTimeZone:", + "systemTimeZone", + "timeZoneDataVersion", + "timeZoneForSecondsFromGMT:", + "timeZoneWithAbbreviation:", + "timeZoneWithName:", + "timeZoneWithName:data:" + ], + "CPTimer": [ + "scheduledTimerWithTimeInterval:callback:repeats:", + "scheduledTimerWithTimeInterval:invocation:repeats:", + "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:", + "timerWithTimeInterval:callback:repeats:", + "timerWithTimeInterval:invocation:repeats:", + "timerWithTimeInterval:target:selector:userInfo:repeats:" + ], + "CPTitleWithPatternBinding": [], + "CPTokenField": [ + "defaultCompletionDelay", + "defaultThemeClass", + "defaultTokenizingCharacterSet", + "themeAttributes" + ], + "CPToolbar": [ + "initialize" + ], + "CPToolbarItem": [], + "CPTrackingArea": [], + "CPTreeController": [ + "initialize", + "keyPathsForValuesAffectingArrangedObjects", + "keyPathsForValuesAffectingCanAddChild", + "keyPathsForValuesAffectingCanInsert", + "keyPathsForValuesAffectingCanInsertChild", + "keyPathsForValuesAffectingContentArray", + "keyPathsForValuesAffectingSelectedNodes", + "keyPathsForValuesAffectingSelectedObjects", + "keyPathsForValuesAffectingSelectionIndexPath" + ], + "CPTreeNode": [ + "treeNodeWithRepresentedObject:" + ], + "CPTypesetter": [ + "initialize", + "sharedSystemTypesetter" + ], + "CPURL": [ + "URLWithString:", + "URLWithString:relativeToURL:", + "alloc" + ], + "CPURLConnection": [ + "connectionWithRequest:delegate:", + "sendAsynchronousRequest:", + "sendAsynchronousRequest:queue:completionHandler:", + "sendSynchronousRequest:returningResponse:", + "sendSynchronousRequest:returningResponse:error:", + "setClassDelegate:" + ], + "CPURLRequest": [ + "requestWithURL:", + "requestWithURL:cachePolicy:timeoutInterval:" + ], + "CPURLResponse": [], + "CPUnarchiveFromDataTransformer": [ + "allowsReverseTransformation", + "transformedValueClass" + ], + "CPUndoManager": [], + "CPUserDefaults": [ + "resetStandardUserDefaults", + "standardUserDefaults" + ], + "CPUserDefaultsController": [ + "sharedUserDefaultsController" + ], + "CPUserDefaultsCookieStore": [], + "CPUserDefaultsLocalStore": [ + "supportsLocalStorage" + ], + "CPUserDefaultsStore": [], + "CPUserNotification": [], + "CPUserNotificationCenter": [ + "defaultUserNotificationCenter" + ], + "CPUserSessionManager": [ + "defaultManager" + ], + "CPValue": [ + "valueWithJSObject:" + ], + "CPValueTransformer": [ + "allowsReverseTransformation", + "initialize", + "setValueTransformer:forName:", + "transformedValueClass", + "valueTransformerForName:", + "valueTransformerNames" + ], + "CPValueWithPatternBinding": [], + "CPView": [ + "animatorClass", + "defaultAnimationForKey:", + "defaultMenu", + "defaultThemeClass", + "initialize", + "isHighDPIDrawingEnabled", + "keyPathsForValuesAffectingBounds", + "keyPathsForValuesAffectingFrame", + "setHighDPIDrawingEnabled:", + "themeAttributes" + ], + "CPViewAnimation": [], + "CPViewAnimator": [ + "addAnimations:forAction:", + "addFrameUpdaters:forAction:", + "stopUpdaterWithIdentifier:" + ], + "CPViewController": [ + "initialize" + ], + "CPVisualEffectView": [], + "CPWebScriptObject": [], + "CPWebView": [], + "CPWindow": [ + "constrainWindowsToUsableScreen", + "frameRectForContentRect:styleMask:", + "globalResizeStyle", + "setConstrainWindowsToUsableScreen:", + "setGlobalResizeStyle:" + ], + "CPWindowController": [], + "CPWorkspace": [ + "sharedWorkspace" + ], + "HandImageLayer": [], + "HandLayer": [], + "HoursLayer": [] + }, + "construction": { + "CPAccordionView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPBox": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [ + "CPView" + ], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPBrowser": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [ + "CPScrollView" + ], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPButton": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPButtonBar": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPCheckBox": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPClipView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPCollectionView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber", + "isSelectable": "CPNumber" + }, + "CPColorWell": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPComboBox": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "drawsBackground": "nil", + "isBordered": "CPNumber", + "isEditable": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "isSelectable": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPControl": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPDatePicker": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "drawsBackground": "CPNumber", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPDisclosureButton": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPImageView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEditable": "nil", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPLevelIndicator": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEditable": "nil", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPOutlineView": { + "frameSize": "{\"width\":0,\"height\":0}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPPopUpButton": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPPredicateEditor": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEditable": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "nil" + }, + "CPProgressIndicator": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "CPNumber", + "isHidden": "CPNumber" + }, + "CPRadio": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isBordered": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPRuleEditor": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEditable": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "nil" + }, + "CPRulerView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPScrollView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [ + "CPClipView", + "CPClipView", + "CPScroller", + "CPScroller", + "CPView" + ], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPScroller": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPSearchField": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [ + "CPButton", + "CPButton" + ], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "drawsBackground": "nil", + "isBordered": "CPNumber", + "isEditable": "CPNumber", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "isSelectable": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPSecureTextField": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "nil", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "drawsBackground": "nil", + "isBordered": "CPNumber", + "isEditable": "nil", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "isSelectable": "nil", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPSegmentedControl": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPShadowView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPSlider": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPSplitView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPStackView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPStepper": { + "frameSize": "{\"width\":0,\"height\":0}", + "subviews": [ + "CPButton", + "CPButton" + ], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPTabView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPTableCellView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPTableHeaderView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPTableView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPText": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isEditable": "nil", + "isHidden": "CPNumber", + "isSelectable": "nil" + }, + "CPTextField": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "nil", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "drawsBackground": "nil", + "isBordered": "CPNumber", + "isEditable": "nil", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "isSelectable": "nil", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPTextView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "isEditable": "CPNumber", + "isHidden": "CPNumber", + "isSelectable": "CPNumber" + }, + "CPTokenField": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [ + "CPScrollView" + ], + "acceptsFirstResponder": "nil", + "alignment": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "bezelStyle": "CPNumber", + "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "drawsBackground": "nil", + "isBordered": "CPNumber", + "isEditable": "nil", + "isEnabled": "CPNumber", + "isHidden": "CPNumber", + "isSelectable": "nil", + "lineBreakMode": "CPNumber", + "verticalAlignment": "CPNumber" + }, + "CPView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + }, + "CPVisualEffectView": { + "frameSize": "{\"width\":100,\"height\":100}", + "subviews": [], + "acceptsFirstResponder": "CPNumber", + "autoresizingMask": "CPNumber", + "backgroundColor": "nil", + "isHidden": "CPNumber" + } + }, + "windows": { + "borderless": [ + "CPView" + ], + "titled": [ + "CPTextField", + "CPView", + "CPView", + "CPView" + ], + "closable": [ + "CPButton", + "CPTextField", + "CPView", + "CPView", + "CPView" + ], + "resizable": [ + "CPButton", + "CPTextField", + "CPView", + "CPView", + "CPView" + ], + "miniaturizable": [ + "CPButton", + "CPButton", + "CPTextField", + "CPView", + "CPView", + "CPView" + ], + "full": [ + "CPButton", + "CPButton", + "CPTextField", + "CPView", + "CPView", + "CPView" + ], + "hud": [ + "CPTextField", + "CPView" + ], + "hudClosable": [ + "CPButton", + "CPTextField", + "CPView" + ] + } +} From fcf94a5df26e31590069de8df1484ee5df30bfb7 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 16:42:22 -0600 Subject: [PATCH 02/15] Tests: Add CPOutlineView row content regression tests Protects custom row rendering by verifying that content remains synchronized and current through standard operational cycles. * CPOutlineViewRowContentTest: Verifies that selection changes, scrolling, column resizing and hiding, item expansion and collapse, data reloads, and grid or row style modifications trigger complete redraws for visible rows; ensures row content remains unoccluded and idle tables do not execute redundant redrawing. --- Tests/AppKit/CPOutlineViewRowContentTest.j | 400 +++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 Tests/AppKit/CPOutlineViewRowContentTest.j diff --git a/Tests/AppKit/CPOutlineViewRowContentTest.j b/Tests/AppKit/CPOutlineViewRowContentTest.j new file mode 100644 index 000000000..ebf3939f0 --- /dev/null +++ b/Tests/AppKit/CPOutlineViewRowContentTest.j @@ -0,0 +1,400 @@ +/* + * CPOutlineViewRowContentTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + Applications draw their own content on table and outline rows. A source list + draws a count badge beside an item, for example, as SmartFoldersDemo does in its + BadgedOutlineView. That content is correct only if the table keeps redrawing it + as a person uses the table. + + These tests take such a view through ordinary use: selecting, scrolling, resizing + a column, expanding an item, reloading. After each action, the table must ask for + its content again, and only for the rows now on screen. + + The tests observe what a subclass observes. They do not depend on which view + performs the table's drawing. +*/ +@implementation RowContentItem : CPObject +{ + CPString title @accessors; + CPArray children @accessors; +} + ++ (id)itemWithTitle:(CPString)aTitle children:(CPArray)someChildren +{ + var item = [[self alloc] init]; + + [item setTitle:aTitle]; + [item setChildren:someChildren]; + + return item; +} + +@end + +/* + Records what it is asked to draw, in place of drawing. The default implementations + need a canvas, which a unit test does not have. +*/ +@implementation RowContentOutlineView : CPOutlineView +{ + CPArray drawnSteps @accessors; + CPArray drawnRows @accessors; + CPArray drawnClipRects @accessors; +} + +- (void)drawBackgroundInClipRect:(CGRect)aRect +{ + [drawnSteps addObject:@"background"]; +} + +- (void)highlightSelectionInClipRect:(CGRect)aRect +{ + [drawnSteps addObject:@"selection"]; +} + +- (void)drawGridInClipRect:(CGRect)aRect +{ + [drawnSteps addObject:@"grid"]; +} + +- (void)drawRow:(CPInteger)aRow clipRect:(CGRect)aRect +{ + [drawnRows addObject:aRow]; + [drawnClipRects addObject:aRect]; +} + +@end + +@implementation CPOutlineViewRowContentTest : OJTestCase +{ + CPWindow theWindow; + CPScrollView scrollView; + RowContentOutlineView outlineView; + CPTableColumn firstColumn; + CPTableColumn secondColumn; + CPArray rootItems; + CPView drawingView; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) styleMask:CPWindowNotSizable]; + + rootItems = []; + + for (var index = 0; index < 40; index++) + { + var children = [[RowContentItem itemWithTitle:@"Child A" children:[]], + [RowContentItem itemWithTitle:@"Child B" children:[]]]; + + rootItems.push([RowContentItem itemWithTitle:@"Item" children:children]); + } + + firstColumn = [[CPTableColumn alloc] initWithIdentifier:@"First"]; + secondColumn = [[CPTableColumn alloc] initWithIdentifier:@"Second"]; + + outlineView = [[RowContentOutlineView alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 200.0)]; + [outlineView setDrawnSteps:[]]; + [outlineView setDrawnRows:[]]; + [outlineView setDrawnClipRects:[]]; + [outlineView addTableColumn:firstColumn]; + [outlineView addTableColumn:secondColumn]; + [outlineView setOutlineTableColumn:firstColumn]; + + scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 200.0)]; + [scrollView setDocumentView:outlineView]; + [[theWindow contentView] addSubview:scrollView]; + + [outlineView setDataSource:self]; + [outlineView reloadData]; + + [self settle]; +} + +- (id)outlineView:(CPOutlineView)anOutlineView child:(CPInteger)anIndex ofItem:(id)anItem +{ + return anItem ? [anItem children][anIndex] : rootItems[anIndex]; +} + +- (BOOL)outlineView:(CPOutlineView)anOutlineView isItemExpandable:(id)anItem +{ + return [[anItem children] count] > 0; +} + +- (int)outlineView:(CPOutlineView)anOutlineView numberOfChildrenOfItem:(id)anItem +{ + return anItem ? [[anItem children] count] : rootItems.length; +} + +- (id)outlineView:(CPOutlineView)anOutlineView objectValueForTableColumn:(CPTableColumn)aColumn byItem:(id)anItem +{ + return [anItem title]; +} + +/* + The views that make up the table: the outline view and its subviews. Controls + are left out. Data views and disclosure buttons draw themselves, and they need + a canvas to do so. +*/ +- (CPArray)tableViews +{ + return [outlineView].concat([outlineView subviews].filter(function(aView) + { + return ![aView isKindOfClass:[CPControl class]]; + })); +} + +/* + Brings the table to rest, as the end of a display cycle does: the layout is + current, nothing is waiting to draw, and nothing has been recorded. +*/ +- (void)settle +{ + [outlineView layoutIfNeeded]; + [[self tableViews] makeObjectsPerformSelector:@selector(displayIfNeeded)]; + + [[outlineView drawnSteps] removeAllObjects]; + [[outlineView drawnRows] removeAllObjects]; + [[outlineView drawnClipRects] removeAllObjects]; +} + +/* + CPView does not draw without a DOM, so the display cycle cannot reach drawRect: + in a unit test. This does its work: it lays the table out, then sends drawRect: + to each view that has been marked for display, and only to those. +*/ +- (void)redraw +{ + [outlineView layoutIfNeeded]; + + var graphicsPort = { path: NULL, gState: CGGStateCreate(), gStateStack: [] }; + + [CPGraphicsContext setCurrentContext:[CPGraphicsContext graphicsContextWithGraphicsPort:graphicsPort flipped:YES]]; + + drawingView = nil; + + [self tableViews].forEach(function(aView) + { + if (![aView needsDisplay]) + return; + + var rowCount = [[outlineView drawnRows] count]; + + [aView drawRect:[aView bounds]]; + + if ([[outlineView drawnRows] count] > rowCount) + drawingView = aView; + }); +} + +/* + A badge has to remain visible, including on a selected or alternating row. So the + view that draws the row content must stay in front of anything that paints a row. + Only controls may sit in front of it. Without a DOM a subview may not yet have + its colors, so this does not look at colors. It looks at what is in front. +*/ +- (void)assertNothingCoversRowContent:(CPString)anAction +{ + var subviews = [outlineView subviews], + firstCovering = drawingView === outlineView ? 0 : [subviews indexOfObject:drawingView] + 1; + + for (var index = firstCovering; index < [subviews count]; index++) + { + var aView = subviews[index]; + + if ([aView isKindOfClass:[CPControl class]] || [aView isHidden]) + continue; + + [self fail:anAction + ": " + [aView className] + " covers the row content"]; + } +} + +- (CPArray)rowsOnScreen +{ + var range = [outlineView rowsInRect:[outlineView exposedRect]], + rows = []; + + for (var row = range.location; row < CPMaxRange(range); row++) + rows.push(row); + + return rows; +} + +/* + The table has been redrawn through each of its drawing steps, for exactly the + rows on screen, and each row was asked to draw only within the visible part of + the table. +*/ +- (void)assertRowContentIsCurrentAfter:(CPString)anAction +{ + [self redraw]; + + var rows = [self rowsOnScreen], + exposedRect = [outlineView exposedRect]; + + [self assert:[@"background", @"selection", @"grid"] equals:[outlineView drawnSteps] message:anAction]; + [self assert:rows equals:[outlineView drawnRows] message:anAction]; + + [outlineView drawnClipRects].forEach(function(aRect) + { + [self assertTrue:CGRectContainsRect(exposedRect, aRect) message:anAction + ": clip rect is outside the visible area"]; + }); + + [self assertNothingCoversRowContent:anAction]; +} + +/* + Redrawing costs time, and a table can be large. A table with nothing to change + has nothing to draw. +*/ +- (void)testNothingIsRedrawnWithoutAChange +{ + [self redraw]; + + [self assert:[] equals:[outlineView drawnSteps]]; + [self assert:[] equals:[outlineView drawnRows]]; +} + +- (void)testContentIsDrawnWhenTheOutlineFirstAppears +{ + [outlineView setNeedsDisplay:YES]; + + [self assertRowContentIsCurrentAfter:@"first display"]; +} + +- (void)testContentIsRedrawnAfterSelectingARow +{ + [outlineView selectRowIndexes:[CPIndexSet indexSetWithIndex:2] byExtendingSelection:NO]; + + [self assertRowContentIsCurrentAfter:@"selecting a row"]; +} + +- (void)testContentIsRedrawnAfterChangingTheSelection +{ + [outlineView selectRowIndexes:[CPIndexSet indexSetWithIndex:2] byExtendingSelection:NO]; + [self settle]; + + [outlineView selectRowIndexes:[CPIndexSet indexSetWithIndex:4] byExtendingSelection:NO]; + + [self assertRowContentIsCurrentAfter:@"changing the selection"]; +} + +- (void)testContentIsRedrawnAfterClearingTheSelection +{ + [outlineView selectRowIndexes:[CPIndexSet indexSetWithIndex:2] byExtendingSelection:NO]; + [self settle]; + + [outlineView deselectAll:nil]; + + [self assertRowContentIsCurrentAfter:@"clearing the selection"]; +} + +- (void)testContentIsRedrawnAfterSelectingAColumn +{ + [outlineView selectColumnIndexes:[CPIndexSet indexSetWithIndex:1] byExtendingSelection:NO]; + + [self assertRowContentIsCurrentAfter:@"selecting a column"]; +} + +- (void)testContentIsRedrawnAfterChangingTheGridStyle +{ + [outlineView setGridStyleMask:CPTableViewSolidVerticalGridLineMask]; + + [self assertRowContentIsCurrentAfter:@"changing the grid style"]; +} + +- (void)testContentIsRedrawnAfterChangingTheGridColor +{ + [outlineView setGridColor:[CPColor redColor]]; + + [self assertRowContentIsCurrentAfter:@"changing the grid color"]; +} + +- (void)testContentIsRedrawnAfterChangingTheRowColors +{ + [outlineView setAlternatingRowBackgroundColors:[[CPColor redColor], [CPColor blueColor]]]; + + [self assertRowContentIsCurrentAfter:@"changing the row colors"]; +} + +- (void)testContentIsRedrawnAfterChangingTheHighlightStyle +{ + [outlineView setSelectionHighlightStyle:CPTableViewSelectionHighlightStyleNone]; + + [self assertRowContentIsCurrentAfter:@"changing the highlight style"]; +} + +- (void)testContentIsRedrawnAfterReloadingTheData +{ + [outlineView reloadData]; + + [self assertRowContentIsCurrentAfter:@"reloading the data"]; +} + +- (void)testContentIsRedrawnForTheNewRowsAfterScrolling +{ + var firstRows = [self rowsOnScreen]; + + [[scrollView contentView] scrollToPoint:CGPointMake(0.0, 300.0)]; + + [self assertFalse:[firstRows isEqual:[self rowsOnScreen]] message:@"scrolling must change the rows on screen"]; + [self assertRowContentIsCurrentAfter:@"scrolling"]; +} + +- (void)testContentIsRedrawnAfterResizingAColumn +{ + [secondColumn setWidth:40.0]; + + [self assertRowContentIsCurrentAfter:@"resizing a column"]; +} + +- (void)testContentIsRedrawnAfterHidingAColumn +{ + [secondColumn setHidden:YES]; + + [self assertRowContentIsCurrentAfter:@"hiding a column"]; +} + +- (void)testContentIsRedrawnAfterExpandingAnItem +{ + [outlineView expandItem:rootItems[1]]; + + [self assertRowContentIsCurrentAfter:@"expanding an item"]; +} + +- (void)testContentIsRedrawnAfterCollapsingAnItem +{ + [outlineView expandItem:rootItems[1]]; + [self settle]; + + [outlineView collapseItem:rootItems[1]]; + + [self assertRowContentIsCurrentAfter:@"collapsing an item"]; +} + +@end From e3bb38134bf1d389c66df8fabb65474c8f9f0573 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 19:45:45 -0600 Subject: [PATCH 03/15] Tests: Improve drop-in snapshot and regenerate baseline The drop-in baseline preserves framework backward-compatibility contracts by recording expected defaults and states. Explicit value comparisons are enforced and omitted snapshot entries are reported to detect unintended default modifications. * DropInSnapshot: * Record booleans, numbers and strings by value. * Serialize plain objects with sorted keys, and record functions and circular references without raising an exception. * Extract DropInViewState, and isolate each getter so that an exception leaves the remaining state intact. * Add throwIfError, so that a generator does not save an exception as expected state. * Add a skipped list that names each class or window style left out of a snapshot. * Add DropInCibTree, with view, menu and object descriptions and a cib owner, to describe the objects a cib produces. * DropInBaselineGenerator: Pass throwIfError and print each skipped entry. * DropInBaseline: Regenerate with recorded values and sorted keys. --- Tests/AppKit/DropInBaselineGenerator.j | 4 +- Tests/AppKit/DropInSnapshot.j | 339 ++++-- Tests/AppKit/Resources/DropInBaseline.json | 1094 ++++++++++---------- 3 files changed, 811 insertions(+), 626 deletions(-) diff --git a/Tests/AppKit/DropInBaselineGenerator.j b/Tests/AppKit/DropInBaselineGenerator.j index 9d77db9f8..9238101e7 100644 --- a/Tests/AppKit/DropInBaselineGenerator.j +++ b/Tests/AppKit/DropInBaselineGenerator.j @@ -35,7 +35,8 @@ function main(args, namedArgs) { [[CPApplication alloc] init]; - var snapshot = DropInCreateSnapshot(), + var skipped = [], + snapshot = DropInCreateSnapshot(YES, skipped), baselinePath = path.join(process.cwd(), "Tests", "AppKit", "Resources", "DropInBaseline.json"); fs.writeFileSync(baselinePath, JSON.stringify(snapshot, null, 1) + "\n"); @@ -45,4 +46,5 @@ function main(args, namedArgs) Object.keys(snapshot.themeAttributes).length + " themed classes, " + Object.keys(snapshot.construction).length + " constructed views, " + Object.keys(snapshot.windows).length + " window styles"); + skipped.forEach(function(aLine) { print("skipped " + aLine); }); } diff --git a/Tests/AppKit/DropInSnapshot.j b/Tests/AppKit/DropInSnapshot.j index f16ea3d0f..6be7b06eb 100644 --- a/Tests/AppKit/DropInSnapshot.j +++ b/Tests/AppKit/DropInSnapshot.j @@ -23,58 +23,112 @@ @import /* - An application that updates its frameworks relies on more than documented - behavior. It relies on the defaults a class supplies when no theme overrides - them, on the public methods it calls and overrides, and on the state a control - has when it is created. Together these form the drop-in contract. + An application that updates its frameworks relies on more than documented + behavior. It relies on the defaults a class supplies when no theme overrides + them, on the public methods it calls and overrides, and on the state a control + has when it is created. Together these form the drop-in contract. - This file records that contract as plain data. DropInBaselineGenerator.j saves - a snapshot as the baseline, and DropInBaselineTest.j compares the running - frameworks with it. Additions are allowed. Changes and removals are not. -*/ + This file records that contract as plain data. DropInBaselineGenerator.j saves + a snapshot as the baseline, and DropInBaselineTest.j compares the running + frameworks with it. Additions are allowed. Changes and removals are not. + */ var DropInConstructionGetters = [ - @"acceptsFirstResponder", - @"alignment", - @"autoresizingMask", - @"backgroundColor", - @"bezelStyle", - @"controlSize", - @"drawsBackground", - @"isBordered", - @"isEditable", - @"isEnabled", - @"isHidden", - @"isSelectable", - @"lineBreakMode", - @"verticalAlignment" - ], + @"acceptsFirstResponder", + @"alignment", + @"autoresizingMask", + @"backgroundColor", + @"bezelStyle", + @"controlSize", + @"drawsBackground", + @"isBordered", + @"isEditable", + @"isEnabled", + @"isHidden", + @"isSelectable", + @"lineBreakMode", + @"verticalAlignment" +], - DropInWindowStyles = { - @"borderless": CPBorderlessWindowMask, - @"titled": CPTitledWindowMask, - @"closable": CPClosableWindowMask, - @"resizable": CPClosableWindowMask | CPResizableWindowMask, - @"miniaturizable": CPClosableWindowMask | CPMiniaturizableWindowMask, - @"full": CPClosableWindowMask | CPMiniaturizableWindowMask | CPResizableWindowMask, - @"hud": CPHUDBackgroundWindowMask, - @"hudClosable": CPHUDBackgroundWindowMask | CPClosableWindowMask - }; +DropInWindowStyles = { + @"borderless": CPBorderlessWindowMask, + @"titled": CPTitledWindowMask, + @"closable": CPClosableWindowMask, + @"resizable": CPClosableWindowMask | CPResizableWindowMask, + @"miniaturizable": CPClosableWindowMask | CPMiniaturizableWindowMask, + @"full": CPClosableWindowMask | CPMiniaturizableWindowMask | CPResizableWindowMask, + @"hud": CPHUDBackgroundWindowMask, + @"hudClosable": CPHUDBackgroundWindowMask | CPClosableWindowMask +}; function DropInIsPublicName(aName) { return aName.charAt(0) !== "_" && aName.charAt(0) !== "$"; } +function DropInSerializeObject(val, seen) +{ + if (val === null || val === undefined) + return nil; + + if (typeof val === "function") + return "[Function]"; + + if (typeof val !== "object") + return val; + + if (seen.indexOf(val) !== -1) + return "[Circular]"; + + seen.push(val); + + var result; + + if (Array.isArray(val)) + { + result = []; + for (var i = 0; i < val.length; i++) + { + result[i] = DropInSerializeObject(val[i], seen); + } + } + else + { + result = {}; + var keys = Object.keys(val).sort(); + for (var i = 0; i < keys.length; i++) + { + var k = keys[i]; + result[k] = DropInSerializeObject(val[k], seen); + } + } + + seen.pop(); + + return result; +} + +function DropInSafeJSONStringify(aValue) +{ + return JSON.stringify(DropInSerializeObject(aValue, [])); +} + /* - Reduces a value to a string that does not depend on object identity, so that - two runs of the same framework produce the same snapshot. -*/ + Reduces a value to a string that does not depend on object identity, so that + two runs of the same framework produce the same snapshot. + */ function DropInDescribeValue(aValue) { if (aValue === nil || aValue === undefined) return "nil"; + /* + Booleans, numbers and strings answer to isa as well, so they must be handled + first, or they are recorded by class and their values are never compared. + */ + if (typeof aValue === "boolean" || typeof aValue === "number" || typeof aValue === "string") + return String(aValue); + if (aValue === [CPNull null]) return "CPNull"; @@ -84,9 +138,9 @@ function DropInDescribeValue(aValue) return "CPColor:" + [aValue cssString]; /* - The system font is a global setting that applications and tests change, - so a default that uses it records only that fact. - */ + The system font is a global setting that applications and tests change, + so a default that uses it records only that fact. + */ if ([aValue isKindOfClass:[CPFont class]]) return [aValue isSystem] ? "CPFont:system" + ([aValue isBold] ? " bold" : "") : "CPFont:" + [aValue cssString]; @@ -96,16 +150,13 @@ function DropInDescribeValue(aValue) return aValue.isa.name; } - if (typeof aValue === "object") - return JSON.stringify(aValue); - - return String(aValue); + return DropInSafeJSONStringify(aValue); } function DropInMethodNames(aClass) { return class_copyMethodList(aClass).map(function(aMethod) - { + { return method_getName(aMethod); }).filter(DropInIsPublicName).sort(); } @@ -121,10 +172,10 @@ function DropInThemeAttributes(aClass) return nil; var result = {}, - keys = [[attributes allKeys] sortedArrayUsingSelector:@selector(compare:)]; + keys = [[attributes allKeys] sortedArrayUsingSelector:@selector(compare:)]; keys.forEach(function(aKey) - { + { result[aKey] = DropInDescribeValue([attributes objectForKey:aKey]); }); @@ -134,28 +185,144 @@ function DropInThemeAttributes(aClass) function DropInSubviewClasses(aView) { return [aView subviews].map(function(aSubview) - { + { return aSubview.isa.name; }).filter(DropInIsPublicName).sort(); } -function DropInDefaultConstruction(aClass) +function DropInViewState(aView, throwIfError) { - var view = [[aClass alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)], - result = { - @"frameSize": DropInDescribeValue([view frameSize]), - @"subviews": DropInSubviewClasses(view) - }; + var result = { + @"frameSize": DropInDescribeValue([aView frameSize]), + @"subviews": DropInSubviewClasses(aView) + }; DropInConstructionGetters.forEach(function(aGetter) - { - if ([view respondsToSelector:CPSelectorFromString(aGetter)]) - result[aGetter] = DropInDescribeValue([view performSelector:CPSelectorFromString(aGetter)]); + { + var selector = CPSelectorFromString(aGetter); + + if ([aView respondsToSelector:selector]) + { + try + { + result[aGetter] = DropInDescribeValue([aView performSelector:selector]); + } + catch (anException) + { + if (throwIfError) + throw anException; + + result[aGetter] = "[Exception: " + String(anException) + "]"; + } + } }); return result; } +function DropInDefaultConstruction(aClass, throwIfError) +{ + return DropInViewState([[aClass alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)], throwIfError); +} + +/* + Describes a view and its public subviews, in order. Private views are left out, + because they are the class's own concern. + */ +function DropInViewTree(aView) +{ + return { + @"class": aView.isa.name, + @"frame": DropInDescribeValue([aView frame]), + @"subviews": [aView subviews].filter(function(aSubview) + { + return DropInIsPublicName(aSubview.isa.name); + }).map(DropInViewTree) + }; +} + +function DropInMenuTree(aMenu) +{ + return [aMenu itemArray].map(function(anItem) + { + return { + @"title": [anItem title], + @"keyEquivalent": [anItem keyEquivalent], + @"submenu": [anItem hasSubmenu] ? DropInMenuTree([anItem submenu]) : nil + }; + }); +} + +/* + Describes what a cib produced. Objects other than windows, views and menus are + recorded by class alone. + */ +function DropInObjectTree(anObject) +{ + if ([anObject isKindOfClass:[CPWindow class]]) + return { @"class": anObject.isa.name, @"title": [anObject title], @"contentView": DropInViewTree([anObject contentView]) }; + + if ([anObject isKindOfClass:[CPView class]]) + return DropInViewTree(anObject); + + if ([anObject isKindOfClass:[CPMenu class]]) + return { @"class": anObject.isa.name, @"items": DropInMenuTree(anObject) }; + + return { @"class": anObject.isa.name }; +} + +/* + The owner of the reference cibs. It has the outlets and actions that those cibs + connect to it, so that loading them gives no warnings. + */ +@implementation _DropInCibOwner : CPObject +{ + id folderNameField; + id predicateEditor; + id predicateSheet; + id textView; + id window; +} + +- (void)closeSheet:(id)aSender +{ +} + +@end + +/* + Loads a cib and describes its top level objects, sorted so that the order in + which the cib lists them does not matter. + + A scroll view takes its scroller style from a global setting when it is decoded, + and that style changes the frames inside it. Applications and tests change the + setting, so each cib loads with the same style. Layout also changes frames and + adds subviews, so it is complete before anything is described. + */ +function DropInCibTree(aCibName, aRawString) +{ + var topLevelObjects = [], + cib = [[CPCib alloc] _initWithData:[CPData dataWithRawString:aRawString] bundle:nil cibName:aCibName], + scrollerStyle = [CPScrollView globalScrollerStyle]; + + [CPScrollView setGlobalScrollerStyle:CPScrollerStyleLegacy]; + + try + { + [cib instantiateCibWithExternalNameTable:@{ CPCibOwner: [[_DropInCibOwner alloc] init], CPCibTopLevelObjects: topLevelObjects }]; + [_CPDisplayServer run]; + + return topLevelObjects.map(DropInObjectTree).map(function(aTree) + { + return JSON.stringify(aTree); + }).sort(); + } + finally + { + [CPScrollView setGlobalScrollerStyle:scrollerStyle]; + } +} + function DropInClassIsView(aClass) { var viewClass = [CPView class]; @@ -170,38 +337,42 @@ function DropInClassIsView(aClass) function DropInSortedClasses() { var classes = [], - count = objj_getClassList(classes, 1 << 16); + count = objj_getClassList(classes, 1 << 16); return classes.slice(0, count).filter(function(aClass) - { + { return aClass && aClass.name.indexOf("$") !== 0; }).sort(function(lhs, rhs) - { + { return lhs.name < rhs.name ? -1 : (lhs.name > rhs.name ? 1 : 0); }); } /* - Some classes cannot be created without a surrounding object, or without a DOM. - A class that cannot be created is left out of the construction section, and the - comparison does not report it. This reduces coverage, but it cannot report a - false difference. -*/ -function DropInCreateSnapshot() + Some classes cannot be created without a surrounding object, or without a DOM. + A class that cannot be created is left out of the construction section, and the + comparison does not report it. This reduces coverage, but it cannot report a + false difference. + + A generator passes throwIfError, so that a getter that throws is not saved as + expected state, and passes skipped, to list each class or window style that is + left out. + */ +function DropInCreateSnapshot(throwIfError, skipped) { var snapshot = { - @"publicClasses": [], - @"themeAttributes": {}, - @"instanceMethods": {}, - @"classMethods": {}, - @"construction": {}, - @"windows": {} - }; + @"publicClasses": [], + @"themeAttributes": {}, + @"instanceMethods": {}, + @"classMethods": {}, + @"construction": {}, + @"windows": {} + }; DropInSortedClasses().forEach(function(aClass) - { + { var name = aClass.name, - isPublic = DropInIsPublicName(name); + isPublic = DropInIsPublicName(name); try { @@ -212,6 +383,8 @@ function DropInCreateSnapshot() } catch (anException) { + if (skipped) + skipped.push(name + " theme attributes: " + String(anException).slice(0, 80)); } if (!isPublic) @@ -226,19 +399,29 @@ function DropInCreateSnapshot() try { - snapshot.construction[name] = DropInDefaultConstruction(aClass); + snapshot.construction[name] = DropInDefaultConstruction(aClass, throwIfError); } catch (anException) { + if (skipped) + skipped.push(name + " construction: " + String(anException).slice(0, 80)); } }); for (var style in DropInWindowStyles) { - var aWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) - styleMask:DropInWindowStyles[style]]; + try + { + var aWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) + styleMask:DropInWindowStyles[style]]; - snapshot.windows[style] = DropInSubviewClasses([aWindow _windowView]); + snapshot.windows[style] = DropInSubviewClasses([aWindow _windowView]); + } + catch (anException) + { + if (skipped) + skipped.push(style + " window style: " + String(anException).slice(0, 80)); + } } return snapshot; diff --git a/Tests/AppKit/Resources/DropInBaseline.json b/Tests/AppKit/Resources/DropInBaseline.json index 0338c210a..050fcea53 100644 --- a/Tests/AppKit/Resources/DropInBaseline.json +++ b/Tests/AppKit/Resources/DropInBaseline.json @@ -238,20 +238,20 @@ "CPBox": { "background-color": "CPNull", "border-color": "CPNull", - "border-width": "CPNumber", - "content-adjustment": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}", - "content-margin": "{\"width\":0,\"height\":0}", - "corner-radius": "CPNumber", + "border-width": "1", + "content-adjustment": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "content-margin": "{\"height\":0,\"width\":0}", + "corner-radius": "3", "inner-shadow-color": "CPNull", - "inner-shadow-offset": "{\"width\":0,\"height\":0}", - "inner-shadow-size": "CPNumber", - "min-y-correction-no-title": "CPNumber", - "min-y-correction-title": "CPNumber", - "nib2cib-adjustment-primary-frame": "{\"origin\":{\"x\":4,\"y\":-4},\"size\":{\"width\":-8,\"height\":-6}}", + "inner-shadow-offset": "{\"height\":0,\"width\":0}", + "inner-shadow-size": "6", + "min-y-correction-no-title": "0", + "min-y-correction-title": "0", + "nib2cib-adjustment-primary-frame": "{\"origin\":{\"x\":4,\"y\":-4},\"size\":{\"height\":-6,\"width\":-8}}", "title-color": "CPNull", "title-font": "CPNull", - "title-left-offset": "CPNumber", - "title-top-offset": "CPNumber" + "title-left-offset": "5", + "title-top-offset": "0" }, "CPBrowser": { "image-control-leaf": "CPNull", @@ -259,19 +259,19 @@ "image-control-resize": "CPNull" }, "CPButton": { - "alignment": "CPNumber", + "alignment": "2", "bezel-color": "CPNull", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "image": "CPNull", "image-color": "CPNull", - "image-offset": "CPNumber", - "image-position": "CPNumber", - "image-scaling": "CPNumber", - "image-vertical-offset": "CPNumber", - "invert-image": "CPNumber", - "invert-image-on-push": "CPNumber", - "vertical-alignment": "CPNumber" + "image-offset": "0", + "image-position": "2", + "image-scaling": "2", + "image-vertical-offset": "0", + "invert-image": "false", + "invert-image-on-push": "false", + "vertical-alignment": "2" }, "CPButtonBar": { "bezel-color": "CPNull", @@ -281,118 +281,118 @@ "button-image-plus": "CPNull", "button-text-color": "CPNull", "resize-control-color": "CPNull", - "resize-control-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "resize-control-size": "{\"width\":0,\"height\":0}" + "resize-control-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "resize-control-size": "{\"height\":0,\"width\":0}" }, "CPColor": { "alternate-selected-control-color": "CPNull", - "css-based": "CPNumber", + "css-based": "false", "secondary-selected-control-color": "CPNull", "selected-text-background-color": "CPNull", "selected-text-inactive-background-color": "CPNull" }, "CPColorWell": { "bezel-color": "CPNull", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "content-border-color": "CPNull", - "content-border-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset": "{\"top\":3,\"right\":3,\"bottom\":3,\"left\":3}" + "content-border-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset": "{\"bottom\":3,\"left\":3,\"right\":3,\"top\":3}" }, "CPComboBox": { - "border-inset": "{\"top\":3,\"right\":3,\"bottom\":3,\"left\":3}", - "popup-button-size": "{\"width\":21,\"height\":29}" + "border-inset": "{\"bottom\":3,\"left\":3,\"right\":3,\"top\":3}", + "popup-button-size": "{\"height\":29,\"width\":21}" }, "CPControl": { - "alignment": "CPNumber", + "alignment": "0", "font": "CPNull", - "image-position": "CPNumber", - "image-scaling": "CPNumber", - "line-break-mode": "CPNumber", - "max-size": "{\"width\":-1,\"height\":-1}", - "min-size": "{\"width\":0,\"height\":0}", + "image-position": "2", + "image-scaling": "1", + "line-break-mode": "2", + "max-size": "{\"height\":-1,\"width\":-1}", + "min-size": "{\"height\":0,\"width\":0}", "text-color": "CPColor:rgba(0, 0, 0, 1)", "text-shadow-color": "CPNull", - "text-shadow-offset": "{\"width\":0,\"height\":0}", - "vertical-alignment": "CPNumber" + "text-shadow-offset": "{\"height\":0,\"width\":0}", + "vertical-alignment": "1" }, "CPDatePicker": { "arrow-image-left": "CPNull", "arrow-image-left-highlighted": "CPNull", "arrow-image-right": "CPNull", "arrow-image-right-highlighted": "CPNull", - "arrow-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "arrow-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "bezel-color": "CPColor:rgba(0, 0, 0, 0)", "bezel-color-calendar": "CPColor:rgba(0, 0, 0, 0)", "bezel-color-calendar-left": "CPNull", "bezel-color-calendar-middle": "CPNull", "bezel-color-calendar-right": "CPNull", "bezel-color-clock": "CPColor:rgba(0, 0, 0, 0)", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "border-color": "CPColor:rgba(0, 0, 0, 0)", - "border-width": "CPNumber", - "calendar-clock-margin": "CPNumber", + "border-width": "1", + "calendar-clock-margin": "10", "circle-image": "CPNull", "circle-image-highlighted": "CPNull", - "clock-draws-hours": "CPNumber", + "clock-draws-hours": "false", "clock-font": "CPNull", "clock-hours-font": "CPNull", - "clock-hours-radius": "CPNumber", + "clock-hours-radius": "0", "clock-hours-text-color": "CPColor:rgba(0, 0, 0, 0)", - "clock-only-nib2cib-adjustment-frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}", - "clock-second-hand-over": "CPNumber", + "clock-only-nib2cib-adjustment-frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "clock-second-hand-over": "false", "clock-text-color": "CPColor:rgba(0, 0, 0, 1)", "clock-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", - "clock-text-shadow-offset": "{\"width\":0,\"height\":0}", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset-datepicker-textfield": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset-datepicker-textfield-separator": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "current-button-size": "{\"width\":0,\"height\":0}", - "date-hour-margin": "CPNumber", + "clock-text-shadow-offset": "{\"height\":0,\"width\":0}", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset-datepicker-textfield": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset-datepicker-textfield-separator": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "current-button-size": "{\"height\":0,\"width\":0}", + "date-hour-margin": "5", "datepicker-textfield-bezel-color": "CPColor:rgba(0, 0, 0, 0)", "day-label-inset": "CPNull", - "hour-ampm-margin": "CPNumber", + "hour-ampm-margin": "2", "hour-hand-image": "CPNull", - "hour-hand-size": "{\"width\":0,\"height\":0}", - "max-size-calendar": "{\"width\":0,\"height\":0}", + "hour-hand-size": "{\"height\":0,\"width\":0}", + "max-size-calendar": "{\"height\":0,\"width\":0}", "middle-hand-image": "CPNull", - "middle-hand-size": "{\"width\":0,\"height\":0}", - "min-size-calendar": "{\"width\":0,\"height\":0}", - "min-size-datepicker-textfield": "{\"width\":0,\"height\":0}", + "middle-hand-size": "{\"height\":0,\"width\":0}", + "min-size-calendar": "{\"height\":0,\"width\":0}", + "min-size-datepicker-textfield": "{\"height\":0,\"width\":0}", "minute-hand-image": "CPNull", - "minute-hand-size": "{\"width\":0,\"height\":0}", - "next-button-size": "{\"width\":0,\"height\":0}", - "previous-button-size": "{\"width\":0,\"height\":0}", + "minute-hand-size": "{\"height\":0,\"width\":0}", + "next-button-size": "{\"height\":0,\"width\":0}", + "previous-button-size": "{\"height\":0,\"width\":0}", "second-hand-image": "CPNull", - "second-hand-size": "{\"width\":0,\"height\":0}", + "second-hand-size": "{\"height\":0,\"width\":0}", "separator-color": "CPNull", - "separator-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "separator-height": "CPNumber", - "separator-margin-width": "CPNumber", - "size-calendar": "{\"width\":0,\"height\":0}", - "size-clock": "{\"width\":0,\"height\":0}", - "size-header": "{\"width\":0,\"height\":0}", - "size-tile": "{\"width\":0,\"height\":0}", - "stepper-margin": "CPNumber", - "tile-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "separator-content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "separator-height": "0", + "separator-margin-width": "0", + "size-calendar": "{\"height\":0,\"width\":0}", + "size-clock": "{\"height\":0,\"width\":0}", + "size-header": "{\"height\":0,\"width\":0}", + "size-tile": "{\"height\":0,\"width\":0}", + "stepper-margin": "5", + "tile-content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "tile-font": "CPNull", - "tile-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "tile-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "tile-margin": "CPNull", - "tile-text-alignment": "CPNumber", + "tile-text-alignment": "2", "tile-text-color": "CPColor:rgba(0, 0, 0, 1)", "tile-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", - "tile-text-shadow-offset": "{\"width\":0,\"height\":0}", - "tile-vertical-alignment": "CPNumber", - "time-separator-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "tile-text-shadow-offset": "{\"height\":0,\"width\":0}", + "tile-vertical-alignment": "2", + "time-separator-content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "title-font": "CPNull", "title-inset": "CPNull", "title-text-color": "CPColor:rgba(0, 0, 0, 1)", "title-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", - "title-text-shadow-offset": "{\"width\":0,\"height\":0}", - "uses-focus-ring": "CPNumber", + "title-text-shadow-offset": "{\"height\":0,\"width\":0}", + "uses-focus-ring": "false", "weekday-font": "CPNull", "weekday-text-color": "CPColor:rgba(0, 0, 0, 1)", "weekday-text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", - "weekday-text-shadow-offset": "{\"width\":0,\"height\":0}" + "weekday-text-shadow-offset": "{\"height\":0,\"width\":0}" }, "CPFont": { "system-font-face": "CPNull", @@ -407,18 +407,18 @@ "color-empty": "CPNull", "color-normal": "CPNull", "color-warning": "CPNull", - "spacing": "CPNumber" + "spacing": "1" }, "CPPopUpButton": { - "menu-offset": "{\"width\":0,\"height\":0}" + "menu-offset": "{\"height\":0,\"width\":0}" }, "CPProgressIndicator": { "bar-color": "CPNull", "bezel-color": "CPNull", "circular-border-color": "CPNull", - "circular-border-size": "CPNumber", + "circular-border-size": "1", "circular-color": "CPNull", - "default-height": "CPNumber", + "default-height": "20", "indeterminate-bar-color": "CPNull", "spinning-mini-gif": "CPNull", "spinning-regular-gif": "CPNull", @@ -442,88 +442,88 @@ }, "CPScroller": { "decrement-line-color": "CPNull", - "decrement-line-size": "{\"width\":0,\"height\":0}", + "decrement-line-size": "{\"height\":0,\"width\":0}", "increment-line-color": "CPNull", - "increment-line-size": "{\"width\":0,\"height\":0}", + "increment-line-size": "{\"height\":0,\"width\":0}", "knob-color": "CPNull", - "knob-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "knob-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "knob-slot-color": "CPNull", - "minimum-knob-length": "CPNumber", - "scroller-width": "CPNumber", - "track-border-overlay": "CPNumber", - "track-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}" + "minimum-knob-length": "21", + "scroller-width": "7", + "track-border-overlay": "9", + "track-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}" }, "CPSearchField": { "image-cancel": "CPNull", - "image-cancel-inset": "{\"top\":0,\"right\":5,\"bottom\":0,\"left\":0}", + "image-cancel-inset": "{\"bottom\":0,\"left\":0,\"right\":5,\"top\":0}", "image-cancel-pressed": "CPNull", "image-find": "CPNull", "image-search": "CPNull", - "image-search-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":5}", + "image-search-inset": "{\"bottom\":0,\"left\":5,\"right\":0,\"top\":0}", "layout-function": "CPNull", "search-button-rect-function": "CPNull", "search-menu-offset": "{\"x\":10,\"y\":-4}", - "search-right-margin": "CPNumber" + "search-right-margin": "2" }, "CPSegmentedControl": { - "alignment": "CPNumber", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "alignment": "2", + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "center-segment-bezel-color": "CPNull", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "divider-bezel-color": "CPNull", - "divider-thickness": "CPNumber", - "image-position": "CPNumber", - "image-scaling": "CPNumber", + "divider-thickness": "1", + "image-position": "2", + "image-scaling": "2", "left-segment-bezel-color": "CPNull", "right-segment-bezel-color": "CPNull", - "vertical-alignment": "CPNumber" + "vertical-alignment": "2" }, "CPShadowView": { "bezel-color": "CPNull", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}" + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}" }, "CPSlider": { - "bottom-margin": "CPNumber", - "direct-nib2cib-adjustment": "CPNumber", - "ib-size": "CPNumber", + "bottom-margin": "0", + "direct-nib2cib-adjustment": "false", + "ib-size": "-1", "knob-color": "CPNull", - "knob-offset": "CPNumber", - "knob-size": "{\"width\":0,\"height\":0}", + "knob-offset": "0", + "knob-size": "{\"height\":0,\"width\":0}", "left-track-color": "CPNull", "tick-mark-color": "CPNull", - "tick-mark-margin": "CPNumber", - "tick-mark-size": "{\"width\":0,\"height\":0}", - "top-margin": "CPNumber", + "tick-mark-margin": "0", + "tick-mark-size": "{\"height\":0,\"width\":0}", + "top-margin": "0", "track-color": "CPNull", - "track-width": "CPNumber" + "track-width": "0" }, "CPSplitView": { "divider-color": "CPColor:rgba(255, 0, 0, 1)", - "divider-thickness": "CPNumber", + "divider-thickness": "1", "horizontal-divider-color": "CPNull", "pane-divider-color": "CPColor:rgba(127, 127, 127, 1)", - "pane-divider-thickness": "CPNumber", + "pane-divider-thickness": "10", "vertical-divider-color": "CPNull" }, "CPStepper": { "bezel-color-down-button": "CPNull", "bezel-color-up-button": "CPNull", - "down-button-size": "{\"width\":0,\"height\":0}", - "up-button-size": "{\"width\":0,\"height\":0}" + "down-button-size": "{\"height\":0,\"width\":0}", + "up-button-size": "{\"height\":0,\"width\":0}" }, "CPTabView": { - "box-content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "box-content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "nib2cib-adjustment-frame": "CPNull", - "should-center-on-border": "CPNumber" + "should-center-on-border": "false" }, "CPTableHeaderView": { "background-color": "CPNull", "divider-color": "CPColor:rgba(127, 127, 127, 1)", - "divider-thickness": "CPNumber" + "divider-thickness": "1" }, "CPTableView": { "alternating-row-colors": "[CPColor:rgba(255, 255, 255, 1), CPColor:rgba(245, 249, 252, 1)]", - "default-row-height": "CPNumber", + "default-row-height": "25", "dropview-above-border-color": "CPNull", "dropview-above-border-width": "CPNull", "dropview-above-selected-border-color": "CPNull", @@ -537,8 +537,8 @@ "dropview-on-selected-border-radius": "CPNull", "dropview-on-selected-border-width": "CPNull", "grid-color": "CPColor:rgba(220, 224, 226, 1)", - "grid-line-thickness": "CPNumber", - "header-view-height": "CPNumber", + "grid-line-thickness": "1", + "header-view-height": "25", "highlighted-grid-color": "CPNull", "image-generic-file": "CPNull", "selection-color": "CPNull", @@ -548,52 +548,52 @@ "sourcelist-selection-color": "CPNull" }, "CPTextField": { - "background-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "background-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "bezel-color": "CPNull", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset": "{\"top\":1,\"right\":0,\"bottom\":0,\"left\":0}", - "min-size": "{\"width\":0,\"height\":29}" + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":1}", + "min-size": "{\"height\":29,\"width\":0}" }, "CPTokenField": { - "editor-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}" + "editor-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}" }, "CPView": { - "css-based": "CPNumber", + "css-based": "false", "dynamic-set": "CPNull", - "nib2cib-adjustment-frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}" + "nib2cib-adjustment-frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}" }, "_CPAlertThemeView": { - "button-offset": "CPNumber", - "content-inset": "{\"top\":15,\"right\":15,\"bottom\":15,\"left\":50}", - "default-elements-margin": "CPNumber", + "button-offset": "10", + "content-inset": "{\"bottom\":15,\"left\":50,\"right\":15,\"top\":15}", + "default-elements-margin": "3", "error-image": "CPNull", "help-image": "CPNull", - "help-image-left-offset": "CPNumber", + "help-image-left-offset": "15", "help-image-pressed": "CPNull", "image-offset": "{\"x\":15,\"y\":12}", "information-image": "CPNull", - "informative-offset": "CPNumber", - "informative-text-alignment": "CPNumber", + "informative-offset": "6", + "informative-text-alignment": "3", "informative-text-color": "CPColor:rgba(0, 0, 0, 1)", "informative-text-font": "CPFont:system", "informative-text-shadow-color": "CPNull", - "informative-text-shadow-offset": "{\"width\":0,\"height\":0}", - "message-text-alignment": "CPNumber", + "informative-text-shadow-offset": "{\"height\":0,\"width\":0}", + "message-text-alignment": "3", "message-text-color": "CPColor:rgba(0, 0, 0, 1)", "message-text-font": "CPFont:system bold", "message-text-shadow-color": "CPNull", - "message-text-shadow-offset": "{\"width\":0,\"height\":0}", - "modal-window-button-margin-x": "CPNumber", - "modal-window-button-margin-y": "CPNumber", - "size": "{\"width\":400,\"height\":110}", - "standard-window-button-margin-x": "CPNumber", - "standard-window-button-margin-y": "CPNumber", + "message-text-shadow-offset": "{\"height\":0,\"width\":0}", + "modal-window-button-margin-x": "0", + "modal-window-button-margin-y": "0", + "size": "{\"height\":110,\"width\":400}", + "standard-window-button-margin-x": "0", + "standard-window-button-margin-y": "0", "suppression-button-text-color": "CPColor:rgba(0, 0, 0, 1)", "suppression-button-text-font": "CPFont:system", "suppression-button-text-shadow-color": "CPNull", - "suppression-button-text-shadow-offset": "CPNumber", - "suppression-button-x-offset": "CPNumber", - "suppression-button-y-offset": "CPNumber", + "suppression-button-text-shadow-offset": "0", + "suppression-button-x-offset": "0", + "suppression-button-y-offset": "0", "warning-image": "CPNull" }, "_CPBorderlessBridgeWindowView": { @@ -604,36 +604,36 @@ "divider-color": "CPNull" }, "_CPDatePickerDayViewTextField": { - "alignment": "CPNumber", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "alignment": "2", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "font": "CPNull", - "min-size": "{\"width\":0,\"height\":0}", + "min-size": "{\"height\":0,\"width\":0}", "text-color": "CPColor:rgba(0, 0, 0, 1)", "text-shadow-color": "CPColor:rgba(0, 0, 0, 0)", - "text-shadow-offset": "{\"width\":0,\"height\":0}", - "vertical-alignment": "CPNumber" + "text-shadow-offset": "{\"height\":0,\"width\":0}", + "vertical-alignment": "2" }, "_CPDatePickerElementSeparator": { - "content-inset": "{\"top\":1,\"right\":0,\"bottom\":0,\"left\":0}", - "min-size": "{\"width\":0,\"height\":0}" + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":1}", + "min-size": "{\"height\":0,\"width\":0}" }, "_CPDatePickerElementTextField": { "bezel-color": "CPNull", - "content-inset": "{\"top\":1,\"right\":0,\"bottom\":0,\"left\":0}", - "min-size": "{\"width\":0,\"height\":0}" + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":1}", + "min-size": "{\"height\":0,\"width\":0}" }, "_CPDocModalWindowView": { "body-color": "CPColor:rgba(255, 255, 255, 1)", - "shadow-height": "CPNumber" + "shadow-height": "8" }, "_CPMenuItemMenuBarView": { - "horizontal-margin": "CPNumber", - "submenu-indicator-margin": "CPNumber", - "vertical-margin": "CPNumber" + "horizontal-margin": "9", + "submenu-indicator-margin": "3", + "vertical-margin": "4" }, "_CPMenuItemStandardView": { - "indentation-width": "CPNumber", - "left-margin": "CPNumber", + "indentation-width": "17", + "left-margin": "3", "menu-item-default-mixed-state-highlighted-image": "CPNull", "menu-item-default-mixed-state-image": "CPNull", "menu-item-default-off-state-highlighted-image": "CPNull", @@ -643,27 +643,27 @@ "menu-item-disabled-text-color": "CPColor:rgba(170, 170, 170, 1)", "menu-item-selection-color": "CPNull", "menu-item-separator-color": "CPNull", - "menu-item-separator-height": "CPNumber", - "menu-item-separator-view-height": "CPNumber", + "menu-item-separator-height": "1", + "menu-item-separator-view-height": "10", "menu-item-text-color": "CPNull", "menu-item-text-shadow-color": "CPNull", - "right-columns-margin": "CPNumber", - "right-margin": "CPNumber", - "state-column-width": "CPNumber", + "right-columns-margin": "30", + "right-margin": "17", + "state-column-width": "14", "submenu-indicator-color": "CPNull", "submenu-indicator-highlighted-image": "CPNull", "submenu-indicator-image": "CPNull", - "vertical-margin": "CPNumber", - "vertical-offset": "CPNumber" + "vertical-margin": "4", + "vertical-offset": "0" }, "_CPMenuItemView": {}, "_CPMenuView": { - "menu-bar-height": "CPNumber", + "menu-bar-height": "28", "menu-bar-highlight-color": "CPNull", "menu-bar-highlight-text-color": "CPNull", "menu-bar-highlight-text-shadow-color": "CPNull", "menu-bar-icon-image": "CPNull", - "menu-bar-icon-image-alpha-value": "CPNumber", + "menu-bar-icon-image-alpha-value": "1", "menu-bar-text-color": "CPNull", "menu-bar-text-shadow-color": "CPNull", "menu-bar-title-color": "CPNull", @@ -672,32 +672,32 @@ "menu-bar-window-background-selected-color": "CPNull", "menu-bar-window-first-item-font": "CPNull", "menu-bar-window-font": "CPNull", - "menu-bar-window-height": "CPNumber", - "menu-bar-window-left-margin": "CPNumber", - "menu-bar-window-margin": "CPNumber", - "menu-bar-window-right-margin": "CPNumber", + "menu-bar-window-height": "30", + "menu-bar-window-left-margin": "10", + "menu-bar-window-margin": "10", + "menu-bar-window-right-margin": "10", "menu-general-icon-new": "CPNull", "menu-general-icon-open": "CPNull", "menu-general-icon-save": "CPNull", - "menu-window-margin-inset": "{\"top\":5,\"right\":1,\"bottom\":1,\"left\":5}", + "menu-window-margin-inset": "{\"bottom\":1,\"left\":5,\"right\":1,\"top\":5}", "menu-window-menu-bar-background-style-color": "CPNull", "menu-window-more-above-image": "CPNull", "menu-window-more-below-image": "CPNull", "menu-window-pop-up-background-style-color": "CPNull", - "menu-window-scroll-indicator-height": "CPNumber", - "menu-window-submenu-delta-x": "CPNumber", - "menu-window-submenu-delta-y": "CPNumber", - "menu-window-submenu-first-level-delta-y": "CPNumber" + "menu-window-scroll-indicator-height": "16", + "menu-window-submenu-delta-x": "0", + "menu-window-submenu-delta-y": "0", + "menu-window-submenu-first-level-delta-y": "0" }, "_CPPopoverWindowView": { "background-gradient": "CPNull", "background-gradient-hud": "CPNull", - "border-radius": "CPNumber", - "shadow-blur": "CPNumber", - "shadow-size": "{\"width\":0,\"height\":6}", + "border-radius": "5", + "shadow-blur": "15", + "shadow-size": "{\"height\":6,\"width\":0}", "stroke-color": "CPNull", "stroke-color-hud": "CPNull", - "stroke-width": "CPNumber" + "stroke-width": "1" }, "_CPShadowWindowView": {}, "_CPStandardWindowView": { @@ -711,101 +711,101 @@ "minimize-image-button": "CPNull", "minimize-image-highlighted-button": "CPNull", "solid-color": "CPNull", - "title-bar-height": "CPNumber", + "title-bar-height": "32", "unsaved-image-button": "CPNull", "unsaved-image-highlighted-button": "CPNull" }, "_CPTableColumnHeaderView": { "background-color": "CPNull", "font": "CPNull", - "line-break-mode": "CPNumber", - "text-alignment": "CPNumber", + "line-break-mode": "4", + "text-alignment": "0", "text-color": "CPNull", - "text-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "text-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "text-shadow-color": "CPNull", - "text-shadow-offset": "{\"width\":0,\"height\":0}" + "text-shadow-offset": "{\"height\":0,\"width\":0}" }, "_CPTexturedWindowHeadView": {}, "_CPTokenFieldTokenCloseButton": { - "alignment": "CPNumber", + "alignment": "2", "bezel-color": "CPNull", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "image": "CPNull", "image-color": "CPNull", - "image-offset": "CPNumber", - "image-position": "CPNumber", - "image-scaling": "CPNumber", - "image-vertical-offset": "CPNumber", - "invert-image": "CPNumber", - "invert-image-on-push": "CPNumber", + "image-offset": "0", + "image-position": "2", + "image-scaling": "2", + "image-vertical-offset": "0", + "invert-image": "false", + "invert-image-on-push": "false", "offset": "{\"x\":15,\"y\":5}", - "vertical-alignment": "CPNumber" + "vertical-alignment": "2" }, "_CPTokenFieldTokenDisclosureButton": { - "alignment": "CPNumber", + "alignment": "2", "bezel-color": "CPNull", - "bezel-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "content-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "bezel-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "content-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "image": "CPNull", "image-color": "CPNull", - "image-offset": "CPNumber", - "image-position": "CPNumber", - "image-scaling": "CPNumber", - "image-vertical-offset": "CPNumber", - "invert-image": "CPNumber", - "invert-image-on-push": "CPNumber", + "image-offset": "0", + "image-position": "2", + "image-scaling": "2", + "image-vertical-offset": "0", + "invert-image": "false", + "invert-image-on-push": "false", "offset": "{\"x\":15,\"y\":5}", - "vertical-alignment": "CPNumber" + "vertical-alignment": "2" }, "_CPToolTipWindowView": { "background-color": "CPColor:rgba(255, 255, 202, 1)", - "border-radius": "CPNumber", + "border-radius": "2", "color": "CPColor:rgba(0, 0, 0, 1)", "stroke-color": "CPColor:rgba(227, 227, 227, 1)", - "stroke-width": "CPNumber" + "stroke-width": "1" }, "_CPToolbarView": { - "content-inset": "{\"top\":4,\"right\":4,\"bottom\":4,\"left\":10}", + "content-inset": "{\"bottom\":4,\"left\":10,\"right\":4,\"top\":4}", "extra-item-extra-alternate-image": "CPNull", "extra-item-extra-image": "CPNull", - "extra-item-width": "CPNumber", + "extra-item-width": "20", "image-item-separator-color": "CPNull", - "image-item-separator-size": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":2,\"height\":32}}", - "item-margin": "CPNumber", - "regular-size-height": "CPNumber", - "small-size-height": "CPNumber" + "image-item-separator-size": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":32,\"width\":2}}", + "item-margin": "10", + "regular-size-height": "59", + "small-size-height": "46" }, "_CPWindowView": { "attached-sheet-shadow-color": "CPColor:rgba(0, 0, 0, 1)", "bezel-color": "CPNull", - "border-bottom-left-radius": "CPString", - "border-bottom-right-radius": "CPString", - "border-top-left-radius": "CPString", - "border-top-right-radius": "CPString", + "border-bottom-left-radius": "0px", + "border-bottom-right-radius": "0px", + "border-top-left-radius": "0px", + "border-top-right-radius": "0px", "close-active-image": "CPNull", "close-image": "CPNull", "close-image-origin": "CPNull", "close-image-size": "CPNull", - "frame-outset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", + "frame-outset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", "minimize-image-origin": "CPNull", "minimize-image-size": "CPNull", "resize-indicator": "CPNull", - "shadow-distance": "CPNumber", - "shadow-height": "CPNumber", - "shadow-inset": "{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}", - "shadown-horizontal-offset": "CPNumber", - "sheet-vertical-offset": "CPNumber", - "size-indicator": "{\"width\":0,\"height\":0}", - "title-alignment": "CPNumber", - "title-bar-height": "CPNumber", + "shadow-distance": "5", + "shadow-height": "8", + "shadow-inset": "{\"bottom\":0,\"left\":0,\"right\":0,\"top\":0}", + "shadown-horizontal-offset": "0", + "sheet-vertical-offset": "-1", + "size-indicator": "{\"height\":0,\"width\":0}", + "title-alignment": "2", + "title-bar-height": "25", "title-font": "CPFont:system", - "title-line-break-mode": "CPNumber", - "title-margin": "CPNumber", + "title-line-break-mode": "4", + "title-margin": "20", "title-text-color": "CPColor:rgba(0, 0, 0, 1)", "title-text-shadow-color": "CPNull", - "title-text-shadow-offset": "{\"width\":0,\"height\":0}", - "title-vertical-alignment": "CPNumber", + "title-text-shadow-offset": "{\"height\":0,\"width\":0}", + "title-vertical-alignment": "1", "window-shadow-color": "CPColor:rgba(0, 0, 0, 0)", "zoom-image-origin": "CPNull", "zoom-image-size": "CPNull" @@ -7532,286 +7532,286 @@ }, "construction": { "CPAccordionView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPBox": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [ "CPView" ], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPBrowser": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [ "CPScrollView" ], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPButton": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2" }, "CPButtonBar": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPCheckBox": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2" }, "CPClipView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPCollectionView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber", - "isSelectable": "CPNumber" + "isHidden": "false", + "isSelectable": "true" }, "CPColorWell": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPComboBox": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "drawsBackground": "nil", - "isBordered": "CPNumber", - "isEditable": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "isSelectable": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "isBordered": "true", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "true", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPControl": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPDatePicker": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "drawsBackground": "CPNumber", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "true", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPDisclosureButton": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2" }, "CPImageView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "isEditable": "nil", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPLevelIndicator": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "isEditable": "nil", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPOutlineView": { - "frameSize": "{\"width\":0,\"height\":0}", + "frameSize": "{\"height\":0,\"width\":0}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPPopUpButton": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "4", + "verticalAlignment": "2" }, "CPPredicateEditor": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEditable": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", "verticalAlignment": "nil" }, "CPProgressIndicator": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "CPNumber", - "isHidden": "CPNumber" + "controlSize": "0", + "isHidden": "false" }, "CPRadio": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isBordered": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2" }, "CPRuleEditor": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEditable": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", "verticalAlignment": "nil" }, "CPRulerView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPScrollView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [ "CPClipView", "CPClipView", @@ -7819,240 +7819,240 @@ "CPScroller", "CPView" ], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPScroller": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPSearchField": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [ "CPButton", "CPButton" ], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "bezelStyle": "1", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "drawsBackground": "nil", - "isBordered": "CPNumber", - "isEditable": "CPNumber", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "isSelectable": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "isBordered": "true", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "true", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPSecureTextField": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], "acceptsFirstResponder": "nil", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "drawsBackground": "nil", - "isBordered": "CPNumber", + "isBordered": "false", "isEditable": "nil", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", + "isEnabled": "true", + "isHidden": "false", "isSelectable": "nil", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPSegmentedControl": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2" }, "CPShadowView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPSlider": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPSplitView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPStackView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "10", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPStepper": { - "frameSize": "{\"width\":0,\"height\":0}", + "frameSize": "{\"height\":0,\"width\":0}", "subviews": [ "CPButton", "CPButton" ], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPTabView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPTableCellView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPTableHeaderView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPTableView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPText": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", "isEditable": "nil", - "isHidden": "CPNumber", + "isHidden": "false", "isSelectable": "nil" }, "CPTextField": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], "acceptsFirstResponder": "nil", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "drawsBackground": "nil", - "isBordered": "CPNumber", + "isBordered": "false", "isEditable": "nil", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", + "isEnabled": "true", + "isHidden": "false", "isSelectable": "nil", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPTextView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "true", + "autoresizingMask": "0", "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", - "isEditable": "CPNumber", - "isHidden": "CPNumber", - "isSelectable": "CPNumber" + "isEditable": "true", + "isHidden": "false", + "isSelectable": "true" }, "CPTokenField": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [ "CPScrollView" ], "acceptsFirstResponder": "nil", - "alignment": "CPNumber", - "autoresizingMask": "CPNumber", + "alignment": "0", + "autoresizingMask": "0", "backgroundColor": "nil", - "bezelStyle": "CPNumber", - "controlSize": "{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", "drawsBackground": "nil", - "isBordered": "CPNumber", + "isBordered": "false", "isEditable": "nil", - "isEnabled": "CPNumber", - "isHidden": "CPNumber", + "isEnabled": "true", + "isHidden": "false", "isSelectable": "nil", - "lineBreakMode": "CPNumber", - "verticalAlignment": "CPNumber" + "lineBreakMode": "2", + "verticalAlignment": "1" }, "CPView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" }, "CPVisualEffectView": { - "frameSize": "{\"width\":100,\"height\":100}", + "frameSize": "{\"height\":100,\"width\":100}", "subviews": [], - "acceptsFirstResponder": "CPNumber", - "autoresizingMask": "CPNumber", + "acceptsFirstResponder": "false", + "autoresizingMask": "0", "backgroundColor": "nil", - "isHidden": "CPNumber" + "isHidden": "false" } }, "windows": { From 5db5adac043c1b6fcb746c9cae40e44eaf247f76 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 19:50:31 -0600 Subject: [PATCH 04/15] Tests: Add CPButtonBar regression tests Protects the add, remove and action controls placed below table and outline views by verifying that a button bar supplies usable buttons independently of the active theme. * CPButtonBarTest: Verifies the standard size of the plus, minus and action popup buttons; button placement within the bar, order and shared borders; closure of the gap left by a hidden button; right edge alignment of right buttons; and acceptance of application buttons. --- Tests/AppKit/CPButtonBarTest.j | 152 +++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 Tests/AppKit/CPButtonBarTest.j diff --git a/Tests/AppKit/CPButtonBarTest.j b/Tests/AppKit/CPButtonBarTest.j new file mode 100644 index 000000000..8054d3225 --- /dev/null +++ b/Tests/AppKit/CPButtonBarTest.j @@ -0,0 +1,152 @@ +/* + * CPButtonBarTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + CPButtonBar has no Cocoa counterpart. It is the strip of add, remove and action + buttons that applications place below a table or outline view, and those buttons + are often the only way a person can change the list above them. + + These tests run with no theme loaded. A button bar has to work whatever a theme + chooses to define, so the class itself must supply usable buttons. +*/ +@implementation CPButtonBarTest : OJTestCase +{ + CPWindow theWindow; + CPButtonBar buttonBar; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) styleMask:CPWindowNotSizable]; + + buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 26.0)]; + [[theWindow contentView] addSubview:buttonBar]; +} + +- (void)assertButtonHasStandardSize:(CPView)aButton +{ + [self assert:35.0 equals:CGRectGetWidth([aButton frame])]; + [self assert:25.0 equals:CGRectGetHeight([aButton frame])]; +} + +- (void)testPlusButtonHasTheStandardSize +{ + [self assertButtonHasStandardSize:[CPButtonBar plusButton]]; +} + +- (void)testMinusButtonHasTheStandardSize +{ + [self assertButtonHasStandardSize:[CPButtonBar minusButton]]; +} + +- (void)testActionPopupButtonHasTheStandardSize +{ + [self assertButtonHasStandardSize:[CPButtonBar actionPopupButton]]; +} + +/* + A button must take up space in the bar and stay inside it, or a person cannot + click it. The first button starts one point before the bar, so that its border + falls outside the bar's edge. +*/ +- (void)testLayoutPlacesEachButtonInsideTheBar +{ + var buttons = [[CPButtonBar plusButton], [CPButtonBar minusButton], [CPButtonBar actionPopupButton]]; + + [buttonBar setButtons:buttons]; + [buttonBar layoutSubviews]; + + buttons.forEach(function(aButton) + { + [self assert:buttonBar equals:[aButton superview]]; + [self assertTrue:CGRectGetWidth([aButton frame]) > 0.0]; + [self assertTrue:CGRectGetMinX([aButton frame]) >= -1.0]; + [self assertTrue:CGRectGetMaxX([aButton frame]) <= CGRectGetWidth([buttonBar bounds])]; + }); +} + +/* + Adjacent buttons share a one-point border, and they overlap by no more than that. +*/ +- (void)testLayoutPlacesButtonsInOrderSharingABorder +{ + var plusButton = [CPButtonBar plusButton], + minusButton = [CPButtonBar minusButton]; + + [buttonBar setButtons:[plusButton, minusButton]]; + [buttonBar layoutSubviews]; + + [self assert:CGRectGetMaxX([plusButton frame]) - 1.0 equals:CGRectGetMinX([minusButton frame])]; +} + +/* + A hidden button leaves no gap, and the buttons after it move up. +*/ +- (void)testHidingAButtonClosesTheGap +{ + var plusButton = [CPButtonBar plusButton], + minusButton = [CPButtonBar minusButton]; + + [buttonBar setButtons:[plusButton, minusButton]]; + [buttonBar layoutSubviews]; + + var firstOrigin = CGRectGetMinX([plusButton frame]); + + [plusButton setHidden:YES]; + [buttonBar layoutSubviews]; + + [self assert:firstOrigin equals:CGRectGetMinX([minusButton frame])]; +} + +- (void)testRightButtonsAreAlignedToTheRightEdge +{ + var button = [CPButtonBar plusButton]; + + [buttonBar setRightButtons:[button]]; + [buttonBar layoutSubviews]; + + [self assert:buttonBar equals:[button superview]]; + [self assertTrue:CGRectGetWidth([button frame]) > 0.0]; + [self assertTrue:CGRectGetMaxX([button frame]) >= CGRectGetWidth([buttonBar bounds]) - 1.0]; +} + +/* + Applications add their own buttons to a bar, so any button is acceptable, not + only those the class creates. +*/ +- (void)testAnApplicationButtonCanBeAdded +{ + var button = [[CPButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 35.0, 25.0)]; + + [buttonBar setButtons:[button]]; + [buttonBar layoutSubviews]; + + [self assert:[button] equals:[buttonBar buttons]]; + [self assert:buttonBar equals:[button superview]]; +} + +@end From f468d483ffa8f85b25778beb04fda1673222d6db Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 20:51:13 -0600 Subject: [PATCH 05/15] AppKit, Foundation: Fix view archiving and add regression tests Keyed archiving preserves view hierarchies created in code. Decoded views retain their content, subviews and state, and each view class is verified against its own description before archiving. * CPAccordionView: Add CPCoding to CPAccordionView and CPAccordionViewItem. * CPBox: * Encode the content, title and box views unconditionally. * Clear the superviews of the box and title views during decoding. * CPButton: Initialize the value to CPOffState. * CPMapTable: Add CPCoding. * CPPopUpButton: Clear the inherited button value. * CPSearchField: Update the cancel button when the object value changes. * CPSplitView: Return nil from dividerColor when the theme defines no divider image. * CPStepper: Discard the decoded buttons before recreating them. * CPTabView: * Encode the current tab view items. * Exclude the tabs from the encoded subviews. * CPTokenField: * Discard the decoded scroll view before recreating it. * Add the decoded tokens to the new document view. * CPVisualEffectView: Resolve the backdrop filter property only when a DOM is available. * CPBoxTest: Verify preservation of the content view, hierarchy and title, and decoding of an untitled box without warnings. * CPButtonTest: Verify the initial value of a button. * CPMapTableTest: Verify preservation of entries through archiving. * DropInArchiveFixtures: Add populated view fixtures, tree comparison, and round trip and saved archive helpers. * DropInArchiveGenerator: Save cib descriptions and view archives, and write no archive data if any view fails its round trip. * DropInArchiveTest: Verify new archives, saved archives and reference cibs, and treat decoding warnings as failures. * DropInSnapshot: * Describe the view hierarchy through private views, with state and content. * Add DropInWithFixedScrollerStyle. * DropInArchives, DropInCibs: Add saved view archives, cib descriptions and reference cibs. --- AppKit/CPAccordionView.j | 82 + AppKit/CPBox.j | 17 +- AppKit/CPButton.j | 2 + AppKit/CPPopUpButton.j | 3 + AppKit/CPSearchField.j | 6 + AppKit/CPSplitView.j | 5 +- AppKit/CPStepper.j | 2 + AppKit/CPTabView.j | 6 +- AppKit/CPTokenField.j | 9 + AppKit/CPVisualEffectView.j | 3 +- Foundation/CPMapTable.j | 31 + Tests/AppKit/CPBoxTest.j | 114 + Tests/AppKit/CPButtonTest.j | 6 + Tests/AppKit/DropInArchiveFixtures.j | 287 ++ Tests/AppKit/DropInArchiveGenerator.j | 92 + Tests/AppKit/DropInArchiveTest.j | 194 ++ Tests/AppKit/DropInSnapshot.j | 123 +- Tests/AppKit/Resources/DropInArchives.json | 2774 +++++++++++++++++ Tests/AppKit/Resources/DropInCibs.json | 10 + .../SmartFoldersPredicateEditor.cib | 1 + .../DropInCibs/TextEditorDocumentWindow.cib | 1 + Tests/Foundation/CPMapTableTest.j | 14 + 22 files changed, 3749 insertions(+), 33 deletions(-) create mode 100644 Tests/AppKit/CPBoxTest.j create mode 100644 Tests/AppKit/DropInArchiveFixtures.j create mode 100644 Tests/AppKit/DropInArchiveGenerator.j create mode 100644 Tests/AppKit/DropInArchiveTest.j create mode 100644 Tests/AppKit/Resources/DropInArchives.json create mode 100644 Tests/AppKit/Resources/DropInCibs.json create mode 100644 Tests/AppKit/Resources/DropInCibs/SmartFoldersPredicateEditor.cib create mode 100644 Tests/AppKit/Resources/DropInCibs/TextEditorDocumentWindow.cib diff --git a/AppKit/CPAccordionView.j b/AppKit/CPAccordionView.j index c3e4b4f52..e043677ba 100644 --- a/AppKit/CPAccordionView.j +++ b/AppKit/CPAccordionView.j @@ -414,3 +414,85 @@ var secondItem = [[CPAccordionViewItem alloc] initWithIdentifier:@"secondSection } @end + + +var CPAccordionViewItemIdentifierKey = @"CPAccordionViewItemIdentifierKey", + CPAccordionViewItemViewKey = @"CPAccordionViewItemViewKey", + CPAccordionViewItemLabelKey = @"CPAccordionViewItemLabelKey"; + +@implementation CPAccordionViewItem (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _identifier = [aCoder decodeObjectForKey:CPAccordionViewItemIdentifierKey]; + _view = [aCoder decodeObjectForKey:CPAccordionViewItemViewKey]; + _label = [aCoder decodeObjectForKey:CPAccordionViewItemLabelKey]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_identifier forKey:CPAccordionViewItemIdentifierKey]; + [aCoder encodeObject:_view forKey:CPAccordionViewItemViewKey]; + [aCoder encodeObject:_label forKey:CPAccordionViewItemLabelKey]; +} + +@end + +var CPAccordionViewItemsKey = @"CPAccordionViewItemsKey", + CPAccordionViewItemHeaderPrototypeKey = @"CPAccordionViewItemHeaderPrototypeKey", + CPAccordionViewExpandedItemIndexesKey = @"CPAccordionViewExpandedItemIndexesKey"; + +@implementation CPAccordionView (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + _items = []; + _itemViews = []; + _expandedItemIndexes = [CPIndexSet indexSet]; + + [self setItemHeaderPrototype:[aCoder decodeObjectForKey:CPAccordionViewItemHeaderPrototypeKey]]; + + var items = [aCoder decodeObjectForKey:CPAccordionViewItemsKey], + expandedItemIndexes = [aCoder decodeObjectForKey:CPAccordionViewExpandedItemIndexesKey]; + + items.forEach(function(anItem) + { + [self addItem:anItem]; + }); + + items.forEach(function(anItem, anIndex) + { + if (![expandedItemIndexes containsIndex:anIndex]) + [self collapseItemAtIndex:anIndex]; + }); + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + // The item views are recreated on decode from the items, so they are not encoded. + var subviews = [self subviews]; + + [_itemViews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + [super encodeWithCoder:aCoder]; + [self setSubviews:subviews]; + + [aCoder encodeObject:_items forKey:CPAccordionViewItemsKey]; + [aCoder encodeObject:_itemHeaderPrototype forKey:CPAccordionViewItemHeaderPrototypeKey]; + [aCoder encodeObject:_expandedItemIndexes forKey:CPAccordionViewExpandedItemIndexesKey]; +} + +@end diff --git a/AppKit/CPBox.j b/AppKit/CPBox.j index 5a94fb70d..fffb422fe 100644 --- a/AppKit/CPBox.j +++ b/AppKit/CPBox.j @@ -869,6 +869,11 @@ var CPBoxTypeKey = @"CPBoxTypeKey", // We're coming from elsewhere _titleView = [aCoder decodeObjectForKey:CPBoxTitleViewKey]; + + // The archiver encodes these views after encodeWithCoder: returns, when they + // are subviews again. They are added back below. + _boxView._superview = nil; + _titleView._superview = nil; } _contentView = [aCoder decodeObjectForKey:CPBoxContentViewKey]; @@ -877,7 +882,9 @@ var CPBoxTypeKey = @"CPBoxTypeKey", // FIXME: (see encodeWithCoder to understand why this is not possible) // FIXME: we fix this by hand. This is horrible so please find a structural solution ! - if (_contentView) + var contentViewNeedsBoxView = _contentView && [_contentView superview] !== _boxView; + + if (contentViewNeedsBoxView) _contentView._superview = nil; [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; @@ -885,7 +892,7 @@ var CPBoxTypeKey = @"CPBoxTypeKey", [_boxView setAutoresizesSubviews:YES]; [self setAutoresizesSubviews:YES]; - if (_contentView) + if (contentViewNeedsBoxView) [_boxView setSubviews:@[_contentView]]; [self addSubview:_boxView]; @@ -945,9 +952,9 @@ var CPBoxTypeKey = @"CPBoxTypeKey", [aCoder encodeInt:_borderType forKey:CPBoxBorderTypeKey]; [aCoder encodeObject:_title forKey:CPBoxTitleKey]; [aCoder encodeInt:_titlePosition forKey:CPBoxTitlePositionKey]; - [aCoder encodeConditionalObject:_contentView forKey:CPBoxContentViewKey]; - [aCoder encodeConditionalObject:_titleView forKey:CPBoxTitleViewKey]; - [aCoder encodeConditionalObject:_boxView forKey:CPBoxBoxViewKey]; + [aCoder encodeObject:_contentView forKey:CPBoxContentViewKey]; + [aCoder encodeObject:_titleView forKey:CPBoxTitleViewKey]; + [aCoder encodeObject:_boxView forKey:CPBoxBoxViewKey]; } @end diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 4af9feee2..0c1e9f076 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -202,6 +202,8 @@ CPButtonImageOffset = 3.0; [self setBezelStyle:CPRoundRectBezelStyle]; [self setBordered:YES]; + _value = CPOffState; + [self _init]; } diff --git a/AppKit/CPPopUpButton.j b/AppKit/CPPopUpButton.j index d5d412466..b2eb99c0d 100644 --- a/AppKit/CPPopUpButton.j +++ b/AppKit/CPPopUpButton.j @@ -79,6 +79,9 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); if (self) { + // The value of a pop up button is its selected index, and not a button state. + _value = nil; + [self selectItemAtIndex:CPNotFound]; _preferredEdge = CPMaxYEdge; diff --git a/AppKit/CPSearchField.j b/AppKit/CPSearchField.j index 28bd5cb45..271b57bdd 100644 --- a/AppKit/CPSearchField.j +++ b/AppKit/CPSearchField.j @@ -464,6 +464,12 @@ var CPAutosavedRecentsChangedNotification = @"CPAutosavedRecentsChangedNotificat return [super isOpaque] && [_cancelButton isOpaque] && [_searchButton isOpaque]; } +- (void)setObjectValue:(id)anObject +{ + [super setObjectValue:anObject]; + [self _updateCancelButtonVisibility]; +} + - (void)_updateCancelButtonVisibility { [_cancelButton setHidden:([[self stringValue] length] === 0)]; diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index 18fee079b..e42ba4ead 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -221,7 +221,10 @@ var CPThemeStatesForSplitViewDivider = @[@"dummy one as CPSplitViewDividerStyle if (_dividerStyle === CPSplitViewDividerStyleThin) return [self currentValueForThemeAttribute:@"pane-divider-color"]; - return [CPColor colorWithPatternImage:[self currentValueForThemeAttribute:(_isVertical ? @"vertical-divider-color" : @"horizontal-divider-color")]]; + // A theme may define no divider image, and a pattern needs one. + var image = [self currentValueForThemeAttribute:(_isVertical ? @"vertical-divider-color" : @"horizontal-divider-color")]; + + return image ? [CPColor colorWithPatternImage:image] : nil; } /*! diff --git a/AppKit/CPStepper.j b/AppKit/CPStepper.j index 81a41d786..798476446 100644 --- a/AppKit/CPStepper.j +++ b/AppKit/CPStepper.j @@ -322,6 +322,8 @@ var CPStepperMinValue = @"CPStepperMinValue", _valueWraps = [aCoder decodeBoolForKey:CPStepperValueWraps]; _autorepeat = [aCoder decodeBoolForKey:CPStepperAutorepeat]; + // The archive holds the buttons as subviews, and _init creates them again. + [self setSubviews:@[]]; [self _init]; [self setEnabled:[self isEnabled]]; } diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 44cdccecb..4159f390b 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -866,15 +866,17 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", - (void)encodeWithCoder:(CPCoder)aCoder { - // Don't bother to encode the CPBox. We will recreate it on decode and its content view is already + // Don't bother to encode the CPBox or the tabs. We will recreate them on decode and its content view is already // stored by the tab view item. Not encoding _box makes the resulting archive smaller and reduces // the surface for decoding bugs (of which we've had many in tab view). var subviews = [self subviews]; [_box removeFromSuperview]; + [_tabs removeFromSuperview]; [super encodeWithCoder:aCoder]; [self setSubviews:subviews]; - [aCoder encodeObject:_items forKey:CPTabViewItemsKey]; + // nib2cib stores its items in _items. Otherwise the items are the segments of _tabs. + [aCoder encodeObject:_items || [self items] forKey:CPTabViewItemsKey]; [aCoder encodeConditionalObject:_selectedTabViewItem forKey:CPTabViewSelectedItemKey]; diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 30fb5b58a..e40ccba0a 100644 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -1741,8 +1741,17 @@ var CPTokenFieldTokenizingCharacterSetKey = "CPTokenFieldTokenizingCharacterSe _completionDelay = [aCoder decodeDoubleForKey:CPTokenFieldCompletionDelayKey] || [[self class] defaultCompletionDelay]; _buttonType = [aCoder decodeIntForKey:CPTokenFieldButtonTypeKey] || CPTokenFieldDisclosureButtonType; + // The archive holds the token scroll view as a subview, and _init creates it again. + [self setSubviews:@[]]; [self _init]; + // The tokens were created by setObjectValue: before the scroll view existed. + var contentView = [_tokenScrollView documentView], + tokens = [self _tokens]; + + for (var i = 0, count = [tokens count]; i < count; i++) + [contentView addSubview:tokens[i]]; + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } diff --git a/AppKit/CPVisualEffectView.j b/AppKit/CPVisualEffectView.j index b5eb5e05f..d19c85440 100644 --- a/AppKit/CPVisualEffectView.j +++ b/AppKit/CPVisualEffectView.j @@ -121,7 +121,6 @@ CPVisualEffectStateInactive = 2; - (void)_setEffectEnabled:(BOOL)shouldEnable { var dark = [[self appearance] isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]], - prop = CPBrowserStyleProperty("backdrop-filter"), color = (dark ? [CPColor colorWithHexString:@"1e1e1e"] : [CPColor whiteColor]), finalColor = shouldEnable ? [color colorWithAlphaComponent:0.6] : color; @@ -129,7 +128,7 @@ CPVisualEffectStateInactive = 2; if (CPDOMAvailable) { - self._DOMElement.style[prop] = shouldEnable ? "blur(30px)" : nil; + self._DOMElement.style[CPBrowserStyleProperty("backdrop-filter")] = shouldEnable ? "blur(30px)" : nil; } } diff --git a/Foundation/CPMapTable.j b/Foundation/CPMapTable.j index bc853e78c..753a3f71b 100644 --- a/Foundation/CPMapTable.j +++ b/Foundation/CPMapTable.j @@ -137,3 +137,34 @@ } @end + +var CPMapTableKeysKey = @"CPMapTableKeysKey", + CPMapTableObjectsKey = @"CPMapTableObjectsKey"; + +@implementation CPMapTable (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self init]; + + if (self) + { + var keys = [aCoder decodeObjectForKey:CPMapTableKeysKey], + objects = [aCoder decodeObjectForKey:CPMapTableObjectsKey]; + + keys.forEach(function(aKey, anIndex) + { + [self setObject:objects[anIndex] forKey:aKey]; + }); + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:Array.from(_map.keys()) forKey:CPMapTableKeysKey]; + [aCoder encodeObject:Array.from(_map.values()) forKey:CPMapTableObjectsKey]; +} + +@end diff --git a/Tests/AppKit/CPBoxTest.j b/Tests/AppKit/CPBoxTest.j new file mode 100644 index 000000000..47210f011 --- /dev/null +++ b/Tests/AppKit/CPBoxTest.j @@ -0,0 +1,114 @@ +/* + * CPBoxTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + A box that is archived and read back must keep its content view, its title and + its internal views, and the content view must remain inside the box. +*/ +@implementation CPBoxTest : OJTestCase +{ + CPBox box; + CPView contentView; + Function logWarning; + CPArray warnings; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + warnings = []; + logWarning = CPLog.warn; + + CPLog.warn = function(aMessage) + { + warnings.push(String(aMessage)); + }; + + box = [[CPBox alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 100.0)]; + contentView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 40.0)]; + + [contentView addSubview:[[CPView alloc] initWithFrame:CGRectMake(3.0, 5.0, 20.0, 10.0)]]; + [box setContentView:contentView]; +} + +- (void)tearDown +{ + CPLog.warn = logWarning; +} + +- (CPBox)archivedBox +{ + return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:box]]; +} + +- (void)testArchivingKeepsTheContentView +{ + var decodedContentView = [[self archivedBox] contentView]; + + [self assertNotNull:decodedContentView]; + [self assert:1 equals:[[decodedContentView subviews] count]]; + [self assertTrue:CGRectEqualToRect([contentView frame], [decodedContentView frame])]; +} + +- (void)testArchivingKeepsTheContentViewInsideTheBox +{ + var decodedBox = [self archivedBox], + boxView = [[decodedBox contentView] superview]; + + [self assertNotNull:boxView]; + [self assert:decodedBox equals:[boxView superview]]; + [self assertTrue:[[decodedBox subviews] containsObject:boxView]]; +} + +- (void)testArchivingLeavesTheBoxUnchanged +{ + var subviews = [box subviews]; + + [self archivedBox]; + + [self assert:subviews equals:[box subviews]]; + [self assert:contentView equals:[box contentView]]; +} + +- (void)testArchivingKeepsTheTitle +{ + [box setTitle:@"Title"]; + [box setTitlePosition:CPAtTop]; + + var decodedBox = [self archivedBox]; + + [self assert:@"Title" equals:[decodedBox title]]; + [self assert:CPAtTop equals:[decodedBox titlePosition]]; +} + +- (void)testUntitledBoxDecodesWithoutAWarning +{ + [self archivedBox]; + + [self assert:[] equals:warnings]; +} + +@end diff --git a/Tests/AppKit/CPButtonTest.j b/Tests/AppKit/CPButtonTest.j index 9abf42e27..ecacb5049 100644 --- a/Tests/AppKit/CPButtonTest.j +++ b/Tests/AppKit/CPButtonTest.j @@ -104,6 +104,12 @@ [self assertTrue:wasClicked]; } +- (void)testNewButtonValueIsOff +{ + [self assert:CPOffState equals:[button objectValue] message:@"a new button should be off"]; + [self assert:CPOffState equals:[button state] message:@"state should be CPOffState"]; +} + - (void)testSetObjectValue { [button setObjectValue:CPOnState]; diff --git a/Tests/AppKit/DropInArchiveFixtures.j b/Tests/AppKit/DropInArchiveFixtures.j new file mode 100644 index 000000000..58add4ede --- /dev/null +++ b/Tests/AppKit/DropInArchiveFixtures.j @@ -0,0 +1,287 @@ +/* + * DropInArchiveFixtures.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "DropInSnapshot.j" + +/* + Creates the views that the archive tests write and read back. An empty view has + little to lose, so each view holds real content. The reference for a view is its + own description before it is archived, never what a build restores. +*/ + +/* + The only view classes without a fixture. Each entry states the reason. Any other + class that cannot be archived is a failure. +*/ +var DropInArchiveExclusions = { + @"CPText": @"it is abstract and its text methods raise an exception", + @"CPWebView": @"creating one needs a DOM" + }; + +function DropInArchiveExclusion(aClassName) +{ + return DropInArchiveExclusions[aClassName]; +} + +function DropInArchiveChild(aWidth, aHeight) +{ + return [[CPView alloc] initWithFrame:CGRectMake(3.0, 5.0, aWidth, aHeight)]; +} + +function DropInArchiveTableColumn(anIdentifier) +{ + var column = [[CPTableColumn alloc] initWithIdentifier:anIdentifier]; + + [column setWidth:60.0]; + + return column; +} + +/* + The content of each class. A class without an entry uses the entry of its + nearest superclass. +*/ +var DropInArchivePopulators = { + @"CPView": function(aView) + { + [aView addSubview:DropInArchiveChild(20.0, 10.0)]; + }, + @"CPControl": function(aControl) + { + [aControl setEnabled:NO]; + [aControl setTag:7]; + }, + @"CPAccordionView": function(anAccordionView) + { + var item = [[CPAccordionViewItem alloc] initWithIdentifier:@"item"]; + + [item setLabel:@"Item"]; + [item setView:DropInArchiveChild(40.0, 30.0)]; + [anAccordionView addItem:item]; + }, + @"CPBox": function(aBox) + { + var content = DropInArchiveChild(60.0, 40.0); + + [content addSubview:DropInArchiveChild(20.0, 10.0)]; + [aBox setTitle:@"Box"]; + [aBox setTitlePosition:CPAtTop]; + [aBox setContentView:content]; + }, + @"CPButton": function(aButton) + { + [aButton setTitle:@"Button"]; + [aButton setState:CPOnState]; + [aButton setTag:7]; + }, + @"CPButtonBar": function(aButtonBar) + { + [aButtonBar setButtons:[[CPButtonBar plusButton], [CPButtonBar minusButton]]]; + }, + @"CPColorWell": function(aColorWell) + { + [aColorWell setColor:[CPColor redColor]]; + }, + @"CPComboBox": function(aComboBox) + { + [aComboBox addItemsWithObjectValues:[@"One", @"Two"]]; + [aComboBox setStringValue:@"One"]; + }, + @"CPDatePicker": function(aDatePicker) + { + [aDatePicker setDateValue:[[CPDate alloc] initWithString:@"2026-10-31 12:00:00 +0000"]]; + }, + @"CPLevelIndicator": function(aLevelIndicator) + { + [aLevelIndicator setMinValue:1.0]; + [aLevelIndicator setMaxValue:9.0]; + [aLevelIndicator setDoubleValue:4.0]; + }, + @"CPOutlineView": function(anOutlineView) + { + var column = DropInArchiveTableColumn(@"one"); + + [anOutlineView addTableColumn:column]; + [anOutlineView setOutlineTableColumn:column]; + }, + @"CPPopUpButton": function(aPopUpButton) + { + [aPopUpButton addItemsWithTitles:[@"One", @"Two"]]; + [aPopUpButton selectItemAtIndex:1]; + }, + @"CPProgressIndicator": function(aProgressIndicator) + { + [aProgressIndicator setMinValue:1.0]; + [aProgressIndicator setMaxValue:9.0]; + [aProgressIndicator setDoubleValue:4.0]; + }, + @"CPScrollView": function(aScrollView) + { + [aScrollView setDocumentView:DropInArchiveChild(300.0, 400.0)]; + }, + @"CPSegmentedControl": function(aSegmentedControl) + { + [aSegmentedControl setSegmentCount:2]; + [aSegmentedControl setLabel:@"One" forSegment:0]; + [aSegmentedControl setLabel:@"Two" forSegment:1]; + [aSegmentedControl setWidth:40.0 forSegment:0]; + [aSegmentedControl setWidth:40.0 forSegment:1]; + }, + @"CPSlider": function(aSlider) + { + [aSlider setMinValue:1.0]; + [aSlider setMaxValue:9.0]; + [aSlider setDoubleValue:4.0]; + }, + @"CPSplitView": function(aSplitView) + { + [aSplitView addSubview:DropInArchiveChild(40.0, 90.0)]; + [aSplitView addSubview:DropInArchiveChild(40.0, 90.0)]; + }, + @"CPStackView": function(aStackView) + { + [aStackView addArrangedSubview:DropInArchiveChild(40.0, 30.0)]; + }, + @"CPStepper": function(aStepper) + { + [aStepper setMinValue:1.0]; + [aStepper setMaxValue:9.0]; + [aStepper setDoubleValue:4.0]; + }, + @"CPTableView": function(aTableView) + { + [aTableView addTableColumn:DropInArchiveTableColumn(@"one")]; + [aTableView addTableColumn:DropInArchiveTableColumn(@"two")]; + }, + @"CPTabView": function(aTabView) + { + ["one", "two"].forEach(function(anIdentifier) + { + var item = [[CPTabViewItem alloc] initWithIdentifier:anIdentifier]; + + [item setLabel:anIdentifier]; + [item setView:DropInArchiveChild(40.0, 30.0)]; + [aTabView addTabViewItem:item]; + }); + + [aTabView selectTabViewItemAtIndex:1]; + }, + @"CPTextView": function(aTextView) + { + [aTextView setString:@"Text"]; + }, + @"CPTextField": function(aTextField) + { + [aTextField setStringValue:@"Text"]; + [aTextField setEditable:YES]; + [aTextField setBezeled:YES]; + }, + @"CPTokenField": function(aTokenField) + { + [aTokenField setObjectValue:[@"One", @"Two"]]; + } + }; + +function DropInArchivePopulator(aClass) +{ + for (; aClass; aClass = class_getSuperclass(aClass)) + if (DropInArchivePopulators[aClass.name]) + return DropInArchivePopulators[aClass.name]; + + return nil; +} + +function DropInArchiveFixture(aClass) +{ + var view = [[aClass alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 100.0)]; + + DropInArchivePopulator(aClass)(view); + + return view; +} + +/* + Lists each place where two view descriptions differ. +*/ +function DropInTreeDifferences(expected, current, aPath, differences) +{ + if (expected && current && typeof expected === "object" && typeof current === "object") + { + Object.keys(expected).concat(Object.keys(current)).filter(function(aKey, anIndex, aList) + { + return aList.indexOf(aKey) === anIndex; + }).forEach(function(aKey) + { + DropInTreeDifferences(expected[aKey], current[aKey], aPath + "." + aKey, differences); + }); + } + else if (expected !== current) + differences.push(aPath + ": " + JSON.stringify(expected) + " is now " + JSON.stringify(current)); + + return differences; +} + +/* + Layout changes frames and adds subviews, and a new view has not asked for it. Every + view is laid out before it is described, so that two descriptions are comparable. +*/ +function DropInArchiveLayOut(aView) +{ + [aView setNeedsLayout]; + [_CPDisplayServer run]; +} + +/* + Archives a fixture and reads it back. +*/ +function DropInArchiveRoundTrip(aClass) +{ + return DropInWithFixedScrollerStyle(function() + { + var view = DropInArchiveFixture(aClass); + + DropInArchiveLayOut(view); + + var original = DropInViewTree(view), + data = [CPKeyedArchiver archivedDataWithRootObject:view], + decoded = [CPKeyedUnarchiver unarchiveObjectWithData:data]; + + DropInArchiveLayOut(decoded); + + return { @"archive": [data rawString], @"original": original, @"decoded": DropInViewTree(decoded) }; + }); +} + +/* + Reads a saved archive back and describes the view. +*/ +function DropInSavedArchiveTree(aRawString) +{ + return DropInWithFixedScrollerStyle(function() + { + var decoded = [CPKeyedUnarchiver unarchiveObjectWithData:[CPData dataWithRawString:aRawString]]; + + DropInArchiveLayOut(decoded); + + return DropInViewTree(decoded); + }); +} diff --git a/Tests/AppKit/DropInArchiveGenerator.j b/Tests/AppKit/DropInArchiveGenerator.j new file mode 100644 index 000000000..c1500a8d5 --- /dev/null +++ b/Tests/AppKit/DropInArchiveGenerator.j @@ -0,0 +1,92 @@ +/* + * DropInArchiveGenerator.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "DropInArchiveFixtures.j" + +/* + Saves the archive test data. Run this only against a build of main: + + objj Tests/AppKit/DropInArchiveGenerator.j + + It saves a description of what each reference cib produces. It then saves an + archive of each view fixture, with the fixture's description before archiving. + An archive is saved only if it restores that description, so a failure stops + the generator and no archive data is written. +*/ +var fs = require("fs"), + path = require("path"); + +function main(args, namedArgs) +{ + [[CPApplication alloc] init]; + + var resources = path.join(process.cwd(), "Tests", "AppKit", "Resources"), + cibFolder = path.join(resources, "DropInCibs"), + archives = {}, + cibs = {}, + failures = []; + + fs.readdirSync(cibFolder).sort().forEach(function(aName) + { + cibs[aName] = DropInCibTree(aName, fs.readFileSync(path.join(cibFolder, aName), {encoding: 'utf-8'})); + print(aName + ": " + cibs[aName].length + " top level objects"); + }); + + fs.writeFileSync(path.join(resources, "DropInCibs.json"), JSON.stringify(cibs, null, 1) + "\n"); + + DropInSortedClasses().forEach(function(aClass) + { + var name = aClass.name; + + if (!DropInIsPublicName(name) || !DropInClassIsView(aClass)) + return; + + if (DropInArchiveExclusion(name)) + return print("excluded " + name + ": " + DropInArchiveExclusion(name)); + + try + { + var result = DropInArchiveRoundTrip(aClass), + differences = DropInTreeDifferences(result.original, result.decoded, name, []); + + if (differences.length) + failures = failures.concat(differences); + else + archives[name] = { @"archive": result.archive, @"state": result.original }; + } + catch (anException) + { + failures.push(name + ": " + String(anException)); + } + }); + + if (failures.length) + { + failures.forEach(function(aLine) { print("failed " + aLine); }); + print(failures.length + " failures, no archive data written"); + process.exit(1); + } + + fs.writeFileSync(path.join(resources, "DropInArchives.json"), JSON.stringify(archives, null, 1) + "\n"); + + print(Object.keys(archives).length + " archived view classes"); +} diff --git a/Tests/AppKit/DropInArchiveTest.j b/Tests/AppKit/DropInArchiveTest.j new file mode 100644 index 000000000..7eb893a8e --- /dev/null +++ b/Tests/AppKit/DropInArchiveTest.j @@ -0,0 +1,194 @@ +/* + * DropInArchiveTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "DropInArchiveFixtures.j" + +/* + Every application with an interface built in Xcode depends on cibs, and those + cibs were written before the application's frameworks were last updated. An + application that updates its frameworks does not rebuild them first, so the + frameworks must keep reading what was already written. A new key may be added to + an archive. Its absence from an older archive must then mean the old behavior, + and not a new default. + + The reference for a view is the view before it was archived, so a build cannot + pass by restoring something else. A warning during decoding is a failure. The + classes under test are those in the drop-in baseline, so a class cannot leave + these tests unnoticed. + + DropInArchiveGenerator.j saves the data these tests read. Each test reports every + difference it finds. +*/ +var fs = require("fs"), + path = require("path"); + +@implementation DropInArchiveTest : OJTestCase +{ + CPString resources; + CPArray warnings; + Function logWarning; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + resources = path.join(path.dirname(__filename), "Resources"); + warnings = []; + logWarning = CPLog.warn; + + CPLog.warn = function(aMessage) + { + warnings.push(String(aMessage)); + }; +} + +- (void)tearDown +{ + CPLog.warn = logWarning; +} + +- (id)jsonNamed:(CPString)aName +{ + return JSON.parse(fs.readFileSync(path.join(resources, aName), {encoding: 'utf-8'})); +} + +- (CPArray)viewClassNames +{ + return Object.keys([self jsonNamed:@"DropInBaseline.json"].construction).filter(function(aClassName) + { + return !DropInArchiveExclusion(aClassName); + }); +} + +- (void)assertNoDifferences:(CPArray)differences +{ + [self assertTrue:differences.length === 0 message:"\n" + differences.join("\n")]; +} + +- (void)moveWarningsNamed:(CPString)aName into:(CPArray)differences +{ + warnings.forEach(function(aWarning) + { + differences.push(aName + " warned: " + aWarning); + }); + + warnings = []; +} + +/* + A view that is archived and read back must be the same view, with the same + content. +*/ +- (void)testNewArchivesRestoreTheOriginalView +{ + var differences = []; + + [self viewClassNames].forEach(function(aClassName) + { + try + { + var result = DropInArchiveRoundTrip(objj_getClass(aClassName)); + + DropInTreeDifferences(result.original, result.decoded, aClassName, differences); + } + catch (anException) + { + differences.push(aClassName + ": " + String(anException)); + } + + [self moveWarningsNamed:aClassName into:differences]; + }); + + [self assertNoDifferences:differences]; +} + +/* + An archive written by main must restore the view it was written from. +*/ +- (void)testExistingArchivesRestoreTheOriginalView +{ + var archivePath = path.join(resources, @"DropInArchives.json"); + + [self assertTrue:fs.existsSync(archivePath) message:@"DropInArchives.json has not been generated"]; + + var archives = [self jsonNamed:@"DropInArchives.json"], + differences = []; + + [self viewClassNames].forEach(function(aClassName) + { + var saved = archives[aClassName]; + + if (!saved) + return differences.push(aClassName + ": no saved archive"); + + try + { + DropInTreeDifferences(saved.state, DropInSavedArchiveTree(saved.archive), aClassName, differences); + } + catch (anException) + { + differences.push(aClassName + ": " + String(anException)); + } + + [self moveWarningsNamed:aClassName into:differences]; + }); + + [self assertNoDifferences:differences]; +} + +/* + These are fixed copies of real cibs, and they do not follow their sources. They are + Tests/Manual/SmartFoldersTest/Resources/PredicateEditor.cib and + Tests/Manual/TextEditor/Resources/DocumentWindow.cib, as of commit 5db5adac0. + Loading one must produce the same windows, views and frames as main. The MainMenu + cibs of those applications are not here, because they need application classes + to load. +*/ +- (void)testExistingCibsProduceTheSameObjects +{ + var expected = [self jsonNamed:@"DropInCibs.json"], + differences = []; + + for (var cibName in expected) + { + var rawString = fs.readFileSync(path.join(resources, "DropInCibs", cibName), {encoding: 'utf-8'}), + current = DropInCibTree(cibName, rawString), + expectedTrees = expected[cibName]; + + if (current.length !== expectedTrees.length) + { + differences.push(cibName + ": " + expectedTrees.length + " top level objects are now " + current.length); + continue; + } + + for (var index = 0; index < current.length; index++) + DropInTreeDifferences(JSON.parse(expectedTrees[index]), JSON.parse(current[index]), cibName, differences); + + [self moveWarningsNamed:cibName into:differences]; + } + + [self assertNoDifferences:differences]; +} + +@end diff --git a/Tests/AppKit/DropInSnapshot.j b/Tests/AppKit/DropInSnapshot.j index 6be7b06eb..1247781b9 100644 --- a/Tests/AppKit/DropInSnapshot.j +++ b/Tests/AppKit/DropInSnapshot.j @@ -61,6 +61,37 @@ DropInWindowStyles = { @"hudClosable": CPHUDBackgroundWindowMask | CPClosableWindowMask }; +/* + The getters that report a BOOL, and the getters that report a view's content. + */ +var DropInBooleanGetters = [ + @"acceptsFirstResponder", + @"drawsBackground", + @"isBordered", + @"isEditable", + @"isEnabled", + @"isHidden", + @"isSelectable" +], + +DropInContentGetters = [ + @"color", + @"doubleValue", + @"indexOfSelectedItem", + @"maxValue", + @"minValue", + @"numberOfColumns", + @"numberOfItems", + @"numberOfTabViewItems", + @"objectValue", + @"segmentCount", + @"state", + @"string", + @"stringValue", + @"tag", + @"title" +]; + function DropInIsPublicName(aName) { return aName.charAt(0) !== "_" && aName.charAt(0) !== "$"; @@ -226,18 +257,54 @@ function DropInDefaultConstruction(aClass, throwIfError) } /* - Describes a view and its public subviews, in order. Private views are left out, - because they are the class's own concern. + Lists the public views below a view, in order. A private view is the class's own + concern and is left out, but the public views inside it are the view's content. + An observed view has a generated isa, so its name comes from its class method. + */ +function DropInPublicSubviews(aView) +{ + return [aView subviews].reduce(function(aList, aSubview) + { + return aList.concat(DropInIsPublicName([aSubview className]) ? [aSubview] : DropInPublicSubviews(aSubview)); + }, []); +} + +/* + Describes the state of one view. An unset BOOL is nil and means NO, so a BOOL is + recorded by its truth value. + */ +function DropInViewTreeState(aView) +{ + var state = {}; + + DropInConstructionGetters.concat(DropInContentGetters).forEach(function(aGetter) + { + var selector = CPSelectorFromString(aGetter); + + if (![aView respondsToSelector:selector]) + return; + + var value = [aView performSelector:selector]; + + state[aGetter] = DropInDescribeValue(DropInBooleanGetters.indexOf(aGetter) !== -1 ? !!value : value); + }); + + return state; +} + +/* + Describes a view and everything public below it. */ function DropInViewTree(aView) { return { - @"class": aView.isa.name, + @"class": [aView className], @"frame": DropInDescribeValue([aView frame]), - @"subviews": [aView subviews].filter(function(aSubview) - { - return DropInIsPublicName(aSubview.isa.name); - }).map(DropInViewTree) + @"state": DropInViewTreeState(aView), + @"subviews": DropInPublicSubviews(aView).map(function(aSubview) + { + return DropInViewTree(aSubview); + }) }; } @@ -291,23 +358,37 @@ function DropInObjectTree(anObject) @end /* - Loads a cib and describes its top level objects, sorted so that the order in - which the cib lists them does not matter. - - A scroll view takes its scroller style from a global setting when it is decoded, - and that style changes the frames inside it. Applications and tests change the - setting, so each cib loads with the same style. Layout also changes frames and - adds subviews, so it is complete before anything is described. + A scroll view takes its scroller style from a global setting, and that style changes + the frames and views inside it. Applications and tests change the setting, so a + description that is saved or compared is always made with the same style. */ -function DropInCibTree(aCibName, aRawString) +function DropInWithFixedScrollerStyle(aFunction) { - var topLevelObjects = [], - cib = [[CPCib alloc] _initWithData:[CPData dataWithRawString:aRawString] bundle:nil cibName:aCibName], - scrollerStyle = [CPScrollView globalScrollerStyle]; + var scrollerStyle = [CPScrollView globalScrollerStyle]; [CPScrollView setGlobalScrollerStyle:CPScrollerStyleLegacy]; try + { + return aFunction(); + } + finally + { + [CPScrollView setGlobalScrollerStyle:scrollerStyle]; + } +} + +/* + Loads a cib and describes its top level objects, sorted so that the order in + which the cib lists them does not matter. Layout changes frames and adds subviews, + so it is complete before anything is described. + */ +function DropInCibTree(aCibName, aRawString) +{ + var topLevelObjects = [], + cib = [[CPCib alloc] _initWithData:[CPData dataWithRawString:aRawString] bundle:nil cibName:aCibName]; + + return DropInWithFixedScrollerStyle(function() { [cib instantiateCibWithExternalNameTable:@{ CPCibOwner: [[_DropInCibOwner alloc] init], CPCibTopLevelObjects: topLevelObjects }]; [_CPDisplayServer run]; @@ -316,11 +397,7 @@ function DropInCibTree(aCibName, aRawString) { return JSON.stringify(aTree); }).sort(); - } - finally - { - [CPScrollView setGlobalScrollerStyle:scrollerStyle]; - } + }); } function DropInClassIsView(aClass) diff --git a/Tests/AppKit/Resources/DropInArchives.json b/Tests/AppKit/Resources/DropInArchives.json new file mode 100644 index 000000000..3875862d4 --- /dev/null +++ b/Tests/AppKit/Resources/DropInArchives.json @@ -0,0 +1,2774 @@ +{ + "CPAccordionView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;15;CPAccordionViewK;8;$classesA;S;15;CPAccordionViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;23;CPAccordionViewItemsKeyD;K;6;CP$UIDd;2;10E;K;37;CPAccordionViewItemHeaderPrototypeKeyD;K;6;CP$UIDd;2;12E;K;37;CPAccordionViewExpandedItemIndexesKeyD;K;6;CP$UIDd;2;14E;E;S;19;{{0, 0}, {200, 54}}S;4;viewS;6;normalS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;17E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;17E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;18E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;19E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;20E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;21E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;22E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;24E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;25E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;21E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;26E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;27E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;21E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;28E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;29E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;26E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;30E;E;D;K;10;$classnameS;10;CPIndexSetK;8;$classesA;S;10;CPIndexSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;18;CPIndexSetCountKeyD;K;6;CP$UIDd;2;31E;K;25;CPIndexSetRangeStringsKeyD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;19;CPAccordionViewItemK;8;$classesA;S;19;CPAccordionViewItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;32;CPAccordionViewItemIdentifierKeyD;K;6;CP$UIDd;2;33E;K;26;CPAccordionViewItemViewKeyD;K;6;CP$UIDd;2;35E;K;27;CPAccordionViewItemLabelKeyD;K;6;CP$UIDd;2;36E;E;S;19;{{0, 0}, {100, 24}}S;6;buttonS;37;bordered+controlSizeRegular+roundRectD;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;E;E;d;1;0d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;39E;E;d;2;14T;d;1;2f;3;0.5f;4;0.05d;2;12d;1;1D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;E;E;S;4;itemD;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;42E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;43E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;44E;E;S;4;ItemD;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;45E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;46E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;12E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;12E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;47E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;6;{0, 1}S;5;$nullS;20;{{0, 24}, {200, 30}}S;19;{{0, 0}, {200, 30}}D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;48E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;23E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;49E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;57;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":100,\"height\":24}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPAccordionView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":54,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":24,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "Item" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":24,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":24},\"size\":{\"height\":30,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPBox": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;5;CPBoxK;8;$classesA;S;5;CPBoxS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;2;10E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;2;11E;K;13;CPBoxTitleKeyD;K;6;CP$UIDd;2;12E;K;21;CPBoxTitlePositionKeyD;K;6;CP$UIDd;2;13E;K;19;CPBoxContentViewKeyD;K;6;CP$UIDd;2;15E;K;17;CPBoxTitleViewKeyD;K;6;CP$UIDd;2;17E;K;15;CPBoxBoxViewKeyD;K;6;CP$UIDd;2;18E;E;S;20;{{0, 0}, {200, 100}}S;3;boxS;6;normalS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;d;1;0d;1;3S;3;Boxd;1;2D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;18E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;19E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;20E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;21E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;18E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;22E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;24E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;25E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;26E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;27E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;28E;K;12;$atext-colorD;K;6;CP$UIDd;2;30E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;31E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;12E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;32E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;34E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;13E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;10E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;35E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;36E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;20E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;37E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;22E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;38E;E;S;21;{{-1, -1}, {200, 98}}S;19;{{0, 0}, {200, 98}}D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;E;E;d;2;18S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;S;16;{{5, 0}, {1, 2}}S;16;{{0, 0}, {1, 2}}S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;4;nameD;K;6;CP$UIDd;2;40E;K;12;defaultValueD;K;6;CP$UIDd;2;42E;K;5;stateD;K;6;CP$UIDd;2;43E;K;5;valueD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;45E;E;E;d;4;3072D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;46E;E;S;0;S;19;{{0, 2}, {200, 98}}D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;15E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;47E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;48E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;15E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;49E;E;S;10;text-colorD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;E;S;11;placeholderD;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;52E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;53E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;17E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;17E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;54E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;10E;D;K;6;CP$UIDd;2;10E;D;K;6;CP$UIDd;2;10E;D;K;6;CP$UIDd;2;55E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;2;33E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;56E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;33E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;56E;E;d;1;1S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPBox", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1", + "title": "Box" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":2},\"size\":{\"height\":98,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "18", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":-1,\"y\":-1},\"size\":{\"height\":98,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "18", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + }, + { + "class": "CPTextField", + "frame": "{\"origin\":{\"x\":5,\"y\":0},\"size\":{\"height\":2,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "false", + "isBordered": "false", + "isEditable": "false", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "Box", + "stringValue": "Box", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":2,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + }, + "CPBrowser": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;9;CPBrowserK;8;$classesA;S;9;CPBrowserS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;7E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;7E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;29;CPBrowserAutohidesScrollerKeyD;K;6;CP$UIDd;2;14E;K;32;CPBrowserAllowsEmptySelectionKeyD;K;6;CP$UIDd;2;14E;K;35;CPBrowserAllowsMultipleSelectionKeyD;K;6;CP$UIDd;2;14E;K;20;CPBrowserDelegateKeyD;K;6;CP$UIDd;1;0E;K;25;CPBrowserPrototypeViewKeyD;K;6;CP$UIDd;2;16E;K;21;CPBrowserRowHeightKeyD;K;6;CP$UIDd;2;17E;K;22;CPBrowserImageWidthKeyD;K;6;CP$UIDd;2;17E;K;26;CPBrowserMinColumnWidthKeyD;K;6;CP$UIDd;2;18E;K;24;CPBrowserColumnWidthsKeyD;K;6;CP$UIDd;2;19E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;7;browserS;27;controlSizeRegular+disabledS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;22E;E;T;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;23E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;24E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;25E;K;12;$atext-colorD;K;6;CP$UIDd;2;27E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;28E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;7E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;7E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;30E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;31E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;32E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;33E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;11E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;34E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;31E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;d;2;23d;2;80D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;35E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;36E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;37E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;16;{{0, 0}, {0, 0}}S;9;textfieldS;30;controlSizeRegular+placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;4;nameD;K;6;CP$UIDd;2;38E;K;12;defaultValueD;K;6;CP$UIDd;2;40E;K;5;stateD;K;6;CP$UIDd;2;41E;K;5;valueD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;4;nameD;K;6;CP$UIDd;2;43E;K;12;defaultValueD;K;6;CP$UIDd;2;44E;K;6;valuesD;K;6;CP$UIDd;2;46E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;4;nameD;K;6;CP$UIDd;2;47E;K;12;defaultValueD;K;6;CP$UIDd;2;48E;K;6;valuesD;K;6;CP$UIDd;2;49E;E;D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;50E;E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;22E;E;d;1;0D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;51E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;52E;E;S;10;text-colorD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;53E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;54E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;S;21;selectedTableDataViewD;K;6;$classD;K;6;CP$UIDd;2;39E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;54E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;S;15;line-break-moded;1;2D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;11E;K;6;normalD;K;6;CP$UIDd;2;11E;E;E;S;18;vertical-alignmentd;1;1D;K;6;$classD;K;6;CP$UIDd;2;45E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;44E;K;6;normalD;K;6;CP$UIDd;2;44E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;57E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;36E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;16E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;16E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;58E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;48E;E;E;S;5;colorS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;48E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;51E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;51E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPBrowser", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "nil", + "stringValue": "", + "tag": "7" + }, + "subviews": [ + { + "class": "CPScrollView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "18", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "16", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + ] + } + }, + "CPButton": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;7E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;7E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;15E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;16E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;17E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;18E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;19E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;17E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;20E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;21E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;18E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;22E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;6;buttonS;37;bordered+controlSizeRegular+roundRectS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;d;1;1d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;25E;E;S;6;Buttond;2;14d;1;0T;d;1;2f;3;0.5f;4;0.05d;2;12D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;26E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;27E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;28E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;29E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;30E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "1", + "objectValue": "1", + "state": "1", + "stringValue": "1", + "tag": "7", + "title": "Button" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPButtonBar": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPButtonBarK;8;$classesA;S;11;CPButtonBarS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;30;CPButtonBarHasResizeControlKeyD;K;6;CP$UIDd;1;0E;K;40;CPButtonBarResizeControlIsLeftAlignedKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonBarButtonsKeyD;K;6;CP$UIDd;2;11E;K;26;CPButtonBarRightButtonsKeyD;K;6;CP$UIDd;2;12E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;14E;D;K;6;CP$UIDd;2;15E;E;E;S;10;button-barS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;14E;D;K;6;CP$UIDd;2;15E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;16E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;17E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;18E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;19E;K;16;$aimage-positionD;K;6;CP$UIDd;2;20E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;21E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;22E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;23E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;25E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;26E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;22E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;27E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;20E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;22E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;28E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;29E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;27E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;30E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;31E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;17E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;18E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;19E;K;16;$aimage-positionD;K;6;CP$UIDd;2;20E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;32E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;22E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;23E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;33E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;26E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;22E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;27E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;20E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;22E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;28E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;29E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;27E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;30E;E;S;19;{{-1, 1}, {35, 99}}S;18;{{0, 0}, {35, 99}}S;6;buttonS;37;bordered+controlSizeRegular+roundRectd;1;1D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;35E;E;E;d;1;0d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;36E;E;d;2;14T;f;3;0.5f;4;0.05d;2;12S;19;{{33, 1}, {35, 99}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;36E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;38E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;39E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;14E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;14E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;40E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;34E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;39E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;15E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;15E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;43E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;24E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;44E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;56;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":35,\"height\":25}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPButtonBar", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":-1,\"y\":1},\"size\":{\"height\":99,\"width\":35}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":99,\"width\":35}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":33,\"y\":1},\"size\":{\"height\":99,\"width\":35}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":99,\"width\":35}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + }, + "CPCheckBox": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;16;$aimage-positionD;K;6;CP$UIDd;1;8E;K;11;$aalignmentD;K;6;CP$UIDd;1;9E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;10E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;10E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;11E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;13E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;14E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;15E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;17E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;18E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;14E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;14E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;19E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;20E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;21E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;22E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;23E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;11E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;24E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;9;check-boxS;28;controlSizeRegular+roundRectD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;7E;K;4;nameD;K;6;CP$UIDd;2;25E;K;12;defaultValueD;K;6;CP$UIDd;2;20E;K;6;valuesD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;1;7E;K;4;nameD;K;6;CP$UIDd;2;28E;K;12;defaultValueD;K;6;CP$UIDd;2;20E;K;6;valuesD;K;6;CP$UIDd;2;29E;E;S;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;E;E;d;1;1d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;32E;E;S;6;ButtonT;d;1;2d;1;0f;3;0.5f;4;0.05d;2;12S;14;image-positionD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;20E;K;6;normalD;K;6;CP$UIDd;2;20E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;2;26E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;21E;K;6;normalD;K;6;CP$UIDd;2;21E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;33E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;34E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;35E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;36E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;37E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPCheckBox", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "1", + "objectValue": "1", + "state": "1", + "stringValue": "1", + "tag": "7", + "title": "Button" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPClipView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;12E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;13E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;14E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;15E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPCollectionView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;CPCollectionViewK;8;$classesA;S;16;CPCollectionViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;8E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;34;CPCollectionViewMaxNumberOfRowsKeyD;K;6;CP$UIDd;2;11E;K;37;CPCollectionViewMaxNumberOfColumnsKeyD;K;6;CP$UIDd;2;11E;K;29;CPCollectionViewSelectableKeyD;K;6;CP$UIDd;2;12E;K;42;CPCollectionViewAllowsMultipleSelectionKeyD;K;6;CP$UIDd;1;0E;K;33;CPCollectionViewVerticalMarginKeyD;K;6;CP$UIDd;2;13E;K;35;CPCollectionViewBackgroundColorsKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;F;S;4;viewS;6;normalS;6;{1, 1}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;d;1;0T;d;1;5D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;16E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;17E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;8E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;18E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPCollectionView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "isSelectable": "true", + "numberOfColumns": "-1", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPColorWell": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPColorWellK;8;$classesA;S;11;CPColorWellS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;10E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;12E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;19;CPColorWellColorKeyD;K;6;CP$UIDd;2;14E;K;22;CPColorWellBorderedKeyD;K;6;CP$UIDd;2;15E;E;S;20;{{0, 0}, {200, 100}}S;9;colorwellS;27;bordered+controlSizeRegularS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;19E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;20E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;21E;E;T;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;22E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;23E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;24E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;25E;E;E;S;5;colorS;6;normalD;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;28E;E;d;1;1d;1;0S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPColorWell", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "color": "CPColor:rgba(255, 0, 0, 1)", + "doubleValue": "0", + "objectValue": "nil", + "stringValue": "", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":3},\"size\":{\"height\":94,\"width\":194}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 0, 0, 1)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPComboBox": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;10;CPComboBoxK;8;$classesA;S;10;CPComboBoxS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;14E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;14E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;K;18;CPComboBoxItemsKeyD;K;6;CP$UIDd;2;18E;K;17;CPComboBoxListKeyD;K;6;CP$UIDd;1;0E;K;21;CPComboBoxDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPComboBoxDataSourceKeyD;K;6;CP$UIDd;1;0E;K;27;CPComboBoxUsesDataSourceKeyD;K;6;CP$UIDd;1;7E;K;22;CPComboBoxCompletesKeyD;K;6;CP$UIDd;1;7E;K;33;CPComboBoxNumberOfVisibleItemsKeyD;K;6;CP$UIDd;2;19E;K;32;CPComboBoxHasVerticalScrollerKeyD;K;6;CP$UIDd;2;14E;K;27;CPComboBoxButtonBorderedKeyD;K;6;CP$UIDd;2;14E;E;S;20;{{0, 0}, {200, 100}}S;8;comboboxS;60;bezeled+bordered+button-bordered+controlSizeRegular+editableS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;E;E;S;3;Oned;4;3072D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;T;d;1;2d;1;0S;0;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;10E;D;K;6;CP$UIDd;2;24E;E;E;d;1;5D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;25E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;26E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;28E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;29E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;30E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;3;TwoD;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;31E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;31E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;32E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;33E;E;S;57;{\"origin\":{\"x\":0,\"y\":1},\"size\":{\"width\":200,\"height\":99}}S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPComboBox", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "false", + "isBordered": "true", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "indexOfSelectedItem": "nil", + "numberOfItems": "2", + "objectValue": "One", + "stringValue": "One", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPControl": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;9;CPControlK;8;$classesA;S;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;7E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;7E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;4;viewS;27;controlSizeRegular+disabledS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;16E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;17E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;18E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;19E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;20E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;21E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPControl", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "nil", + "stringValue": "", + "tag": "7" + }, + "subviews": [] + } + }, + "CPDatePicker": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;12;CPDatePickerK;8;$classesA;S;12;CPDatePickerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;13;CPIntervalKeyD;K;6;CP$UIDd;2;15E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;2;15E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;2;15E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;2;16E;K;12;CPMinDateKeyD;K;6;CP$UIDd;2;17E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;2;18E;K;14;CPDateValueKeyD;K;6;CP$UIDd;2;11E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;2;20E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;2;21E;K;13;CPBorderedKeyD;K;6;CP$UIDd;2;21E;E;S;20;{{0, 0}, {200, 100}}S;10;datePickerS;35;bezeled+bordered+controlSizeRegularS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;D;K;10;$classnameS;6;CPDateK;8;$classesA;S;6;CPDateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;2;24E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;25E;E;d;1;0d;3;238D;K;6;$classD;K;6;CP$UIDd;2;10E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;2;26E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;2;27E;E;D;K;10;$classnameS;8;CPLocaleK;8;$classesA;S;8;CPLocaleS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPLocaleIdentifierLocaleKeyD;K;6;CP$UIDd;2;29E;E;T;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;30E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;31E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;32E;E;d;13;1793448000000S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}d;15;-62135510400000d;14;64092297600000D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;10;CP.objectsD;K;18;CPLocaleIdentifierD;K;6;CP$UIDd;2;33E;K;20;CPLocaleLanguageCodeD;K;6;CP$UIDd;2;34E;K;19;CPLocaleCountryCodeD;K;6;CP$UIDd;2;35E;K;16;CPLocaleCalendarD;K;6;CP$UIDd;2;36E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;37E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;38E;E;S;5;en_USS;2;enS;2;USS;19;CPGregorianCalendarS;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPDatePicker", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "true", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "CPDate", + "stringValue": "Sat Oct 31 2026 06:00:00 GMT-0600 (Mountain Daylight Time)", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(0, 0, 0, 0)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":1,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPStepper", + "frame": "{\"origin\":{\"x\":200,\"y\":50},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "maxValue": "59", + "minValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + ] + } + }, + "CPDisclosureButton": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;18;CPDisclosureButtonK;8;$classesA;S;18;CPDisclosureButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;7E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;7E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;15E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;16E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;17E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;18E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;19E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;17E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;20E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;21E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;1;8E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;22E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;6;buttonS;28;controlSizeRegular+roundRectS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;d;1;1d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;25E;E;S;6;Buttond;2;14d;1;0T;d;1;2f;3;0.5f;4;0.05d;2;12D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;26E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;27E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;28E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;29E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;30E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPDisclosureButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "1", + "objectValue": "1", + "state": "1", + "stringValue": "1", + "tag": "7", + "title": "Button" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPImageView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPImageViewK;8;$classesA;S;11;CPImageViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;7E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;7E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;1;0E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;4;viewS;27;controlSizeRegular+disabledS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;9E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;16E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;17E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;18E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;19E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;20E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;21E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPImageView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEditable": "false", + "isEnabled": "false", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "nil", + "stringValue": "", + "tag": "7" + }, + "subviews": [] + } + }, + "CPLevelIndicator": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;CPLevelIndicatorK;8;$classesA;S;16;CPLevelIndicatorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;10E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;12E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPLevelIndicatorStyleKeyD;K;6;CP$UIDd;2;13E;K;27;CPLevelIndicatorMinValueKeyD;K;6;CP$UIDd;2;14E;K;27;CPLevelIndicatorMaxValueKeyD;K;6;CP$UIDd;2;15E;K;31;CPLevelIndicatorWarningValueKeyD;K;6;CP$UIDd;2;13E;K;32;CPLevelIndicatorCriticalValueKeyD;K;6;CP$UIDd;2;13E;K;35;CPLevelIndicatorTickMarkPositionKeyD;K;6;CP$UIDd;1;0E;K;36;CPLevelIndicatorNumberOfTickMarksKeyD;K;6;CP$UIDd;1;0E;K;41;CPLevelIndicatorNumberOfMajorTickMarksKeyD;K;6;CP$UIDd;1;0E;K;29;CPLevelIndicatorIsEditableKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}S;15;level-indicatorS;18;controlSizeRegularS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;18E;E;d;1;2d;1;1d;1;9D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;19E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;20E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;21E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;22E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPLevelIndicator", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEditable": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "4", + "maxValue": "9", + "minValue": "1", + "objectValue": "4", + "stringValue": "4", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":41},\"size\":{\"height\":18,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":25,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":50,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":75,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":100,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":125,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":150,\"y\":41},\"size\":{\"height\":17,\"width\":24}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":175,\"y\":41},\"size\":{\"height\":17,\"width\":25}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPOutlineView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;13;CPOutlineViewK;8;$classesA;S;13;CPOutlineViewS;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;9E;K;12;$agrid-colorD;K;6;CP$UIDd;2;10E;K;24;$aalternating-row-colorsD;K;6;CP$UIDd;2;11E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;14E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;15E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;17E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;18E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;19E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;2;20E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;1;0E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;13E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;21E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;21E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;21E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;13E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;22E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;10E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;23E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;13E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;11E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;25E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;27E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;K;34;CPOutlineViewOutlineTableColumnKeyD;K;6;CP$UIDd;2;29E;K;35;CPOutlineViewIndentationPerLevelKeyD;K;6;CP$UIDd;2;30E;K;26;CPOutlineViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;24;CPOutlineViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;S;17;{{0, 0}, {63, 0}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;31E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;32E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;E;S;9;tableviewS;18;controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;34E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;32E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;1;7E;D;K;6;CP$UIDd;2;35E;E;E;S;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;38E;E;d;2;25S;6;{3, 2}d;1;1T;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;d;1;0D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;39E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;39E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;40E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;41E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;42E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;42E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;44E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;45E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;1;2E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;46E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;47E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;48E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;49E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;51E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;53E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;54E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;1;0E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;d;2;16D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;20E;E;E;S;5;colorS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;20E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;58E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;32E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;59E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;60E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;61E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;17;{{0, 0}, {7, 25}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;18;{{0, 0}, {63, 25}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;E;E;S;14;tableHeaderRowD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;3;oned;2;60d;2;10d;7;1000000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;42E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;42E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;62E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;63E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;64E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;1;0E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;65E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;65E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;66E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;67E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;68E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;69E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;70E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;71E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;23E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;69E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;d;1;3f;18;0.8627450980392157f;18;0.8784313725490196f;18;0.8862745098039215D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;20E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;76E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;79E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;16;{{0, 0}, {0, 0}}S;9;textfieldS;44;controlSizeRegular+placeholder+tableDataViewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;80E;E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;38E;E;d;1;2f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;42E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;42E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;81E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;82E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;84E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;60E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;53E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;53E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;85E;E;d;2;18S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;76E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPOutlineView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":63}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "numberOfColumns": "1", + "objectValue": "nil", + "stringValue": "", + "tag": "-1" + }, + "subviews": [] + } + }, + "CPPopUpButton": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;4E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;5E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;16;$aimage-positionD;K;6;CP$UIDd;1;8E;K;17;$aline-break-modeD;K;6;CP$UIDd;1;9E;K;11;$aalignmentD;K;6;CP$UIDd;2;10E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;11E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;11E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;12E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;14E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;15E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;1;9E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;17E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;18E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;19E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;10E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;20E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;1;8E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;10E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;21E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;22E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;20E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;23E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;2;24E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;2;25E;E;S;20;{{0, 0}, {200, 100}}S;12;popup-buttonS;37;bordered+controlSizeRegular+roundRectd;1;2d;1;4d;1;0S;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;E;E;d;1;1D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;28E;E;S;3;Twod;2;14T;f;3;0.5f;4;0.05d;2;12S;0;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;32E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;33E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;34E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;35E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;2E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;2;36E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;1;4E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;2;37E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;18E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;2E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;2;36E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;2;15E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;1;4E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;2;37E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;38E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;39E;E;S;3;OneS;17;_popUpItemAction:d;6;262144S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPPopUpButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "4", + "verticalAlignment": "2", + "doubleValue": "0", + "indexOfSelectedItem": "1", + "numberOfItems": "2", + "objectValue": "1", + "state": "0", + "stringValue": "", + "tag": "-1", + "title": "Two" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPPredicateEditor": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;17;CPPredicateEditorK;8;$classesA;S;17;CPPredicateEditorS;12;CPRuleEditorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;8E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;20;CPRuleEditorEditableD;K;6;CP$UIDd;2;15E;K;35;CPRuleEditorAllowsEmptyCompoundRowsD;K;6;CP$UIDd;2;10E;K;25;CPRuleEditorDisallowEmptyD;K;6;CP$UIDd;2;10E;K;30;CPRuleEditorAlignmentGridWidthD;K;6;CP$UIDd;1;0E;K;23;CPRuleEditorSliceHeightD;K;6;CP$UIDd;2;16E;K;23;CPRuleEditorNestingModeD;K;6;CP$UIDd;2;17E;K;27;CPRuleEditorStringsFilenameD;K;6;CP$UIDd;1;0E;K;26;CPRuleEditorRowTypeKeyPathD;K;6;CP$UIDd;2;18E;K;24;CPRuleEditorItemsKeyPathD;K;6;CP$UIDd;2;19E;K;25;CPRuleEditorValuesKeyPathD;K;6;CP$UIDd;2;20E;K;29;CPRuleEditorBoundArrayKeyPathD;K;6;CP$UIDd;2;21E;K;31;CPRuleEditorSubrowsArrayKeyPathD;K;6;CP$UIDd;2;22E;K;24;CPRuleEditorSlicesHolderD;K;6;CP$UIDd;2;23E;K;18;CPRuleEditorSlicesD;K;6;CP$UIDd;2;24E;K;27;CPRuleEditorBoundArrayOwnerD;K;6;CP$UIDd;2;26E;K;20;CPPredicateTemplatesD;K;6;CP$UIDd;2;27E;E;d;1;7S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;S;11;rule-editorS;27;controlSizeRegular+disabledS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;30E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;31E;E;T;d;2;26d;1;3S;7;rowTypeS;8;criteriaS;13;displayValuesS;10;boundArrayS;7;subrowsD;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;35E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;36E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;37E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;38E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;39E;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;33;_CPRuleEditorViewUnboundRowHolderK;8;$classesA;S;33;_CPRuleEditorViewUnboundRowHolderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;12;CPBoundArrayD;K;6;CP$UIDd;2;32E;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;E;E;D;K;10;$classnameS;28;_CPRuleEditorViewSliceHolderK;8;$classesA;S;28;_CPRuleEditorViewSliceHolderS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;40E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;41E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;42E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;28;CPPredicateEditorRowTemplateK;8;$classesA;S;28;CPPredicateEditorRowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;2;43E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;1;0E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;1;0E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;1;0E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;2;44E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;2;10E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;2;10E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;2;45E;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;E;E;d;2;18S;4;viewS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;48E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;49E;E;d;1;2d;1;0D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;E;E;D;K;10;$classnameS;35;_CPRuleEditorViewSliceDropSeparatorK;8;$classesA;S;35;_CPRuleEditorViewSliceDropSeparatorS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;37E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;38E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;55E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;57E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;58E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;58E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;60E;K;16;$aimage-positionD;K;6;CP$UIDd;2;43E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;12E;K;11;$aalignmentD;K;6;CP$UIDd;2;44E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;61E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;44E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;62E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;63E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;64E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;44E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;15E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;43E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;44E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;65E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;66E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;15E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;69E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;60E;K;16;$aimage-positionD;K;6;CP$UIDd;2;43E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;12E;K;11;$aalignmentD;K;6;CP$UIDd;2;44E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;70E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;44E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;71E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;72E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;64E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;44E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;15E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;43E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;44E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;65E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;66E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;15E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;67E;E;S;20;{{0, -10}, {200, 2}}S;18;{{0, 0}, {200, 2}}D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;2;73E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;2;74E;E;S;16;{{0, 0}, {1, 1}}S;12;popup-buttonS;37;bordered+controlSizeRegular+roundRectD;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;31E;E;S;3;Alld;2;14f;3;0.5f;4;0.05d;2;12D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;2;73E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;2;76E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;77E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;31E;E;S;25;of the following are trueS;0;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;81E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;41E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;51E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;51E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;83E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;84E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;41E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;52E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;52E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;85E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;51E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;2;86E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;2;87E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;2;88E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;89E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;51E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;2;86E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;2;87E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;90E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;52E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;2;86E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;68E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;2;87E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;48E;E;S;17;_popUpItemAction:d;6;262144d;1;1S;3;AnyS;57;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":100,\"height\":18}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPPredicateEditor", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEditable": "true", + "isEnabled": "false", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "nil", + "doubleValue": "0", + "objectValue": "nil", + "stringValue": "", + "tag": "7" + }, + "subviews": [] + } + }, + "CPProgressIndicator": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;19;CPProgressIndicatorK;8;$classesA;S;19;CPProgressIndicatorS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;9;_minValueD;K;6;CP$UIDd;2;10E;K;9;_maxValueD;K;6;CP$UIDd;2;11E;K;12;_doubleValueD;K;6;CP$UIDd;2;12E;K;12;_controlSizeD;K;6;CP$UIDd;2;13E;K;14;_indeterminateD;K;6;CP$UIDd;1;0E;K;6;_styleD;K;6;CP$UIDd;2;13E;K;12;_isAnimatingD;K;6;CP$UIDd;1;0E;K;26;_isDisplayedWhenStoppedSetD;K;6;CP$UIDd;1;7E;K;23;_isDisplayedWhenStoppedD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}S;18;progress-indicatorS;6;normalS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;d;1;1d;1;9d;1;4d;1;0E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPProgressIndicator", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "0", + "isHidden": "false", + "doubleValue": "4", + "maxValue": "9", + "minValue": "1", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":20,\"width\":75}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPRadio": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;7;CPRadioK;8;$classesA;S;7;CPRadioS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;6E;K;16;$aimage-positionD;K;6;CP$UIDd;1;7E;K;11;$aalignmentD;K;6;CP$UIDd;1;8E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;12E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;13E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;14E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;16E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;17E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;13E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;13E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;18E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;1;7E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;1;8E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;19E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;20E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;18E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;21E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;23E;E;d;1;7S;20;{{0, 0}, {200, 100}}S;5;radioS;37;bordered+controlSizeRegular+roundRectd;1;2d;1;0S;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;E;E;d;1;1d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;26E;E;S;6;ButtonT;f;3;0.5f;4;0.05d;2;12D;K;10;$classnameS;12;CPRadioGroupK;8;$classesA;S;12;CPRadioGroupS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;21;CPRadioGroupRadiosKeyD;K;6;CP$UIDd;2;27E;K;28;CPRadioGroupSelectedRadioKeyD;K;6;CP$UIDd;1;2E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;28E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;29E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;30E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;11E;K;10;CP.objectsA;D;K;6;CP$UIDd;1;2E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;31E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;15E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;32E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPRadio", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "1", + "objectValue": "1", + "state": "1", + "stringValue": "1", + "tag": "7", + "title": "Button" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPRuleEditor": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;12;CPRuleEditorK;8;$classesA;S;12;CPRuleEditorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;8E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;20;CPRuleEditorEditableD;K;6;CP$UIDd;2;15E;K;35;CPRuleEditorAllowsEmptyCompoundRowsD;K;6;CP$UIDd;2;10E;K;25;CPRuleEditorDisallowEmptyD;K;6;CP$UIDd;2;10E;K;30;CPRuleEditorAlignmentGridWidthD;K;6;CP$UIDd;1;0E;K;23;CPRuleEditorSliceHeightD;K;6;CP$UIDd;2;16E;K;23;CPRuleEditorNestingModeD;K;6;CP$UIDd;2;17E;K;27;CPRuleEditorStringsFilenameD;K;6;CP$UIDd;1;0E;K;26;CPRuleEditorRowTypeKeyPathD;K;6;CP$UIDd;2;18E;K;24;CPRuleEditorItemsKeyPathD;K;6;CP$UIDd;2;19E;K;25;CPRuleEditorValuesKeyPathD;K;6;CP$UIDd;2;20E;K;29;CPRuleEditorBoundArrayKeyPathD;K;6;CP$UIDd;2;21E;K;31;CPRuleEditorSubrowsArrayKeyPathD;K;6;CP$UIDd;2;22E;K;24;CPRuleEditorSlicesHolderD;K;6;CP$UIDd;2;23E;K;18;CPRuleEditorSlicesD;K;6;CP$UIDd;2;24E;K;27;CPRuleEditorBoundArrayOwnerD;K;6;CP$UIDd;2;26E;E;d;1;7S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;S;11;rule-editorS;27;controlSizeRegular+disabledS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;30E;E;T;d;2;26d;1;3S;7;rowTypeS;8;criteriaS;13;displayValuesS;10;boundArrayS;7;subrowsD;K;6;$classD;K;6;CP$UIDd;2;27E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;32E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;33E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;34E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;35E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;36E;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;33;_CPRuleEditorViewUnboundRowHolderK;8;$classesA;S;33;_CPRuleEditorViewUnboundRowHolderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;12;CPBoundArrayD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;28;_CPRuleEditorViewSliceHolderK;8;$classesA;S;28;_CPRuleEditorViewSliceHolderS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;38E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;39E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;41E;E;E;d;2;18S;4;viewS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;43E;E;D;K;10;$classnameS;35;_CPRuleEditorViewSliceDropSeparatorK;8;$classesA;S;35;_CPRuleEditorViewSliceDropSeparatorS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;44E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;45E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;46E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;34E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;35E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;10E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;47E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}S;20;{{0, -10}, {200, 2}}S;18;{{0, 0}, {200, 2}}d;1;2D;K;6;$classD;K;6;CP$UIDd;1;5E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPRuleEditor", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEditable": "true", + "isEnabled": "false", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "nil", + "doubleValue": "0", + "objectValue": "nil", + "stringValue": "", + "tag": "7" + }, + "subviews": [] + } + }, + "CPRulerView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPRulerViewK;8;$classesA;S;11;CPRulerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;25;CPRulerViewOrientationKeyD;K;6;CP$UIDd;1;0E;K;24;CPRulerViewClientViewKeyD;K;6;CP$UIDd;1;0E;K;27;CPRulerViewAccessoryViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPRulerViewMarkersKeyD;K;6;CP$UIDd;1;0E;K;27;CPRulerViewRuleThicknessKeyD;K;6;CP$UIDd;1;0E;K;41;CPRulerViewReservedThicknessForMarkersKeyD;K;6;CP$UIDd;1;0E;K;47;CPRulerViewReservedThicknessForAccessoryViewKeyD;K;6;CP$UIDd;1;0E;K;26;CPRulerViewOriginOffsetKeyD;K;6;CP$UIDd;1;0E;K;30;CPRulerViewMeasurementUnitsKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;12E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;13E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;14E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;15E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPRulerView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPScrollView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;12E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;13E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;15E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;16E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;17E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;17E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;17E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;17E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;18E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;18E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;1;0E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;2;20E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;2;21E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;2;21E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;21E;K;31;CPScrollViewAllowsMagnificationD;K;6;CP$UIDd;1;9E;K;28;CPScrollViewMinMagnificationD;K;6;CP$UIDd;2;22E;K;28;CPScrollViewMaxMagnificationD;K;6;CP$UIDd;2;23E;K;21;CPScrollViewHasVRulerD;K;6;CP$UIDd;1;9E;K;21;CPScrollViewHasHRulerD;K;6;CP$UIDd;1;9E;K;25;CPScrollViewRulersVisibleD;K;6;CP$UIDd;1;9E;K;18;CPScrollViewVRulerD;K;6;CP$UIDd;1;0E;K;18;CPScrollViewHRulerD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;12E;D;K;6;CP$UIDd;2;13E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;E;E;S;10;scrollviewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;24E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;24E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;25E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;26E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;27E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;28E;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;29E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;29E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;26E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;30E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;31E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;32E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;33E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;35E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;21E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;1;2E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;36E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;23E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;38E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;18E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;39E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;2;21E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;40E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;41E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;33E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;42E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;43E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;21E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;1;2E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;44E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;23E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;45E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;1;9E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;46E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;2;21E;E;d;2;10T;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;47E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;48E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;50E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;26E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;51E;E;d;1;0f;4;0.25d;1;4S;19;{{0, 0}, {193, 93}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;E;E;S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;12E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;52E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;12E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;26E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;54E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;19;{{193, 0}, {7, 93}}S;17;{{0, 0}, {7, 93}}S;8;scrollerS;49;controlSizeRegular+scroller-style-legacy+verticalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;E;E;S;27;_verticalScrollerDidScroll:D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;57E;E;f;6;0.2325S;19;{{0, 93}, {193, 7}}S;18;{{0, 0}, {193, 7}}S;40;controlSizeRegular+scroller-style-legacyD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;58E;E;E;S;29;_horizontalScrollerDidScroll:D;K;6;$classD;K;6;CP$UIDd;2;37E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;57E;E;f;18;0.6433333333333333S;19;{{193, 93}, {7, 7}}S;16;{{0, 0}, {7, 7}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;60E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;20;{{3, 5}, {300, 400}}S;20;{{0, 0}, {300, 400}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;61E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;62E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;15E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;15E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;63E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;55E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;64E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;62E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;16E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;16E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;66E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;2;37E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;67E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;37E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;69E;E;d;1;1S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;56;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":100}}S;56;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":0}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPScrollView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":93,\"width\":193}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":400,\"width\":300}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":193,\"y\":93},\"size\":{\"height\":7,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":193,\"y\":0},\"size\":{\"height\":93,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":93,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":93},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":21.622500000000002,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":0,\"y\":93},\"size\":{\"height\":7,\"width\":193}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":193}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":193,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":124.16333333333333}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + }, + "CPScroller": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;1;3E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;4E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;4E;K;16;CPViewOpacityKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;11E;K;17;CPControlValueKeyD;K;6;CP$UIDd;1;5E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;1;9E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;15E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;2;15E;E;d;1;7S;18;{{0, 0}, {200, 7}}d;1;0S;8;scrollerS;27;controlSizeRegular+disabledS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;18E;E;d;1;1D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;19E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;20E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;21E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;22E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "7" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPSearchField": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;13;CPSearchFieldK;8;$classesA;S;13;CPSearchFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;14E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;14E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;K;27;CPSendsWholeSearchStringKeyD;K;6;CP$UIDd;1;7E;K;33;CPSendsSearchStringImmediatelyKeyD;K;6;CP$UIDd;1;7E;K;19;CPMaximumRecentsKeyD;K;6;CP$UIDd;2;18E;E;S;20;{{0, 0}, {200, 100}}S;11;searchfieldS;52;bezeled+bordered+controlSizeRegular+editable+roundedS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;E;E;S;4;Textd;5;68608D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;24E;E;T;d;1;2d;1;0S;0;d;2;10D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;25E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;26E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;2;28E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;30E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;26E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;2;31E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;32E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;33E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;26E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;34E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;35E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;36E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;37E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;38E;E;d;2;40D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;10;CP.objectsD;K;8;isButtonD;K;6;CP$UIDd;2;14E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;38E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;39E;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;10;CP.objectsD;K;8;isButtonD;K;6;CP$UIDd;2;14E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;39E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;40E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;40E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;41E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;S;55;{\"origin\":{\"x\":5,\"y\":50},\"size\":{\"width\":0,\"height\":0}}S;57;{\"origin\":{\"x\":195,\"y\":50},\"size\":{\"width\":0,\"height\":0}}S;57;{\"origin\":{\"x\":0,\"y\":1},\"size\":{\"width\":200,\"height\":99}}S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPSearchField", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "1", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "false", + "isBordered": "true", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "Text", + "stringValue": "Text", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":195,\"y\":50},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "1", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":5,\"y\":50},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "4", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "false", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + }, + "CPSecureTextField": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;17;CPSecureTextFieldK;8;$classesA;S;17;CPSecureTextFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;14E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;14E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}S;9;textfieldS;35;bezeled+controlSizeRegular+editableS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;E;E;S;4;Textd;4;3072D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;21E;E;T;d;1;2d;1;0S;0;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;22E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;23E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;24E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;25E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;26E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;27E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;28E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;28E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;29E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;30E;E;S;57;{\"origin\":{\"x\":0,\"y\":1},\"size\":{\"width\":200,\"height\":99}}S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPSecureTextField", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "false", + "isBordered": "false", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "Text", + "stringValue": "Text", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPSegmentedControl": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;10E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;12E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;2;13E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;2;14E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;1;0E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;2;15E;E;S;19;{{0, 0}, {81, 100}}S;17;segmented-controlS;18;controlSizeRegularS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;18E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;E;E;d;2;-1d;1;0D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;22E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;23E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;24E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;2;25E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;1;7E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;2;26E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;2;14E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;2;28E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;1;7E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;2;26E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;2;14E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;29E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;11E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;30E;E;S;3;OneT;d;2;40S;3;TwoS;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPSegmentedControl", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":81}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "nil", + "segmentCount": "2", + "stringValue": "", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":41,\"y\":0},\"size\":{\"height\":0,\"width\":40}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":40,\"y\":0},\"size\":{\"height\":0,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":40}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":81,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPShadowView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;12;CPShadowViewK;8;$classesA;S;12;CPShadowViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;8E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;12E;E;E;F;S;11;shadow-viewS;22;shadowview-style-lightS;6;{1, 1}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;13E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;14E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;15E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;16E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;9E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;9E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;17E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}S;4;viewS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPShadowView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPSlider": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;2;14E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;2;15E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;1;0E;K;15;CPSliderTypeKeyD;K;6;CP$UIDd;2;16E;K;35;CPSliderAllowsTickMarkValuesOnlyKeyD;K;6;CP$UIDd;1;0E;K;27;CPSliderTickMarkPositionKeyD;K;6;CP$UIDd;1;0E;K;28;CPSliderNumberOfTickMarksKeyD;K;6;CP$UIDd;2;16E;E;S;20;{{0, 0}, {200, 100}}S;6;sliderS;18;controlSizeRegularS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;18E;E;E;d;1;4d;2;68D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;19E;E;d;1;1d;1;9d;1;0D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;20E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;21E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;22E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;24E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPSlider", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "4", + "maxValue": "9", + "minValue": "1", + "objectValue": "4", + "stringValue": "4", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPSplitView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPSplitViewK;8;$classesA;S;11;CPSplitViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;22;CPSplitViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;24;CPSplitViewIsVerticalKeyD;K;6;CP$UIDd;2;11E;K;26;CPSplitViewDividerStyleKeyD;K;6;CP$UIDd;2;12E;K;29;CPSplitViewDividerSubviewsKeyD;K;6;CP$UIDd;2;13E;K;30;CPSplitViewArrangedSubviewsKeyD;K;6;CP$UIDd;2;14E;K;26;CPSplitViewRealSubviewsKeyD;K;6;CP$UIDd;2;15E;K;33;CPSplitViewArrangesAllSubviewsKeyD;K;6;CP$UIDd;2;11E;K;26;CPSplitViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;E;E;S;9;splitviewS;32;splitview-divider-thick+verticalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;E;E;T;d;1;1D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;22E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;22E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;25E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;26E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;22E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;28E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;29E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;30E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;32E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;33E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;34E;E;S;19;{{0, 0}, {40, 100}}S;4;viewS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;20;{{50, 0}, {40, 100}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;20;{{40, 0}, {10, 100}}S;19;{{0, 0}, {10, 100}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;35E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;2;31E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;35E;E;S;58;{\"origin\":{\"x\":38,\"y\":0},\"size\":{\"width\":14,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPSplitView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":40}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":50,\"y\":0},\"size\":{\"height\":100,\"width\":40}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":40,\"y\":0},\"size\":{\"height\":100,\"width\":10}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPStackView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPStackViewK;8;$classesA;S;11;CPStackViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;22;CPStackViewOrientationD;K;6;CP$UIDd;2;11E;K;20;CPStackViewAlignmentD;K;6;CP$UIDd;2;12E;K;23;CPStackViewDistributionD;K;6;CP$UIDd;2;11E;K;18;CPStackViewSpacingD;K;6;CP$UIDd;2;13E;K;21;CPStackViewEdgeInsetsD;K;6;CP$UIDd;2;15E;K;30;CPStackViewDetachesHiddenViewsD;K;6;CP$UIDd;2;16E;K;23;CPStackViewViewsLeadingD;K;6;CP$UIDd;2;17E;K;22;CPStackViewViewsCenterD;K;6;CP$UIDd;2;18E;K;24;CPStackViewViewsTrailingD;K;6;CP$UIDd;2;19E;K;25;CPStackViewCustomSpacingsD;K;6;CP$UIDd;2;21E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;d;1;0d;2;10d;1;8D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;24E;E;T;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;10;CPMapTableK;8;$classesA;S;10;CPMapTableS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;17;CPMapTableKeysKeyD;K;6;CP$UIDd;2;25E;K;20;CPMapTableObjectsKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;27E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;28E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;29E;E;S;39;{\"top\":0,\"right\":0,\"bottom\":0,\"left\":0}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;19;{{0, 35}, {40, 30}}S;18;{{0, 0}, {40, 30}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPStackView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "10", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":35},\"size\":{\"height\":30,\"width\":40}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPStepper": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;9;CPStepperK;8;$classesA;S;9;CPStepperS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;18;CPStepperIncrementD;K;6;CP$UIDd;2;15E;K;17;CPStepperMinValueD;K;6;CP$UIDd;2;15E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;2;16E;K;19;CPStepperValueWrapsD;K;6;CP$UIDd;2;17E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;2;17E;E;S;16;{{0, 0}, {0, 0}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;E;E;S;7;stepperS;18;controlSizeRegularS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;E;E;d;1;4d;5;65540D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;d;1;1d;1;9T;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;24E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;25E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;26E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;27E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;1;2E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;28E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;29E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;30E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;27E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;17E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;31E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;27E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;32E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;33E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;17E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;34E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;24E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;25E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;35E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;27E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;1;2E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;28E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;36E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;30E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;27E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;17E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;31E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;27E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;32E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;2;33E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;17E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;34E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;38E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;39E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;6;buttonS;37;bordered+controlSizeRegular+roundRectD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;E;E;d;1;0S;16;_buttonDidClick:D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;d;2;14d;1;2f;3;0.5f;4;0.05d;2;12D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;41E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;23E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;43E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;38E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;19E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;19E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;45E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;38E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;20E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;20E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;46E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;42E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPStepper", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "4", + "maxValue": "9", + "minValue": "1", + "objectValue": "4", + "stringValue": "4", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPButton", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "2", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "12", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isBordered": "true", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "2", + "doubleValue": "0", + "objectValue": "0", + "state": "0", + "stringValue": "0", + "tag": "-1", + "title": "nil" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + }, + "CPTabView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;9;CPTabViewK;8;$classesA;S;9;CPTabViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;2;10E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;11E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;2;12E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}S;8;tab-viewS;6;normalS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;14E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;18E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;2;18E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;19E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;d;1;0D;K;10;$classnameS;13;CPTabViewItemK;8;$classesA;S;13;CPTabViewItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;15E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;2;15E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;17E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;S;3;oneD;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;20E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;21E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;22E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;23E;E;S;3;twoD;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;20E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;20E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;21E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;22E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;24E;E;S;5;$nulld;2;18S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTabView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "numberOfTabViewItems": "2", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "18", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "18", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":2,\"y\":0},\"size\":{\"height\":0,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":1,\"y\":0},\"size\":{\"height\":0,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":1}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPTableCellView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;15;CPTableCellViewK;8;$classesA;S;15;CPTableCellViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;12E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;13E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;14E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;15E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTableCellView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "objectValue": "nil", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPTableHeaderView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;12E;E;E;S;14;tableHeaderRowS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;11E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;13E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;14E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;15E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;16E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTableHeaderView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPTableView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;9E;K;12;$agrid-colorD;K;6;CP$UIDd;2;10E;K;24;$aalternating-row-colorsD;K;6;CP$UIDd;2;11E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;14E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;15E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;17E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;18E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;19E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;2;20E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;1;0E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;13E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;21E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;21E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;21E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;13E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;22E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;10E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;20E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;13E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;11E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;24E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;S;18;{{0, 0}, {126, 0}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;27E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;28E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;E;S;9;tableviewS;18;controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;30E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;28E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;1;7E;D;K;6;CP$UIDd;2;31E;E;E;S;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;E;E;d;1;4D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;34E;E;d;2;25S;6;{3, 2}d;1;0T;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;38E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;38E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;39E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;40E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;41E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;41E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;42E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;44E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;1;2E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;E;E;S;5;colorS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;45E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;49E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;28E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;50E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;51E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;52E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;53E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;54E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;55E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;56E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;58E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;60E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;1;0E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;62E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;54E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;55E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;56E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;64E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;1;0E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;S;17;{{0, 0}, {7, 25}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;19;{{0, 0}, {126, 25}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;63E;E;E;S;14;tableHeaderRowD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;d;1;1f;18;0.8627450980392157f;18;0.8784313725490196f;18;0.8862745098039215D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;45E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;68E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;69E;E;S;3;oned;2;60d;2;10d;7;1000000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;70E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;70E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;71E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;72E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;73E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;1;0E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;74E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;75E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;76E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;77E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;78E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;79E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;80E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;81E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;20E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;78E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;d;1;3S;3;twoD;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;82E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;70E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;83E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;72E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;1;0E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;74E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;75E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;76E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;85E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;78E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;79E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;86E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;81E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;20E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;78E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}S;18;{{0, 0}, {63, 25}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;16;{{0, 0}, {0, 0}}S;9;textfieldS;44;controlSizeRegular+placeholder+tableDataViewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;89E;E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;34E;E;d;1;2S;19;{{63, 0}, {63, 25}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;90E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;34E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;70E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;70E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;94E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;95E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;51E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;60E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;60E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;63E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;70E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;70E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;63E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;12E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;12E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;13E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;97E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;98E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;51E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;64E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;64E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;99E;E;d;2;18S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;68E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTableView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":126}}", + "state": { + "acceptsFirstResponder": "true", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "true", + "isHidden": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "numberOfColumns": "2", + "objectValue": "nil", + "stringValue": "", + "tag": "-1" + }, + "subviews": [] + } + }, + "CPTextField": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;4E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;5E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;6E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;6E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;7E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;1;9E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;10E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;11E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;13E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;14E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;14E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;S;20;{{0, 0}, {200, 100}}S;9;textfieldS;35;bezeled+controlSizeRegular+editableS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;8E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;E;E;S;4;Textd;4;3072D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;21E;E;T;d;1;2d;1;0S;0;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;22E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;23E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;24E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;25E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;26E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;27E;E;S;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;28E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;28E;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;29E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;30E;E;S;57;{\"origin\":{\"x\":0,\"y\":1},\"size\":{\"width\":200,\"height\":99}}S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTextField", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "false", + "isBordered": "false", + "isEditable": "true", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "Text", + "stringValue": "Text", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPTextView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;10;CPTextViewK;8;$classesA;S;10;CPTextViewS;6;CPTextS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;11E;K;23;CPTextViewIsEditableKeyD;K;6;CP$UIDd;2;12E;K;25;CPTextViewIsSelectableKeyD;K;6;CP$UIDd;2;12E;K;23;CPTextViewIsRichTextKeyD;K;6;CP$UIDd;1;9E;K;21;CPTextViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;22;CPTextViewContainerKeyD;K;6;CP$UIDd;2;14E;K;32;CPTextViewInsertionPointColorKeyD;K;6;CP$UIDd;2;15E;K;35;CPTextViewSelectedTextAttributesKeyD;K;6;CP$UIDd;2;17E;K;23;CPTextViewAllowsUndoKeyD;K;6;CP$UIDd;2;12E;K;26;CPTextViewUsesFontPanelKeyD;K;6;CP$UIDd;2;12E;K;22;CPTextViewUsesRulerKeyD;K;6;CP$UIDd;2;12E;K;34;CPTextViewHorizontallyResizableKeyD;K;6;CP$UIDd;1;9E;K;32;CPTextViewVerticallyResizableKeyD;K;6;CP$UIDd;2;12E;K;9;CPMaxSizeD;K;6;CP$UIDd;2;18E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;19E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;20E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;E;E;T;D;K;10;$classnameS;15;CPTextContainerK;8;$classesA;S;15;CPTextContainerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;22;CPTextContainerSizeKeyD;K;6;CP$UIDd;2;18E;K;31;CPTextContainerLayoutManagerKeyD;K;6;CP$UIDd;2;22E;K;37;CPTextContainerWidthTracksTextViewKeyD;K;6;CP$UIDd;1;0E;K;38;CPTextContainerHeightTracksTextViewKeyD;K;6;CP$UIDd;1;0E;K;37;CPTextContainerLineFragmentPaddingKeyD;K;6;CP$UIDd;2;23E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;24E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;20E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;10;CP.objectsD;K;30;CPBackgroundColorAttributeNameD;K;6;CP$UIDd;2;25E;E;E;S;15;{200, 10000000}D;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;26E;E;E;S;5;colorD;K;10;$classnameS;15;CPLayoutManagerK;8;$classesA;S;15;CPLayoutManagerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;29;CPLayoutManagerTextStorageKeyD;K;6;CP$UIDd;2;28E;E;d;1;5D;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;26E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;30E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;20E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;E;d;1;1D;K;10;$classnameS;13;CPTextStorageK;8;$classesA;S;13;CPTextStorageS;25;CPMutableAttributedStringS;18;CPAttributedStringS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;24;CPAttributedStringStringD;K;6;CP$UIDd;2;31E;K;24;CPAttributedStringRangesD;K;6;CP$UIDd;2;32E;K;28;CPAttributedStringAttributesD;K;6;CP$UIDd;2;33E;E;d;1;0D;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;26E;E;E;S;4;TextD;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;E;E;f;3;0.6f;3;0.8D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;39E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;10;CP.objectsD;E;E;S;25;{\"location\":0,\"length\":4}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTextView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "true", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "isEditable": "true", + "isHidden": "false", + "isSelectable": "true", + "objectValue": "Text", + "string": "Text", + "stringValue": "Text", + "tag": "-1" + }, + "subviews": [] + } + }, + "CPTokenField": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;12;CPTokenFieldK;8;$classesA;S;12;CPTokenFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;11E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;14E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;K;37;CPTokenFieldTokenizingCharacterSetKeyD;K;6;CP$UIDd;2;19E;K;27;CPTokenFieldCompletionDelayD;K;6;CP$UIDd;2;20E;K;25;CPTokenFieldButtonTypeKeyD;K;6;CP$UIDd;2;16E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;E;E;S;10;tokenfieldS;26;bezeled+controlSizeRegularS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;E;E;d;4;3072D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;d;1;2d;1;0S;0;D;K;10;$classnameS;28;_CPStringContentCharacterSetK;8;$classesA;S;28;_CPStringContentCharacterSetS;14;CPCharacterSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;25;CPCharacterSetInvertedKeyD;K;6;CP$UIDd;1;9E;K;37;_CPStringContentCharacterSetStringKeyD;K;6;CP$UIDd;2;28E;E;f;3;0.5D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;29E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;30E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;31E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;32E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;33E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;35E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;37E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;38E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;40E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;41E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;42E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;42E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;42E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;42E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;1;9E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;1;9E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;1;0E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;2;44E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;2;16E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;2;16E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;16E;K;31;CPScrollViewAllowsMagnificationD;K;6;CP$UIDd;1;9E;K;28;CPScrollViewMinMagnificationD;K;6;CP$UIDd;2;45E;K;28;CPScrollViewMaxMagnificationD;K;6;CP$UIDd;2;46E;K;21;CPScrollViewHasVRulerD;K;6;CP$UIDd;1;9E;K;21;CPScrollViewHasHRulerD;K;6;CP$UIDd;1;9E;K;25;CPScrollViewRulersVisibleD;K;6;CP$UIDd;1;9E;K;18;CPScrollViewVRulerD;K;6;CP$UIDd;1;0E;K;18;CPScrollViewHRulerD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;47E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;1;2E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;1;2E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;49E;E;S;3;OneS;3;TwoS;103;{\"_stateNames\":{\"controlSizeRegular\":true},\"_stateNameString\":\"controlSizeRegular\",\"_stateNameCount\":1}S;1;,S;19;{{0, 1}, {200, 99}}S;19;{{0, 0}, {200, 99}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;E;E;d;2;18S;10;scrollviewS;6;normalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;30E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;30E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;52E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;53E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;54E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;55E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;56E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;56E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;57E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;58E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;60E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;16E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;22E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;46E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;62E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;57E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;63E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;2;16E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;64E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;64E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;57E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;58E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;16E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;22E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;67E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;46E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;1;9E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;63E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;2;16E;E;d;2;10D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;54E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;71E;E;f;4;0.25d;1;4D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;53E;E;E;S;4;viewD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;74E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;74E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;75E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;15E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;76E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;16;{{0, 0}, {7, 0}}T;S;8;scrollerS;58;controlSizeRegular+disabled+scroller-style-legacy+verticalD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;77E;E;E;S;27;_verticalScrollerDidScroll:D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;d;1;1S;16;{{0, 0}, {0, 7}}S;49;controlSizeRegular+disabled+scroller-style-legacyD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;78E;E;E;S;29;_horizontalScrollerDidScroll:D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;34E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":0}}S;58;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":200,\"height\":100}}S;19;{{0, 0}, {200, 30}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;84E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;40E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;40E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;2;86E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;41E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;2;87E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;63E;E;E;S;5;colorD;K;10;$classnameS;18;_CPTokenFieldTokenK;8;$classesA;S;18;_CPTokenFieldTokenS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;53E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;89E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;90E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;53E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;91E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;92E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;25E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;93E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;53E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;94E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;89E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;95E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;53E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;91E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;96E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;26E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;12E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;97E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;15E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;16E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;17E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;1;0E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;1;0E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;98E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;99E;E;S;17;{{0, 1}, {0, 29}}S;17;{{0, 0}, {0, 29}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;E;E;S;16;tokenfield-tokenD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;102E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;S;17;{{2, 1}, {0, 29}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;103E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;104E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":0,\"height\":1}}S;54;{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"width\":1,\"height\":0}}D;K;10;$classnameS;34;_CPTokenFieldTokenDisclosureButtonK;8;$classesA;S;34;_CPTokenFieldTokenDisclosureButtonS;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;100E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;82E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;106E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;107E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;82E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;57E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;109E;K;16;$aimage-positionD;K;6;CP$UIDd;2;15E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;46E;K;11;$aalignmentD;K;6;CP$UIDd;2;16E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;16E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;46E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;111E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;112E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;16E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;57E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;15E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;16E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;20E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;113E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;57E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;114E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;115E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;82E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;82E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;116E;E;D;K;6;$classD;K;6;CP$UIDd;3;100E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;83E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;117E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;107E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;83E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;57E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;109E;K;16;$aimage-positionD;K;6;CP$UIDd;2;15E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;46E;K;11;$aalignmentD;K;6;CP$UIDd;2;16E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;118E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;16E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;46E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;119E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;112E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;16E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;57E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;15E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;16E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;2;20E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;113E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;57E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;114E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;120E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;83E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;83E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;121E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;2;17E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;122E;E;S;18;{{-15, 5}, {0, 0}}S;34;tokenfield-token-disclosure-buttonS;48;bordered+controlSizeRegular+pulls-down+roundRectD;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;123E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;d;2;14f;4;0.05d;2;12D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;2;17E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;124E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;127E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;128E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;101E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;101E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;130E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;131E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;2;48E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;103E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;103E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;132E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;17E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;101E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;133E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;2;57E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;2;17E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;103E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;133E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;2;57E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;13E;K;15;CPValueValueKeyD;K;6;CP$UIDd;2;72E;E;S;17;_popUpItemAction:d;6;262144E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPTokenField", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "bezelStyle": "0", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "drawsBackground": "false", + "isBordered": "false", + "isEditable": "false", + "isEnabled": "true", + "isHidden": "false", + "isSelectable": "false", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "[One, Two]", + "stringValue": "One,Two", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPScrollView", + "frame": "{\"origin\":{\"x\":0,\"y\":1},\"size\":{\"height\":99,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "18", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":99,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":30,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "2", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":29,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":29,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + }, + { + "class": "CPClipView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(255, 255, 255, 1)", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":7}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + }, + { + "class": "CPScroller", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "alignment": "0", + "autoresizingMask": "0", + "backgroundColor": "nil", + "controlSize": "{\"_stateNameCount\":1,\"_stateNameString\":\"controlSizeRegular\",\"_stateNames\":{\"controlSizeRegular\":true}}", + "isEnabled": "false", + "isHidden": "true", + "lineBreakMode": "2", + "verticalAlignment": "1", + "doubleValue": "0", + "objectValue": "0", + "stringValue": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":7,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + }, + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":0,\"width\":0}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + ] + } + ] + } + }, + "CPView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;10E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;12E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;13E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;6E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;7E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;1;8E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;1;8E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;1;9E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;14E;E;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + }, + "CPVisualEffectView": { + "archive": "280NPLIST;1.0;D;K;4;$topD;K;4;rootD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;18;CPVisualEffectViewK;8;$classesA;S;18;CPVisualEffectViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;1;3E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;1;3E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;1;5E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;1;7E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;9E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;10E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;10E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;11E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;2;13E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;14E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;2;15E;K;9;_materialD;K;6;CP$UIDd;2;16E;K;6;_stateD;K;6;CP$UIDd;2;16E;E;S;20;{{0, 0}, {200, 100}}D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;18E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;6E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;19E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;20E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;21E;E;S;4;viewS;23;appearance-vibrant-darkS;6;{1, 1}F;D;K;10;$classnameS;12;CPAppearanceK;8;$classesA;S;12;CPAppearanceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;5;_nameD;K;6;CP$UIDd;2;22E;K;15;_allowsVibrancyD;K;6;CP$UIDd;2;23E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;d;1;1d;1;0D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;1;2E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;24E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;25E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;1;2E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;8E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;1;9E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;10E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;10E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;11E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;26E;E;D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;15E;E;E;S;5;colorS;6;normalS;27;CPAppearanceNameVibrantDarkT;S;18;{{3, 5}, {20, 10}}S;18;{{0, 0}, {20, 10}}D;K;6;$classD;K;6;CP$UIDd;1;4E;K;10;CP.objectsA;E;E;f;19;0.11764705882352941E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;", + "state": { + "class": "CPVisualEffectView", + "frame": "{\"origin\":{\"x\":0,\"y\":0},\"size\":{\"height\":100,\"width\":200}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "CPColor:rgba(30, 30, 30, 1)", + "isHidden": "false", + "state": "0", + "tag": "-1" + }, + "subviews": [ + { + "class": "CPView", + "frame": "{\"origin\":{\"x\":3,\"y\":5},\"size\":{\"height\":10,\"width\":20}}", + "state": { + "acceptsFirstResponder": "false", + "autoresizingMask": "0", + "backgroundColor": "nil", + "isHidden": "false", + "tag": "-1" + }, + "subviews": [] + } + ] + } + } +} diff --git a/Tests/AppKit/Resources/DropInCibs.json b/Tests/AppKit/Resources/DropInCibs.json new file mode 100644 index 000000000..9c325825a --- /dev/null +++ b/Tests/AppKit/Resources/DropInCibs.json @@ -0,0 +1,10 @@ +{ + "SmartFoldersPredicateEditor.cib": [ + "{\"class\":\"CPApplication\"}", + "{\"class\":\"CPWindow\",\"title\":\"Predicate Editor\",\"contentView\":{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":1,\\\"y\\\":1},\\\"size\\\":{\\\"height\\\":290,\\\"width\\\":551}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"18\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPTextField\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":63,\\\"y\\\":12},\\\"size\\\":{\\\"height\\\":29,\\\"width\\\":474}}\",\"state\":{\"acceptsFirstResponder\":\"true\",\"alignment\":\"4\",\"autoresizingMask\":\"34\",\"backgroundColor\":\"CPColor:rgba(255, 255, 255, 1)\",\"bezelStyle\":\"0\",\"controlSize\":\"0\",\"drawsBackground\":\"true\",\"isBordered\":\"false\",\"isEditable\":\"true\",\"isEnabled\":\"true\",\"isHidden\":\"false\",\"isSelectable\":\"true\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"1\",\"doubleValue\":\"0\",\"objectValue\":\"\",\"stringValue\":\"\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":29,\\\"width\\\":474}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPTextField\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":19,\\\"y\\\":18},\\\"size\\\":{\\\"height\\\":17,\\\"width\\\":41}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"4\",\"autoresizingMask\":\"36\",\"backgroundColor\":\"CPColor:rgba(175, 175, 175, 1)\",\"bezelStyle\":\"0\",\"controlSize\":\"0\",\"drawsBackground\":\"false\",\"isBordered\":\"false\",\"isEditable\":\"false\",\"isEnabled\":\"true\",\"isHidden\":\"false\",\"isSelectable\":\"false\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"1\",\"doubleValue\":\"0\",\"objectValue\":\"Name:\",\"stringValue\":\"Name:\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":17,\\\"width\\\":41}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPScrollView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":20,\\\"y\\\":55},\\\"size\\\":{\\\"height\\\":184,\\\"width\\\":512}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"18\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPClipView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":1,\\\"y\\\":1},\\\"size\\\":{\\\"height\\\":182,\\\"width\\\":510}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"8\",\"backgroundColor\":\"CPColor:rgba(232, 232, 232, 1)\",\"isHidden\":\"false\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPPredicateEditor\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":182,\\\"width\\\":510}}\",\"state\":{\"acceptsFirstResponder\":\"true\",\"alignment\":\"0\",\"autoresizingMask\":\"18\",\"backgroundColor\":\"nil\",\"controlSize\":\"0\",\"isEditable\":\"true\",\"isEnabled\":\"true\",\"isHidden\":\"false\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"nil\",\"doubleValue\":\"0\",\"objectValue\":\"nil\",\"stringValue\":\"\",\"tag\":\"0\"},\"subviews\":[]}]},{\"class\":\"CPScroller\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":-100,\\\"y\\\":269},\\\"size\\\":{\\\"height\\\":7,\\\"width\\\":360}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"0\",\"autoresizingMask\":\"8\",\"backgroundColor\":\"nil\",\"controlSize\":\"0\",\"isEnabled\":\"false\",\"isHidden\":\"true\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"1\",\"doubleValue\":\"0\",\"objectValue\":\"0\",\"stringValue\":\"0\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":7,\\\"width\\\":360}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPScroller\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":491,\\\"y\\\":110},\\\"size\\\":{\\\"height\\\":73,\\\"width\\\":7}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"0\",\"autoresizingMask\":\"8\",\"backgroundColor\":\"nil\",\"controlSize\":\"0\",\"isEnabled\":\"false\",\"isHidden\":\"true\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"1\",\"doubleValue\":\"0\",\"objectValue\":\"0\",\"stringValue\":\"0\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":73,\\\"width\\\":7}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"CPColor:rgba(255, 255, 255, 1)\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPClipView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPButton\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":481,\\\"y\\\":245},\\\"size\\\":{\\\"height\\\":25,\\\"width\\\":51}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"2\",\"autoresizingMask\":\"9\",\"backgroundColor\":\"nil\",\"bezelStyle\":\"11\",\"controlSize\":\"0\",\"isBordered\":\"true\",\"isEnabled\":\"true\",\"isHidden\":\"false\",\"lineBreakMode\":\"0\",\"verticalAlignment\":\"2\",\"doubleValue\":\"0\",\"objectValue\":\"0\",\"state\":\"0\",\"stringValue\":\"0\",\"tag\":\"1\",\"title\":\"OK\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":25,\\\"width\\\":51}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPButton\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":395,\\\"y\\\":245},\\\"size\\\":{\\\"height\\\":25,\\\"width\\\":76}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"2\",\"autoresizingMask\":\"9\",\"backgroundColor\":\"nil\",\"bezelStyle\":\"11\",\"controlSize\":\"0\",\"isBordered\":\"true\",\"isEnabled\":\"true\",\"isHidden\":\"false\",\"lineBreakMode\":\"0\",\"verticalAlignment\":\"2\",\"doubleValue\":\"0\",\"objectValue\":\"0\",\"state\":\"0\",\"stringValue\":\"0\",\"tag\":\"0\",\"title\":\"Cancel\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":25,\\\"width\\\":76}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]}]}}" + ], + "TextEditorDocumentWindow.cib": [ + "{\"class\":\"CPApplication\"}", + "{\"class\":\"CPWindow\",\"title\":\"Window\",\"contentView\":{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":1,\\\"y\\\":92},\\\"size\\\":{\\\"height\\\":168,\\\"width\\\":474}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"18\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPScrollView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":202,\\\"width\\\":476}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"18\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPClipView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":202,\\\"width\\\":469}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"8\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPTextView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":270,\\\"width\\\":469}}\",\"state\":{\"acceptsFirstResponder\":\"true\",\"autoresizingMask\":\"18\",\"backgroundColor\":\"CPColor:rgba(255, 255, 255, 1)\",\"isEditable\":\"true\",\"isHidden\":\"false\",\"isSelectable\":\"true\",\"objectValue\":\"CPTextStorage\",\"string\":\"\",\"stringValue\":\"\",\"tag\":\"0\"},\"subviews\":[]}]},{\"class\":\"CPScroller\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":-100,\\\"y\\\":355},\\\"size\\\":{\\\"height\\\":7,\\\"width\\\":240}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"0\",\"autoresizingMask\":\"8\",\"backgroundColor\":\"nil\",\"controlSize\":\"0\",\"isEnabled\":\"false\",\"isHidden\":\"true\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"1\",\"doubleValue\":\"0\",\"objectValue\":\"0\",\"stringValue\":\"0\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":7,\\\"width\\\":240}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPScroller\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":469,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":202,\\\"width\\\":7}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"alignment\":\"0\",\"autoresizingMask\":\"8\",\"backgroundColor\":\"nil\",\"controlSize\":\"0\",\"isEnabled\":\"true\",\"isHidden\":\"false\",\"lineBreakMode\":\"2\",\"verticalAlignment\":\"1\",\"doubleValue\":\"0\",\"objectValue\":\"0\",\"stringValue\":\"0\",\"tag\":\"0\"},\"subviews\":[{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":202,\\\"width\\\":7}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":202},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":151.1259259259259,\\\"width\\\":7}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]},{\"class\":\"CPView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"CPColor:rgba(255, 255, 255, 1)\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]},{\"class\":\"CPClipView\",\"frame\":\"{\\\"origin\\\":{\\\"x\\\":0,\\\"y\\\":0},\\\"size\\\":{\\\"height\\\":0,\\\"width\\\":0}}\",\"state\":{\"acceptsFirstResponder\":\"false\",\"autoresizingMask\":\"0\",\"backgroundColor\":\"nil\",\"isHidden\":\"false\",\"tag\":\"-1\"},\"subviews\":[]}]}]}}" + ] +} diff --git a/Tests/AppKit/Resources/DropInCibs/SmartFoldersPredicateEditor.cib b/Tests/AppKit/Resources/DropInCibs/SmartFoldersPredicateEditor.cib new file mode 100644 index 000000000..89ff3b8fc --- /dev/null +++ b/Tests/AppKit/Resources/DropInCibs/SmartFoldersPredicateEditor.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;65E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;66E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;67E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;22E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;69E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;24E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;73E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;30;_CPCibWindowTemplateMinSizeKeyD;K;6;CP$UIDd;2;74E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;75E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;76E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;77E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;78E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;79E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;80E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;81E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;83E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;83E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;89E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;91E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;94E;K;6;$afontD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;97E;K;11;$aalignmentD;K;6;CP$UIDd;2;98E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;99E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;100E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;100E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;100E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;100E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;105E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;106E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;102E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;88E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;88E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;100E;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;107E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;108E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;114E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;100E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;115E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;88E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;88E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;88E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;116E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;106E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;102E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;88E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;88E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;100E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;117E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;118E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;119E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;120E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;121E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;122E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;33E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;62E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;61E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;123E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;123E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;123E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;123E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;100E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;88E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;100E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;124E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;106E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;82E;K;21;CPScrollViewHasVRulerD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewHasHRulerD;K;6;CP$UIDd;1;0E;K;25;CPScrollViewRulersVisibleD;K;6;CP$UIDd;1;0E;K;18;CPScrollViewVRulerD;K;6;CP$UIDd;1;0E;K;18;CPScrollViewHRulerD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;130E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;17;CPPredicateEditorK;8;$classesA;S;17;CPPredicateEditorS;12;CPRuleEditorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;131E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;120E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;133E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;20;CPRuleEditorEditableD;K;6;CP$UIDd;3;100E;K;35;CPRuleEditorAllowsEmptyCompoundRowsD;K;6;CP$UIDd;2;88E;K;25;CPRuleEditorDisallowEmptyD;K;6;CP$UIDd;3;100E;K;30;CPRuleEditorAlignmentGridWidthD;K;6;CP$UIDd;3;134E;K;23;CPRuleEditorSliceHeightD;K;6;CP$UIDd;3;135E;K;23;CPRuleEditorNestingModeD;K;6;CP$UIDd;3;136E;K;27;CPRuleEditorStringsFilenameD;K;6;CP$UIDd;1;0E;K;26;CPRuleEditorRowTypeKeyPathD;K;6;CP$UIDd;3;137E;K;24;CPRuleEditorItemsKeyPathD;K;6;CP$UIDd;3;138E;K;25;CPRuleEditorValuesKeyPathD;K;6;CP$UIDd;3;139E;K;29;CPRuleEditorBoundArrayKeyPathD;K;6;CP$UIDd;3;140E;K;31;CPRuleEditorSubrowsArrayKeyPathD;K;6;CP$UIDd;3;141E;K;24;CPRuleEditorSlicesHolderD;K;6;CP$UIDd;1;0E;K;18;CPRuleEditorSlicesD;K;6;CP$UIDd;3;142E;K;27;CPRuleEditorBoundArrayOwnerD;K;6;CP$UIDd;3;144E;K;20;CPPredicateTemplatesD;K;6;CP$UIDd;3;145E;E;D;K;10;$classnameS;28;CPPredicateEditorRowTemplateK;8;$classesA;S;28;CPPredicateEditorRowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;3;106E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;2;82E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;2;82E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;2;82E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;2;82E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;2;88E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;2;88E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;3;146E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;101E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;147E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;148E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;150E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;39E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;155E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;39E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;101E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;157E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;150E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;43E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;3;150E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;3;136E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;2;82E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;2;82E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;3;158E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;2;88E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;3;100E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;101E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;161E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;150E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;46E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;164E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;46E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;101E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;150E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;49E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;168E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;49E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;170E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;49E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;3;150E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;2;82E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;2;82E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;2;82E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;3;172E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;2;88E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;3;100E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;101E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;150E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;54E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;101E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;178E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;150E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;180E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;149E;K;25;CPMenuItemOnStateImageKeyD;K;6;CP$UIDd;3;152E;K;28;CPMenuItemMixedStateImageKeyD;K;6;CP$UIDd;3;153E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;154E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;181E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;182E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;183E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;185E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;186E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;31E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;187E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;88E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;150E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;188E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;189E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;183E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;185E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;190E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;31E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;100E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;150E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;150E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;192E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;193E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;194E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;195E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;82E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;197E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;82E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;198E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;199E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;101E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;203E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;194E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;195E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;82E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;197E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;82E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;204E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;205E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;101E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;201E;E;S;13;AppControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;S;8;delegateS;15;folderNameFieldS;15;predicateEditorS;14;predicateSheetS;11;closeSheet:S;13;CPApplicationS;10;{200, 182}S;10;{700, 532}S;8;CPWindowd;9;544735232S;24;{{571, 305}, {553, 292}}S;22;{{0, 0}, {1680, 1028}}d;2;79S;16;Predicate Editord;1;0S;20;{{0, 0}, {553, 292}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{63, 12}, {474, 22}}S;19;{{0, 0}, {474, 22}}d;2;34S;9;textfieldS;47;bezeled+controlSizeRegular+editable+placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;206E;K;12;defaultValueD;K;6;CP$UIDd;3;208E;K;6;valuesD;K;6;CP$UIDd;3;210E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;211E;K;12;defaultValueD;K;6;CP$UIDd;3;106E;K;6;valuesD;K;6;CP$UIDd;3;212E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;213E;K;12;defaultValueD;K;6;CP$UIDd;2;82E;K;6;valuesD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;E;E;T;S;0;d;1;4d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;104E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;219E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;d;1;2S;20;{{19, 18}, {41, 17}}S;18;{{0, 0}, {41, 17}}d;2;36S;18;controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;206E;K;12;defaultValueD;K;6;CP$UIDd;3;208E;K;6;valuesD;K;6;CP$UIDd;3;220E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;211E;K;12;defaultValueD;K;6;CP$UIDd;3;106E;K;6;valuesD;K;6;CP$UIDd;3;221E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;213E;K;12;defaultValueD;K;6;CP$UIDd;2;82E;K;6;valuesD;K;6;CP$UIDd;3;222E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;223E;E;E;S;5;Name:D;K;6;$classD;K;6;CP$UIDd;3;104E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;224E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;219E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;S;22;{{20, 55}, {512, 184}}S;20;{{0, 0}, {512, 184}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;124E;E;E;d;2;18S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;10D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;225E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;225E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;226E;E;S;20;{{1, 1}, {510, 182}}S;20;{{0, 0}, {510, 182}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;35E;E;E;d;1;8D;K;6;$classD;K;6;CP$UIDd;3;104E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;227E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;219E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;229E;E;E;S;11;rule-editorD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;75d;2;32d;1;3S;7;rowTypeS;8;criteriaS;13;displayValuesS;10;boundArrayS;7;subrowsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;33;_CPRuleEditorViewUnboundRowHolderK;8;$classesA;S;33;_CPRuleEditorViewUnboundRowHolderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;143E;K;12;CPBoundArrayD;K;6;CP$UIDd;3;230E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;232E;D;K;6;CP$UIDd;3;233E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;E;E;S;3;AnyS;17;_popUpItemAction:d;1;1D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;151E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;234E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;235E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;3;151E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;234E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;237E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;238E;E;d;7;1048576S;3;AllD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;44E;E;E;S;25;of the following are trued;3;700D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;239E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;241E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;E;E;S;9;firstNameD;K;10;$classnameS;20;_CPKeyPathExpressionK;8;$classesA;S;20;_CPKeyPathExpressionS;21;_CPFunctionExpressionS;12;CPExpressionS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;162E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;242E;K;11;CPArgumentsD;K;6;CP$UIDd;3;243E;K;9;CPOperandD;K;6;CP$UIDd;3;245E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;136E;E;S;8;lastNameD;K;6;$classD;K;6;CP$UIDd;3;162E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;242E;K;11;CPArgumentsD;K;6;CP$UIDd;3;246E;K;9;CPOperandD;K;6;CP$UIDd;3;245E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;E;E;S;11;begins withS;9;ends withd;1;9S;8;containsd;2;99d;3;300D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;247E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;E;E;S;3;ageD;K;6;$classD;K;6;CP$UIDd;3;162E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;242E;K;11;CPArgumentsD;K;6;CP$UIDd;3;250E;K;9;CPOperandD;K;6;CP$UIDd;3;245E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;E;E;S;2;isS;12;is less thanS;15;is greater thanS;24;{{-100, 269}, {360, 15}}S;19;{{0, 0}, {360, 15}}d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:S;22;{{491, 110}, {15, 73}}S;18;{{0, 0}, {15, 73}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:S;22;{{481, 245}, {51, 25}}S;18;{{0, 0}, {51, 25}}S;6;buttonS;34;bordered+controlSizeRegular+squareD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;103E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;100E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;2;OKd;2;14d;2;11S;22;{{395, 245}, {76, 25}}S;18;{{0, 0}, {76, 25}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;CancelS;4;fontD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;207E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;60;firstResponder+keyWindow+selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;252E;K;35;selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;252E;K;15;controlSizeMiniD;K;6;CP$UIDd;3;252E;K;16;controlSizeSmallD;K;6;CP$UIDd;3;252E;K;18;controlSizeRegularD;K;6;CP$UIDd;3;252E;K;15;editing+roundedD;K;6;CP$UIDd;3;252E;K;7;roundedD;K;6;CP$UIDd;3;252E;K;8;borderedD;K;6;CP$UIDd;3;252E;K;7;bezeledD;K;6;CP$UIDd;3;252E;K;7;editingD;K;6;CP$UIDd;3;252E;K;13;tableDataViewD;K;6;CP$UIDd;3;252E;K;6;normalD;K;6;CP$UIDd;3;252E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;106E;K;6;normalD;K;6;CP$UIDd;3;106E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;102E;K;6;normalD;K;6;CP$UIDd;3;102E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;254E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;255E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;28E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;28E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;256E;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;257E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;258E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;28E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;28E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;259E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;60;firstResponder+keyWindow+selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;252E;K;35;selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;252E;K;15;controlSizeMiniD;K;6;CP$UIDd;3;252E;K;16;controlSizeSmallD;K;6;CP$UIDd;3;252E;K;18;controlSizeRegularD;K;6;CP$UIDd;3;252E;K;15;editing+roundedD;K;6;CP$UIDd;3;252E;K;7;roundedD;K;6;CP$UIDd;3;252E;K;8;borderedD;K;6;CP$UIDd;3;252E;K;7;bezeledD;K;6;CP$UIDd;3;252E;K;7;editingD;K;6;CP$UIDd;3;252E;K;13;tableDataViewD;K;6;CP$UIDd;3;252E;K;6;normalD;K;6;CP$UIDd;3;252E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;106E;K;6;normalD;K;6;CP$UIDd;3;106E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;102E;K;6;normalD;K;6;CP$UIDd;3;102E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;260E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;258E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;29E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;29E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;150E;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;3;150E;E;E;D;K;10;$classnameS;28;_CPRuleEditorViewSliceHolderK;8;$classesA;S;28;_CPRuleEditorViewSliceHolderS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;228E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;120E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;264E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;231E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;39E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;265E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;266E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;268E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;106E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;269E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;270E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;3;231E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;43E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;272E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;273E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;268E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;106E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;274E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;271E;E;S;7;CPImageS;15;CPMenuCheckmarkD;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;9;frameworkD;K;6;CP$UIDd;3;101E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;101E;K;4;sizeD;K;6;CP$UIDd;3;276E;E;E;S;16;CPMenuMixedStateD;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;9;frameworkD;K;6;CP$UIDd;3;101E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;101E;K;4;sizeD;K;6;CP$UIDd;3;277E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;231E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;278E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;279E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;268E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;106E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;281E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;3;231E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;49E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;282E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;283E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;268E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;106E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;284E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;285E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;286E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;287E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;288E;K;6;$afontD;K;6;CP$UIDd;3;289E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;290E;K;11;$aalignmentD;K;6;CP$UIDd;3;291E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;292E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;100E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;150E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;100E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;100E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;100E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;105E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;106E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;82E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;100E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;88E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;100E;E;S;12;valueForKey:D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;294E;E;E;D;K;10;$classnameS;17;_CPSelfExpressionK;8;$classesA;S;17;_CPSelfExpressionS;12;CPExpressionS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;295E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;231E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;54E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;296E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;266E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;268E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;106E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;297E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;298E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;3;231E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;56E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;299E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;283E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;268E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;106E;K;16;$aimage-positionD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;3;300E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;301E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;82E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;88E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;200E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;82E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;100E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;100E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;302E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;303E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;288E;K;6;$afontD;K;6;CP$UIDd;3;304E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;11;$aalignmentD;K;6;CP$UIDd;3;306E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;87E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;88E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;307E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;100E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;102E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;150E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;103E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;100E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;100E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;100E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;105E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;106E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;82E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;100E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;88E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;100E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;308E;E;E;S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;103E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;309E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;310E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;311E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;313E;E;f;18;0.6862745098039216f;12;0.9100000262D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;18;{{9, 3}, {63, 25}}S;18;{{0, 0}, {63, 25}}S;12;popup-buttonS;37;bordered+controlSizeRegular+roundRectD;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;12S;20;{{83, 3}, {168, 25}}S;19;{{0, 0}, {168, 25}}D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;314E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;314E;E;S;19;{{39, 3}, {95, 25}}S;18;{{0, 0}, {95, 25}}D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{145, 3}, {104, 25}}S;19;{{0, 0}, {104, 25}}D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{255, 3}, {167, 25}}S;19;{{0, 0}, {167, 25}}S;45;bezeled+controlSizeSmall+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;206E;K;12;defaultValueD;K;6;CP$UIDd;3;208E;K;6;valuesD;K;6;CP$UIDd;3;315E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;211E;K;12;defaultValueD;K;6;CP$UIDd;3;106E;K;6;valuesD;K;6;CP$UIDd;3;316E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;213E;K;12;defaultValueD;K;6;CP$UIDd;2;82E;K;6;valuesD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;318E;D;K;6;CP$UIDd;3;319E;E;E;D;K;10;$classnameS;26;_CPConstantValueExpressionK;8;$classesA;S;26;_CPConstantValueExpressionS;12;CPExpressionS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPConstantValueD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPConstantValueD;K;6;CP$UIDd;3;164E;E;S;19;{{39, 3}, {63, 25}}D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{113, 3}, {104, 25}}D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{223, 3}, {32, 25}}S;18;{{0, 0}, {32, 25}}D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;206E;K;12;defaultValueD;K;6;CP$UIDd;3;208E;K;6;valuesD;K;6;CP$UIDd;3;320E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;211E;K;12;defaultValueD;K;6;CP$UIDd;3;106E;K;6;valuesD;K;6;CP$UIDd;3;321E;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;4;nameD;K;6;CP$UIDd;3;213E;K;12;defaultValueD;K;6;CP$UIDd;2;82E;K;6;valuesD;K;6;CP$UIDd;3;322E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;323E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPConstantValueD;K;6;CP$UIDd;3;175E;E;S;57;{"origin":{"x":0,"y":1},"size":{"width":466,"height":21}}S;60;{"origin":{"x":67,"y":256},"size":{"width":466,"height":21}}S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;60;{"origin":{"x":67,"y":255},"size":{"width":466,"height":22}}S;59;{"origin":{"x":17,"y":257},"size":{"width":45,"height":17}}S;22;{"width":0,"height":0}D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;60;firstResponder+keyWindow+selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;325E;K;35;selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;325E;K;15;controlSizeMiniD;K;6;CP$UIDd;3;325E;K;16;controlSizeSmallD;K;6;CP$UIDd;3;325E;K;18;controlSizeRegularD;K;6;CP$UIDd;3;325E;K;15;editing+roundedD;K;6;CP$UIDd;3;325E;K;7;roundedD;K;6;CP$UIDd;3;325E;K;8;borderedD;K;6;CP$UIDd;3;325E;K;7;bezeledD;K;6;CP$UIDd;3;325E;K;7;editingD;K;6;CP$UIDd;3;325E;K;13;tableDataViewD;K;6;CP$UIDd;3;325E;K;6;normalD;K;6;CP$UIDd;3;325E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;106E;K;6;normalD;K;6;CP$UIDd;3;106E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;82E;K;6;normalD;K;6;CP$UIDd;2;82E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;326E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;255E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;241E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;241E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;327E;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;328E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;258E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;241E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;241E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;60;firstResponder+keyWindow+selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;330E;K;35;selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;330E;K;15;controlSizeMiniD;K;6;CP$UIDd;3;330E;K;16;controlSizeSmallD;K;6;CP$UIDd;3;330E;K;18;controlSizeRegularD;K;6;CP$UIDd;3;330E;K;15;editing+roundedD;K;6;CP$UIDd;3;330E;K;7;roundedD;K;6;CP$UIDd;3;330E;K;8;borderedD;K;6;CP$UIDd;3;330E;K;7;bezeledD;K;6;CP$UIDd;3;330E;K;7;editingD;K;6;CP$UIDd;3;330E;K;13;tableDataViewD;K;6;CP$UIDd;3;330E;K;6;normalD;K;6;CP$UIDd;3;330E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;106E;K;6;normalD;K;6;CP$UIDd;3;106E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;82E;K;6;normalD;K;6;CP$UIDd;2;82E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;331E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;255E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;249E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;249E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;332E;E;D;K;6;$classD;K;6;CP$UIDd;3;215E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;333E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;258E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;249E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;249E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;336E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;337E;E;D;K;6;$classD;K;6;CP$UIDd;3;196E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;251E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;88E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;338E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;339E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;340E;E;S;57;{"origin":{"x":0,"y":1},"size":{"width":160,"height":17}}S;59;{"origin":{"x":258,"y":8},"size":{"width":160,"height":17}}S;59;{"origin":{"x":258,"y":7},"size":{"width":160,"height":18}}S;56;{"origin":{"x":0,"y":1},"size":{"width":25,"height":17}}S;58;{"origin":{"x":226,"y":8},"size":{"width":25,"height":17}}S;58;{"origin":{"x":226,"y":7},"size":{"width":25,"height":18}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/AppKit/Resources/DropInCibs/TextEditorDocumentWindow.cib b/Tests/AppKit/Resources/DropInCibs/TextEditorDocumentWindow.cib new file mode 100644 index 000000000..a2eff4e03 --- /dev/null +++ b/Tests/AppKit/Resources/DropInCibs/TextEditorDocumentWindow.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;32E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;41E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;27E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;19E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;45E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;2;32E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;46E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;47E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;48E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;49E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;50E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;51E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;21E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;54E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;61E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;21E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;65E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;25E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;30E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;29E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;66E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;66E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;66E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;66E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;67E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;59E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;59E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;2;68E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;2;52E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;52E;K;21;CPScrollViewHasVRulerD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewHasHRulerD;K;6;CP$UIDd;1;0E;K;25;CPScrollViewRulersVisibleD;K;6;CP$UIDd;1;0E;K;18;CPScrollViewVRulerD;K;6;CP$UIDd;1;0E;K;18;CPScrollViewHRulerD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;69E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;71E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;27E;E;D;K;10;$classnameS;10;CPTextViewK;8;$classesA;S;10;CPTextViewS;6;CPTextS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;55E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextViewIsEditableKeyD;K;6;CP$UIDd;2;67E;K;25;CPTextViewIsSelectableKeyD;K;6;CP$UIDd;2;67E;K;23;CPTextViewIsRichTextKeyD;K;6;CP$UIDd;2;67E;K;21;CPTextViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;22;CPTextViewContainerKeyD;K;6;CP$UIDd;2;76E;K;32;CPTextViewInsertionPointColorKeyD;K;6;CP$UIDd;2;77E;K;35;CPTextViewSelectedTextAttributesKeyD;K;6;CP$UIDd;2;79E;K;23;CPTextViewAllowsUndoKeyD;K;6;CP$UIDd;2;67E;K;26;CPTextViewUsesFontPanelKeyD;K;6;CP$UIDd;2;67E;K;34;CPTextViewHorizontallyResizableKeyD;K;6;CP$UIDd;2;59E;K;32;CPTextViewVerticallyResizableKeyD;K;6;CP$UIDd;2;67E;K;9;CPMaxSizeD;K;6;CP$UIDd;2;80E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;81E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;82E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;85E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;86E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;52E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;23E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;87E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;88E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;59E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;89E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;91E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;85E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;92E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;52E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;23E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;93E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;88E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;67E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;89E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;9;CPToolbarK;8;$classesA;S;9;CPToolbarS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;22;CPToolbarIdentifierKeyD;K;6;CP$UIDd;2;94E;K;23;CPToolbarDisplayModeKeyD;K;6;CP$UIDd;2;89E;K;34;CPToolbarShowsBaselineSeparatorKeyD;K;6;CP$UIDd;2;59E;K;35;CPToolbarAllowsUserCustomizationKeyD;K;6;CP$UIDd;2;67E;K;21;CPToolbarIsVisibleKeyD;K;6;CP$UIDd;2;67E;K;20;CPToolbarSizeModeKeyD;K;6;CP$UIDd;2;89E;K;27;CPToolbarIdentifiedItemsKeyD;K;6;CP$UIDd;2;96E;K;24;CPToolbarDefaultItemsKeyD;K;6;CP$UIDd;2;97E;K;24;CPToolbarAllowedItemsKeyD;K;6;CP$UIDd;2;98E;K;27;CPToolbarSelectableItemsKeyD;K;6;CP$UIDd;2;99E;K;20;CPToolbarDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPToolbarItemK;8;$classesA;S;13;CPToolbarItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;30;CPToolbarItemItemIdentifierKeyD;K;6;CP$UIDd;3;100E;K;21;CPToolbarItemLabelKeyD;K;6;CP$UIDd;3;101E;K;28;CPToolbarItemPaletteLabelKeyD;K;6;CP$UIDd;3;101E;K;23;CPToolbarItemToolTipKeyD;K;6;CP$UIDd;3;102E;K;19;CPToolbarItemTagKeyD;K;6;CP$UIDd;3;103E;K;22;CPToolbarItemTargetKeyD;K;6;CP$UIDd;1;0E;K;22;CPToolbarItemActionKeyD;K;6;CP$UIDd;3;104E;K;23;CPToolbarItemEnabledKeyD;K;6;CP$UIDd;2;67E;K;21;CPToolbarItemImageKeyD;K;6;CP$UIDd;3;106E;K;30;CPToolbarItemAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPToolbarItemViewKeyD;K;6;CP$UIDd;1;0E;K;23;CPToolbarItemMinSizeKeyD;K;6;CP$UIDd;3;107E;K;23;CPToolbarItemMaxSizeKeyD;K;6;CP$UIDd;3;107E;K;34;CPToolbarItemVisibilityPriorityKeyD;K;6;CP$UIDd;2;52E;K;29;CPToolbarItemAutovalidatesKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;30;CPToolbarItemItemIdentifierKeyD;K;6;CP$UIDd;3;108E;K;21;CPToolbarItemLabelKeyD;K;6;CP$UIDd;3;109E;K;28;CPToolbarItemPaletteLabelKeyD;K;6;CP$UIDd;3;109E;K;23;CPToolbarItemToolTipKeyD;K;6;CP$UIDd;3;110E;K;19;CPToolbarItemTagKeyD;K;6;CP$UIDd;3;103E;K;22;CPToolbarItemTargetKeyD;K;6;CP$UIDd;1;0E;K;22;CPToolbarItemActionKeyD;K;6;CP$UIDd;3;111E;K;23;CPToolbarItemEnabledKeyD;K;6;CP$UIDd;2;67E;K;21;CPToolbarItemImageKeyD;K;6;CP$UIDd;3;113E;K;30;CPToolbarItemAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPToolbarItemViewKeyD;K;6;CP$UIDd;1;0E;K;23;CPToolbarItemMinSizeKeyD;K;6;CP$UIDd;3;114E;K;23;CPToolbarItemMaxSizeKeyD;K;6;CP$UIDd;3;114E;K;34;CPToolbarItemVisibilityPriorityKeyD;K;6;CP$UIDd;2;52E;K;29;CPToolbarItemAutovalidatesKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;30;CPToolbarItemItemIdentifierKeyD;K;6;CP$UIDd;3;115E;K;21;CPToolbarItemLabelKeyD;K;6;CP$UIDd;3;116E;K;28;CPToolbarItemPaletteLabelKeyD;K;6;CP$UIDd;3;116E;K;23;CPToolbarItemToolTipKeyD;K;6;CP$UIDd;3;116E;K;19;CPToolbarItemTagKeyD;K;6;CP$UIDd;3;103E;K;22;CPToolbarItemTargetKeyD;K;6;CP$UIDd;1;0E;K;22;CPToolbarItemActionKeyD;K;6;CP$UIDd;3;117E;K;23;CPToolbarItemEnabledKeyD;K;6;CP$UIDd;2;67E;K;21;CPToolbarItemImageKeyD;K;6;CP$UIDd;3;118E;K;30;CPToolbarItemAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPToolbarItemViewKeyD;K;6;CP$UIDd;1;0E;K;23;CPToolbarItemMinSizeKeyD;K;6;CP$UIDd;3;119E;K;23;CPToolbarItemMaxSizeKeyD;K;6;CP$UIDd;3;119E;K;34;CPToolbarItemVisibilityPriorityKeyD;K;6;CP$UIDd;2;52E;K;29;CPToolbarItemAutovalidatesKeyD;K;6;CP$UIDd;2;67E;E;D;K;10;$classnameS;19;_CPToolbarSpaceItemK;8;$classesA;S;19;_CPToolbarSpaceItemS;13;CPToolbarItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;E;D;K;10;$classnameS;27;_CPToolbarFlexibleSpaceItemK;8;$classesA;S;27;_CPToolbarFlexibleSpaceItemS;13;CPToolbarItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;E;S;24;DocumentWindowControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;E;E;S;8;textViewS;6;windowS;13;CPApplicationS;8;CPWindowd;10;1618477056S;24;{{196, 540}, {480, 270}}S;22;{{0, 0}, {1920, 1050}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {480, 270}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;d;2;18S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;68E;E;E;S;10;scrollviewD;K;10;$classnameS;12;CPAppearanceK;8;$classesA;S;12;CPAppearanceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;5;_nameD;K;6;CP$UIDd;3;120E;K;15;_allowsVibrancyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;121E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;58E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;E;E;d;1;8D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;15;CPTextContainerK;8;$classesA;S;15;CPTextContainerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;22;CPTextContainerSizeKeyD;K;6;CP$UIDd;2;80E;K;31;CPTextContainerLayoutManagerKeyD;K;6;CP$UIDd;3;126E;K;37;CPTextContainerWidthTracksTextViewKeyD;K;6;CP$UIDd;2;67E;K;38;CPTextContainerHeightTracksTextViewKeyD;K;6;CP$UIDd;2;59E;K;37;CPTextContainerLineFragmentPaddingKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;7;NSColorD;K;6;CP$UIDd;3;128E;K;17;NSBackgroundColorD;K;6;CP$UIDd;3;129E;E;E;S;15;{480, 10000000}S;24;{{-100, 355}, {240, 15}}S;19;{{0, 0}, {240, 15}}d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:d;1;4d;1;1S;21;{{463, 0}, {15, 270}}S;19;{{0, 0}, {15, 270}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:S;36;CF0D66E0-8702-4344-A8C0-DD87E0AF7A51D;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;95E;K;10;CP.objectsD;K;23;CPToolbarShowColorsItemD;K;6;CP$UIDd;2;34E;K;22;CPToolbarShowFontsItemD;K;6;CP$UIDd;2;35E;K;18;CPToolbarSpaceItemD;K;6;CP$UIDd;2;38E;K;18;CPToolbarPrintItemD;K;6;CP$UIDd;2;36E;K;26;CPToolbarFlexibleSpaceItemD;K;6;CP$UIDd;2;40E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;36E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;CPToolbarShowColorsItemS;6;ColorsS;16;Show Color Paneld;2;-1S;21;orderFrontColorPanel:D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;130E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;131E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;132E;E;S;8;{45, 32}S;22;CPToolbarShowFontsItemS;5;FontsS;15;Show Font PanelS;20;orderFrontFontPanel:D;K;10;$classnameS;7;CPImageK;8;$classesA;S;7;CPImageS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;112E;K;10;CPFilenameD;K;6;CP$UIDd;3;133E;K;6;CPSizeD;K;6;CP$UIDd;3;134E;E;S;8;{37, 24}S;18;CPToolbarPrintItemS;5;PrintS;14;printDocument:D;K;6;$classD;K;6;CP$UIDd;3;112E;K;10;CPFilenameD;K;6;CP$UIDd;3;133E;K;6;CPSizeD;K;6;CP$UIDd;3;135E;E;S;8;{36, 24}S;20;CPAppearanceNameAquaS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;89E;E;E;S;5;colorD;K;10;$classnameS;15;CPLayoutManagerK;8;$classesA;S;15;CPLayoutManagerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;125E;K;29;CPLayoutManagerTextStorageKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;2;89E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;57E;E;S;7;CPImageS;21;CPImageNameColorPanelD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;9;frameworkD;K;6;CP$UIDd;3;133E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;133E;K;4;sizeD;K;6;CP$UIDd;3;142E;E;E;S;0;S;8;{19, 12}S;8;{19, 16}D;K;10;$classnameS;13;CPTextStorageK;8;$classesA;S;13;CPTextStorageS;25;CPMutableAttributedStringS;18;CPAttributedStringS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;24;CPAttributedStringStringD;K;6;CP$UIDd;3;133E;K;24;CPAttributedStringRangesD;K;6;CP$UIDd;3;143E;K;28;CPAttributedStringAttributesD;K;6;CP$UIDd;3;144E;E;f;12;0.9981992245D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;89E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;2;89E;E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;147E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;148E;E;E;f;11;0.602715373S;22;{"width":0,"height":0}D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;25;{"location":0,"length":0}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Foundation/CPMapTableTest.j b/Tests/Foundation/CPMapTableTest.j index d5c7864d8..d8a5fbfc9 100644 --- a/Tests/Foundation/CPMapTableTest.j +++ b/Tests/Foundation/CPMapTableTest.j @@ -1,6 +1,8 @@ @import @import @import +@import +@import @import @import @@ -139,6 +141,18 @@ [self assertTrue:[foundValues containsObject:@"value3"]]; } +- (void)testArchivingPreservesEntries +{ + [map_table setObject:@"first" forKey:@"one"]; + [map_table setObject:@"second" forKey:@"two"]; + + var decoded = [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:map_table]]; + + [self assert:2 equals:[decoded count]]; + [self assert:@"first" equals:[decoded objectForKey:@"one"]]; + [self assert:@"second" equals:[decoded objectForKey:@"two"]]; +} + - (void)testDictionaryRepresentation { [map_table setObject:@"value1" forKey:@"key1"]; From fca3a9159a88087bd98ef8fe4dbca184f2b3587c Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 21:12:08 -0600 Subject: [PATCH 06/15] AppKit: Fix outline drop retargeting and add interaction regression tests Protects the selection, editing and drag and drop contracts of tables and outlines by verifying the events, delegate calls and data source calls that applications depend on. A drop retargeted between the children of an item is delivered to that item. * CPOutlineView: Set the retargeted drop operation in setDropItem:dropChildIndex:. * CPTableViewInteractionTest: Verify selection by mouse and keyboard, editing, drag initiation and drop handling, including refusal and retargeting by the delegate and data source. * CPOutlineViewInteractionTest: Verify dragged items, proposed parents and child indexes, drop retargeting, and expansion and its cancellation during a hover. --- AppKit/CPOutlineView.j | 4 +- Tests/AppKit/CPOutlineViewInteractionTest.j | 348 +++++++++ Tests/AppKit/CPTableViewInteractionTest.j | 785 ++++++++++++++++++++ 3 files changed, 1136 insertions(+), 1 deletion(-) create mode 100644 Tests/AppKit/CPOutlineViewInteractionTest.j create mode 100644 Tests/AppKit/CPTableViewInteractionTest.j diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 79f1cad5d..2c4c520f8 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -1581,7 +1581,9 @@ function SHOULD_SELECT_ITEM(anOutlineView, anItem) _retargedChildIndex = theIndex; _shouldRetargetChildIndex = YES; - // set CPTableView's _retargetedDropRow based on retargetedItem and retargetedChildIndex + // set CPTableView's _retargetedDropOperation and _retargetedDropRow based on retargetedItem and retargetedChildIndex + _retargetedDropOperation = (_retargedChildIndex === CPOutlineViewDropOnItemIndex) ? CPTableViewDropOn : CPTableViewDropAbove; + var retargetedItemInfo = (_retargetedItem != nil) ? _itemInfosForItems[[_retargetedItem UID]] : _rootItemInfo; if (_retargedChildIndex === [retargetedItemInfo.children count]) diff --git a/Tests/AppKit/CPOutlineViewInteractionTest.j b/Tests/AppKit/CPOutlineViewInteractionTest.j new file mode 100644 index 000000000..5493aab23 --- /dev/null +++ b/Tests/AppKit/CPOutlineViewInteractionTest.j @@ -0,0 +1,348 @@ +/* + * CPOutlineViewInteractionTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + An outline view adds a parent to every row, so it reports a drag by item and a drop + by parent item and child index. Selection and editing come from CPTableView, and + CPTableViewInteractionTest.j covers them. These tests cover what an outline view + changes. +*/ + +var OutlineInteractionDragType = @"OutlineInteractionDragType"; + +@implementation _CPOutlineInteractionView : CPOutlineView +{ + CPArray dragCalls @accessors; +} + +- (void)dragView:(CPView)aView at:(CGPoint)aLocation offset:(CGSize)mouseOffset event:(CPEvent)anEvent pasteboard:(CPPasteboard)aPasteboard source:(id)aSourceObject slideBack:(BOOL)slideBack +{ + if (!dragCalls) + dragCalls = []; + + dragCalls.push(aPasteboard); +} + +@end + +@implementation _CPOutlineInteractionDataSource : CPObject +{ + id tree @accessors; + CPArray writtenItems @accessors; + CPArray validations @accessors; + CPArray acceptedDrops @accessors; + id retargetItem @accessors; + id retargetIndex @accessors; + BOOL shouldRetarget @accessors; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + tree = { + @"root": [@"A", @"B", @"C"], + @"A": [@"A1", @"A2"], + @"B": [], + @"C": [@"C1"] + }; + validations = []; + acceptedDrops = []; + } + + return self; +} + +- (CPArray)childrenOfItem:(id)anItem +{ + return tree[anItem || @"root"] || []; +} + +- (id)outlineView:(CPOutlineView)anOutlineView child:(int)anIndex ofItem:(id)anItem +{ + return [self childrenOfItem:anItem][anIndex]; +} + +- (BOOL)outlineView:(CPOutlineView)anOutlineView isItemExpandable:(id)anItem +{ + return [self childrenOfItem:anItem].length > 0; +} + +- (int)outlineView:(CPOutlineView)anOutlineView numberOfChildrenOfItem:(id)anItem +{ + return [self childrenOfItem:anItem].length; +} + +- (id)outlineView:(CPOutlineView)anOutlineView objectValueForTableColumn:(CPTableColumn)aColumn byItem:(id)anItem +{ + return anItem; +} + +- (BOOL)outlineView:(CPOutlineView)anOutlineView writeItems:(CPArray)theItems toPasteboard:(CPPasteboard)aPasteboard +{ + writtenItems = theItems; + + [aPasteboard declareTypes:[OutlineInteractionDragType] owner:self]; + [aPasteboard setData:@"items" forType:OutlineInteractionDragType]; + + return YES; +} + +- (CPDragOperation)outlineView:(CPOutlineView)anOutlineView validateDrop:(id)anInfo proposedItem:(id)anItem proposedChildIndex:(int)anIndex +{ + validations.push({ @"item": anItem, @"index": anIndex }); + + if (shouldRetarget) + [anOutlineView setDropItem:retargetItem dropChildIndex:retargetIndex]; + + return CPDragOperationMove; +} + +- (BOOL)outlineView:(CPOutlineView)anOutlineView acceptDrop:(id)anInfo item:(id)anItem childIndex:(int)anIndex +{ + acceptedDrops.push({ @"item": anItem, @"index": anIndex }); + + return YES; +} + +@end + +@implementation _CPOutlineInteractionDraggingInfo : CPObject +{ + CPPasteboard draggingPasteboard @accessors; + CGPoint draggingLocation @accessors; +} + +@end + +@implementation CPOutlineViewInteractionTest : OJTestCase +{ + CPWindow theWindow; + _CPOutlineInteractionView outlineView; + _CPOutlineInteractionDataSource dataSource; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) styleMask:CPWindowNotSizable]; + outlineView = [[_CPOutlineInteractionView alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 300.0)]; + + var column = [[CPTableColumn alloc] initWithIdentifier:@"Column"]; + + [column setWidth:200.0]; + [outlineView addTableColumn:column]; + [outlineView setOutlineTableColumn:column]; + [outlineView setAllowsMultipleSelection:YES]; + [[theWindow contentView] addSubview:outlineView]; + + dataSource = [[_CPOutlineInteractionDataSource alloc] init]; + + [outlineView setDataSource:dataSource]; + [outlineView registerForDraggedTypes:[OutlineInteractionDragType]]; + [outlineView expandItem:@"A"]; + [outlineView reloadData]; +} + +- (CGPoint)pointInItem:(id)anItem +{ + return CGPointMake(100.0, CGRectGetMidY([outlineView rectOfRow:[outlineView rowForItem:anItem]])); +} + +- (id)draggingInfoAtPoint:(CGPoint)aPoint +{ + var info = [[_CPOutlineInteractionDraggingInfo alloc] init], + pasteboard = [CPPasteboard pasteboardWithName:CPDragPboard]; + + [pasteboard declareTypes:[OutlineInteractionDragType] owner:self]; + [info setDraggingPasteboard:pasteboard]; + [info setDraggingLocation:[outlineView convertPoint:aPoint toView:nil]]; + + return info; +} + +- (void)sendMouse:(CPEventType)aType atPoint:(CGPoint)aPoint +{ + var event = [CPEvent mouseEventWithType:aType + location:[outlineView convertPoint:aPoint toView:nil] + modifierFlags:0 + timestamp:0 + windowNumber:[theWindow windowNumber] + context:nil + eventNumber:0 + clickCount:1 + pressure:0]; + + [CPApp sendEvent:event]; + [outlineView trackMouse:event]; +} + +- (void)testDraggingARowWritesItsItem +{ + var start = [self pointInItem:@"A1"]; + + [self sendMouse:CPLeftMouseDown atPoint:start]; + [self sendMouse:CPLeftMouseDragged atPoint:CGPointMake(start.x + 20.0, start.y)]; + + [self assert:[@"A1"] equals:[dataSource writtenItems]]; + [self assert:1 equals:[[outlineView dragCalls] count]]; +} + +- (void)testDraggingASelectionWritesEachItem +{ + var firstRow = [outlineView rowForItem:@"A1"]; + + [outlineView selectRowIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(firstRow, 2)] byExtendingSelection:NO]; + + var start = [self pointInItem:@"A2"]; + + [self sendMouse:CPLeftMouseDown atPoint:start]; + [self sendMouse:CPLeftMouseDragged atPoint:CGPointMake(start.x + 20.0, start.y)]; + + [self assert:[@"A1", @"A2"] equals:[dataSource writtenItems]]; +} + +- (void)testTheMiddleOfARowProposesADropOnThatItem +{ + [outlineView draggingUpdated:[self draggingInfoAtPoint:[self pointInItem:@"B"]]]; + + [self assert:@"B" equals:[dataSource validations][0].item]; + [self assert:CPOutlineViewDropOnItemIndex equals:[dataSource validations][0].index]; +} + +- (void)testTheTopOfAChildRowProposesADropInItsParent +{ + var rect = [outlineView rectOfRow:[outlineView rowForItem:@"A2"]]; + + [outlineView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(100.0, CGRectGetMinY(rect) + 1.0)]]; + + [self assert:@"A" equals:[dataSource validations][0].item]; + [self assert:1 equals:[dataSource validations][0].index]; +} + +/* + Between a child and a root row, either parent is possible, and the horizontal + position of the drag chooses between them. +*/ +- (void)testAnUnindentedDropAboveARootRowProposesTheRoot +{ + var rect = [outlineView rectOfRow:[outlineView rowForItem:@"B"]]; + + [outlineView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(5.0, CGRectGetMinY(rect) + 1.0)]]; + + [self assertNull:[dataSource validations][0].item]; + [self assert:1 equals:[dataSource validations][0].index]; +} + +- (void)testAnIndentedDropAboveARootRowProposesTheEndOfThePreviousParent +{ + var rect = [outlineView rectOfRow:[outlineView rowForItem:@"B"]]; + + [outlineView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(100.0, CGRectGetMinY(rect) + 1.0)]]; + + [self assert:@"A" equals:[dataSource validations][0].item]; + [self assert:2 equals:[dataSource validations][0].index]; +} + +- (void)testBelowTheLastRowProposesADropAtTheEndOfTheRoot +{ + [outlineView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(100.0, 290.0)]]; + + [self assertNull:[dataSource validations][0].item]; + [self assert:3 equals:[dataSource validations][0].index]; +} + +- (void)testAcceptingADropReceivesTheProposedItem +{ + var info = [self draggingInfoAtPoint:[self pointInItem:@"B"]]; + + [outlineView draggingUpdated:info]; + + [self assertTrue:[outlineView performDragOperation:info]]; + [self assert:@"B" equals:[dataSource acceptedDrops][0].item]; + [self assert:CPOutlineViewDropOnItemIndex equals:[dataSource acceptedDrops][0].index]; +} + +- (void)testDataSourceCanRetargetADropBetweenChildren +{ + [dataSource setShouldRetarget:YES]; + [dataSource setRetargetItem:@"A"]; + [dataSource setRetargetIndex:0]; + + var info = [self draggingInfoAtPoint:[self pointInItem:@"B"]]; + + [outlineView draggingUpdated:info]; + [outlineView performDragOperation:info]; + + [self assert:@"A" equals:[dataSource acceptedDrops][0].item]; + [self assert:0 equals:[dataSource acceptedDrops][0].index]; +} + +- (void)testDataSourceCanRetargetADropOnAnItem +{ + [dataSource setShouldRetarget:YES]; + [dataSource setRetargetItem:@"C"]; + [dataSource setRetargetIndex:CPOutlineViewDropOnItemIndex]; + + var info = [self draggingInfoAtPoint:[self pointInItem:@"B"]]; + + [outlineView draggingUpdated:info]; + [outlineView performDragOperation:info]; + + [self assert:@"C" equals:[dataSource acceptedDrops][0].item]; + [self assert:CPOutlineViewDropOnItemIndex equals:[dataSource acceptedDrops][0].index]; +} + +- (void)testHoveringOverACollapsedItemExpandsIt +{ + [self assertFalse:[outlineView isItemExpanded:@"C"]]; + + [outlineView setDropItem:@"C" dropChildIndex:CPOutlineViewDropOnItemIndex]; + [outlineView._dragHoverTimer fire]; + + [self assertTrue:[outlineView isItemExpanded:@"C"]]; +} + +- (void)testAChildIndexCancelsTheHover +{ + [outlineView setDropItem:@"C" dropChildIndex:CPOutlineViewDropOnItemIndex]; + [outlineView setDropItem:@"C" dropChildIndex:0]; + + [self assertNull:outlineView._dragHoverTimer]; +} + +- (void)testEndingADragCancelsTheHover +{ + [outlineView setDropItem:@"C" dropChildIndex:CPOutlineViewDropOnItemIndex]; + [outlineView draggedView:nil endedAt:CGPointMakeZero() operation:CPDragOperationNone]; + + [self assertNull:outlineView._dragHoverTimer]; + [self assertFalse:[outlineView isItemExpanded:@"C"]]; +} + +@end diff --git a/Tests/AppKit/CPTableViewInteractionTest.j b/Tests/AppKit/CPTableViewInteractionTest.j new file mode 100644 index 000000000..4de7940b6 --- /dev/null +++ b/Tests/AppKit/CPTableViewInteractionTest.j @@ -0,0 +1,785 @@ +/* + * CPTableViewInteractionTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + A person selects, edits and drags rows with the mouse and the keyboard. These tests + send a table the same events, and check what its delegate and data source receive. + + The drag session itself needs a display, so the table subclass records the call + that would start it. A stub stands in for the dragging information. These tests + cannot show that a drag image follows the pointer or that a drop indicator is + visible. +*/ + +var InteractionDragType = @"InteractionDragType"; + +@implementation _CPTableInteractionTable : CPTableView +{ + CPArray dragCalls @accessors; +} + +- (void)dragView:(CPView)aView at:(CGPoint)aLocation offset:(CGSize)mouseOffset event:(CPEvent)anEvent pasteboard:(CPPasteboard)aPasteboard source:(id)aSourceObject slideBack:(BOOL)slideBack +{ + if (!dragCalls) + dragCalls = []; + + dragCalls.push({ @"pasteboard": aPasteboard, @"source": aSourceObject }); +} + +@end + +@implementation _CPTableInteractionDataSource : CPObject +{ + CPArray rows @accessors; + CPArray editedValues @accessors; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + rows = [@"Zero", @"One", @"Two", @"Three", @"Four"]; + editedValues = []; + } + + return self; +} + +- (int)numberOfRowsInTableView:(CPTableView)aTableView +{ + return rows.length; +} + +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +{ + return rows[aRow]; +} + +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)aColumn row:(int)aRow +{ + editedValues.push({ @"row": aRow, @"value": aValue }); +} + +@end + +@implementation _CPTableInteractionDragDataSource : _CPTableInteractionDataSource +{ + BOOL allowsDrag @accessors; + CPIndexSet writtenRows @accessors; + CPDragOperation validation @accessors; + BOOL acceptsDrop @accessors; + CPArray validations @accessors; + CPArray acceptedDrops @accessors; + id retargetRow @accessors; + id retargetOperation @accessors; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + allowsDrag = YES; + validation = CPDragOperationMove; + acceptsDrop = YES; + validations = []; + acceptedDrops = []; + } + + return self; +} + +- (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)theIndexes toPasteboard:(CPPasteboard)aPasteboard +{ + writtenRows = theIndexes; + + if (allowsDrag) + { + [aPasteboard declareTypes:[InteractionDragType] owner:self]; + [aPasteboard setData:@"rows" forType:InteractionDragType]; + } + + return allowsDrag; +} + +- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)anInfo proposedRow:(int)aRow proposedDropOperation:(CPTableViewDropOperation)anOperation +{ + validations.push({ @"row": aRow, @"operation": anOperation }); + + if (retargetRow != nil) + [aTableView setDropRow:retargetRow dropOperation:retargetOperation]; + + return validation; +} + +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)anInfo row:(int)aRow dropOperation:(CPTableViewDropOperation)anOperation +{ + acceptedDrops.push({ @"row": aRow, @"operation": anOperation }); + + return acceptsDrop; +} + +@end + +@implementation _CPTableInteractionDelegate : CPObject +{ + CPArray calls @accessors; + BOOL allowsSelectionChange @accessors; + BOOL allowsEditing @accessors; + CPArray refusedRows @accessors; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + calls = []; + allowsSelectionChange = YES; + allowsEditing = YES; + refusedRows = []; + } + + return self; +} + +- (BOOL)selectionShouldChangeInTableView:(CPTableView)aTableView +{ + calls.push(@"selectionShouldChange"); + + return allowsSelectionChange; +} + +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(int)aRow +{ + return refusedRows.indexOf(aRow) === -1; +} + +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aColumn row:(int)aRow +{ + calls.push(@"shouldEdit"); + + return allowsEditing; +} + +- (void)tableViewSelectionIsChanging:(CPNotification)aNotification +{ + calls.push(@"selectionIsChanging"); +} + +- (void)tableViewSelectionDidChange:(CPNotification)aNotification +{ + calls.push(@"selectionDidChange"); +} + +@end + +@implementation _CPTableInteractionProposalDelegate : CPObject +{ +} + +- (CPIndexSet)tableView:(CPTableView)aTableView selectionIndexesForProposedSelection:(CPIndexSet)theIndexes +{ + return [CPIndexSet indexSetWithIndex:3]; +} + +@end + +@implementation _CPTableInteractionDraggingInfo : CPObject +{ + CPPasteboard draggingPasteboard @accessors; + CGPoint draggingLocation @accessors; +} + +@end + +@implementation CPTableViewInteractionTest : OJTestCase +{ + CPWindow theWindow; + _CPTableInteractionTable tableView; + CPTableColumn tableColumn; + _CPTableInteractionDataSource dataSource; + _CPTableInteractionDelegate delegate; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 400.0) styleMask:CPWindowNotSizable]; + tableView = [[_CPTableInteractionTable alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 300.0)]; + tableColumn = [[CPTableColumn alloc] initWithIdentifier:@"Column"]; + + [tableColumn setWidth:200.0]; + [tableColumn setEditable:YES]; + [tableView addTableColumn:tableColumn]; + [tableView setAllowsMultipleSelection:YES]; + [[theWindow contentView] addSubview:tableView]; + + delegate = [[_CPTableInteractionDelegate alloc] init]; + [self useDataSource:[[_CPTableInteractionDataSource alloc] init]]; + [tableView setDelegate:delegate]; +} + +- (void)useDataSource:(id)aDataSource +{ + dataSource = aDataSource; + + [tableView setDataSource:dataSource]; + [tableView reloadData]; +} + +- (CGPoint)pointInRow:(int)aRow +{ + return CGPointMake(20.0, CGRectGetMidY([tableView rectOfRow:aRow])); +} + +- (CPEvent)mouseEvent:(CPEventType)aType atPoint:(CGPoint)aPoint flags:(unsigned)theFlags clicks:(int)aClickCount +{ + return [CPEvent mouseEventWithType:aType + location:[tableView convertPoint:aPoint toView:nil] + modifierFlags:theFlags + timestamp:0 + windowNumber:[theWindow windowNumber] + context:nil + eventNumber:0 + clickCount:aClickCount + pressure:0]; +} + +- (void)sendEvent:(CPEvent)anEvent +{ + [CPApp sendEvent:anEvent]; + [tableView trackMouse:anEvent]; +} + +- (void)clickPoint:(CGPoint)aPoint flags:(unsigned)theFlags clicks:(int)aClickCount +{ + [self sendEvent:[self mouseEvent:CPLeftMouseDown atPoint:aPoint flags:theFlags clicks:aClickCount]]; + [self sendEvent:[self mouseEvent:CPLeftMouseUp atPoint:aPoint flags:theFlags clicks:aClickCount]]; +} + +- (void)clickRow:(int)aRow +{ + [self clickPoint:[self pointInRow:aRow] flags:0 clicks:1]; +} + +- (void)clickRow:(int)aRow flags:(unsigned)theFlags +{ + [self clickPoint:[self pointInRow:aRow] flags:theFlags clicks:1]; +} + +- (void)pressKey:(CPString)aCharacter flags:(unsigned)theFlags +{ + [tableView keyDown:[CPEvent keyEventWithType:CPKeyDown + location:CGPointMakeZero() + modifierFlags:theFlags + timestamp:0 + windowNumber:[theWindow windowNumber] + context:nil + characters:aCharacter + charactersIgnoringModifiers:aCharacter + isARepeat:NO + keyCode:0]]; +} + +- (CPArray)selectedRows +{ + var rows = []; + + [[tableView selectedRowIndexes] getIndexes:rows maxCount:-1 inIndexRange:nil]; + + return rows; +} + +- (id)draggingInfoAtPoint:(CGPoint)aPoint +{ + var info = [[_CPTableInteractionDraggingInfo alloc] init], + pasteboard = [CPPasteboard pasteboardWithName:CPDragPboard]; + + [pasteboard declareTypes:[InteractionDragType] owner:self]; + [info setDraggingPasteboard:pasteboard]; + [info setDraggingLocation:[tableView convertPoint:aPoint toView:nil]]; + + return info; +} + +- (void)useDragDataSource +{ + [self useDataSource:[[_CPTableInteractionDragDataSource alloc] init]]; + [tableView registerForDraggedTypes:[InteractionDragType]]; +} + +// MARK: Selection + +- (void)testClickSelectsARow +{ + [self clickRow:2]; + + [self assert:[2] equals:[self selectedRows]]; +} + +- (void)testClickReplacesTheSelection +{ + [self clickRow:1]; + [self clickRow:3]; + + [self assert:[3] equals:[self selectedRows]]; +} + +- (void)testClickOutsideTheRowsClearsTheSelection +{ + [self clickRow:1]; + [self clickPoint:CGPointMake(20.0, 290.0) flags:0 clicks:1]; + + [self assert:[] equals:[self selectedRows]]; +} + +- (void)testClickOutsideTheRowsKeepsTheSelectionWhenItCannotBeEmpty +{ + [tableView setAllowsEmptySelection:NO]; + [self clickRow:1]; + [self clickPoint:CGPointMake(20.0, 290.0) flags:0 clicks:1]; + + [self assert:[1] equals:[self selectedRows]]; +} + +- (void)testCommandClickAddsAndRemovesARow +{ + [self clickRow:1]; + [self clickRow:3 flags:CPCommandKeyMask]; + + [self assert:[1, 3] equals:[self selectedRows]]; + + [self clickRow:1 flags:CPCommandKeyMask]; + + [self assert:[3] equals:[self selectedRows]]; +} + +- (void)testCommandClickReplacesTheSelectionWithoutMultipleSelection +{ + [tableView setAllowsMultipleSelection:NO]; + [self clickRow:1]; + [self clickRow:3 flags:CPCommandKeyMask]; + + [self assert:[3] equals:[self selectedRows]]; +} + +- (void)testShiftClickExtendsFromTheAnchor +{ + [self clickRow:1]; + [self clickRow:3 flags:CPShiftKeyMask]; + + [self assert:[1, 2, 3] equals:[self selectedRows]]; +} + +- (void)testDraggingAcrossRowsExtendsTheSelection +{ + [self sendEvent:[self mouseEvent:CPLeftMouseDown atPoint:[self pointInRow:1] flags:0 clicks:1]]; + [self sendEvent:[self mouseEvent:CPLeftMouseDragged atPoint:[self pointInRow:2] flags:0 clicks:1]]; + [self sendEvent:[self mouseEvent:CPLeftMouseDragged atPoint:[self pointInRow:3] flags:0 clicks:1]]; + [self sendEvent:[self mouseEvent:CPLeftMouseUp atPoint:[self pointInRow:3] flags:0 clicks:1]]; + + [self assert:[1, 2, 3] equals:[self selectedRows]]; +} + +- (void)testDelegateCanRefuseASelectionChange +{ + [delegate setAllowsSelectionChange:NO]; + [self clickRow:2]; + + [self assert:[] equals:[self selectedRows]]; + [self assertTrue:[delegate calls].indexOf(@"selectionShouldChange") !== -1]; +} + +- (void)testDelegateCanRefuseARow +{ + [delegate setRefusedRows:[2]]; + [self clickRow:2]; + + [self assert:[] equals:[self selectedRows]]; +} + +- (void)testDelegateCanReplaceTheProposedSelection +{ + [tableView setDelegate:[[_CPTableInteractionProposalDelegate alloc] init]]; + [self clickRow:1]; + + [self assert:[3] equals:[self selectedRows]]; +} + +- (void)testAClickReportsOneSelectionChange +{ + [self clickRow:2]; + + var changes = [delegate calls].filter(function(aCall) + { + return aCall === @"selectionDidChange"; + }); + + [self assert:1 equals:changes.length]; +} + +- (void)testClickingTheSelectedRowReportsNoChange +{ + [self clickRow:2]; + [delegate setCalls:[]]; + [self clickRow:2]; + + [self assertTrue:[delegate calls].indexOf(@"selectionDidChange") === -1]; +} + +- (void)testSelectAllSelectsEveryRow +{ + [tableView selectAll:nil]; + + [self assert:[0, 1, 2, 3, 4] equals:[self selectedRows]]; +} + +- (void)testDownArrowMovesTheSelection +{ + [self clickRow:1]; + [self pressKey:CPDownArrowFunctionKey flags:0]; + + [self assert:[2] equals:[self selectedRows]]; +} + +- (void)testUpArrowMovesTheSelection +{ + [self clickRow:2]; + [self pressKey:CPUpArrowFunctionKey flags:0]; + + [self assert:[1] equals:[self selectedRows]]; +} + +- (void)testArrowStopsAtTheLastRow +{ + [self clickRow:4]; + [self pressKey:CPDownArrowFunctionKey flags:0]; + + [self assert:[4] equals:[self selectedRows]]; +} + +- (void)testArrowSelectsAnEndRowWhenNothingIsSelected +{ + [self pressKey:CPDownArrowFunctionKey flags:0]; + [self assert:[0] equals:[self selectedRows]]; + + [tableView deselectAll:nil]; + [self pressKey:CPUpArrowFunctionKey flags:0]; + [self assert:[4] equals:[self selectedRows]]; +} + +- (void)testShiftArrowExtendsAndShrinksTheSelection +{ + [self clickRow:1]; + [self pressKey:CPDownArrowFunctionKey flags:CPShiftKeyMask]; + + [self assert:[1, 2] equals:[self selectedRows]]; + + [self pressKey:CPUpArrowFunctionKey flags:CPShiftKeyMask]; + + [self assert:[1] equals:[self selectedRows]]; +} + +- (void)testArrowSkipsARefusedRow +{ + [delegate setRefusedRows:[2]]; + [self clickRow:1]; + [self pressKey:CPDownArrowFunctionKey flags:0]; + + [self assert:[3] equals:[self selectedRows]]; +} + +- (void)testArrowRespectsARefusedSelectionChange +{ + [self clickRow:1]; + [delegate setAllowsSelectionChange:NO]; + [self pressKey:CPDownArrowFunctionKey flags:0]; + + [self assert:[1] equals:[self selectedRows]]; +} + +// MARK: Editing + +- (void)testEditingAnUnselectedRowRaises +{ + [self assertThrows:function() + { + [tableView editColumn:0 row:1 withEvent:nil select:YES]; + }]; +} + +- (void)testEditingReportsTheEditedCell +{ + [self clickRow:1]; + [tableView editColumn:0 row:1 withEvent:nil select:YES]; + + [self assert:0 equals:[tableView editedColumn]]; + [self assert:1 equals:[tableView editedRow]]; +} + +- (void)testEditingMakesTheCellTheFirstResponder +{ + [self clickRow:1]; + [tableView editColumn:0 row:1 withEvent:nil select:YES]; + + [self assertTrue:[[theWindow firstResponder] isKindOfClass:[CPTextField class]]]; + [self assert:@"One" equals:[[theWindow firstResponder] stringValue]]; +} + +- (void)testEndingAnEditCommitsTheValue +{ + [self clickRow:1]; + [tableView editColumn:0 row:1 withEvent:nil select:YES]; + + var field = [theWindow firstResponder]; + + [field setStringValue:@"Edited"]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidEndEditingNotification object:field]; + + [self assert:1 equals:[dataSource editedValues].length]; + [self assert:1 equals:[dataSource editedValues][0].row]; + [self assert:@"Edited" equals:[dataSource editedValues][0].value]; + [self assert:tableView equals:[theWindow firstResponder]]; +} + +- (void)testDoubleClickStartsEditing +{ + [self clickRow:1]; + [self clickPoint:[self pointInRow:1] flags:0 clicks:2]; + + [self assert:1 equals:[tableView editedRow]]; + [self assertTrue:[delegate calls].indexOf(@"shouldEdit") !== -1]; +} + +- (void)testDelegateCanRefuseAnEdit +{ + [delegate setAllowsEditing:NO]; + [self clickRow:1]; + [self clickPoint:[self pointInRow:1] flags:0 clicks:2]; + + [self assert:CPNotFound equals:[tableView editedRow]]; +} + +- (void)testAColumnThatIsNotEditableDoesNotStartAnEdit +{ + [tableColumn setEditable:NO]; + [self clickRow:1]; + [self clickPoint:[self pointInRow:1] flags:0 clicks:2]; + + [self assert:CPNotFound equals:[tableView editedRow]]; +} + +// MARK: Starting a drag + +- (void)dragFromRow:(int)aRow toPoint:(CGPoint)aPoint +{ + [self sendEvent:[self mouseEvent:CPLeftMouseDown atPoint:[self pointInRow:aRow] flags:0 clicks:1]]; + [self sendEvent:[self mouseEvent:CPLeftMouseDragged atPoint:aPoint flags:0 clicks:1]]; +} + +- (void)testADraggableTableSelectsOnMouseUp +{ + [self useDragDataSource]; + + [self sendEvent:[self mouseEvent:CPLeftMouseDown atPoint:[self pointInRow:2] flags:0 clicks:1]]; + [self assert:[] equals:[self selectedRows]]; + + [self sendEvent:[self mouseEvent:CPLeftMouseUp atPoint:[self pointInRow:2] flags:0 clicks:1]]; + [self assert:[2] equals:[self selectedRows]]; +} + +- (void)testDraggingARowStartsADrag +{ + [self useDragDataSource]; + + var start = [self pointInRow:2]; + + [self dragFromRow:2 toPoint:CGPointMake(start.x + 20.0, start.y)]; + + [self assert:1 equals:[[tableView dragCalls] count]]; + [self assert:[CPIndexSet indexSetWithIndex:2] equals:[dataSource writtenRows]]; + [self assert:[InteractionDragType] equals:[[tableView dragCalls][0].pasteboard types]]; + [self assert:tableView equals:[tableView dragCalls][0].source]; +} + +- (void)testDraggingASelectedRowDragsTheWholeSelection +{ + [self useDragDataSource]; + [tableView selectRowIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(1, 2)] byExtendingSelection:NO]; + + var start = [self pointInRow:2]; + + [self dragFromRow:2 toPoint:CGPointMake(start.x + 20.0, start.y)]; + + [self assert:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(1, 2)] equals:[dataSource writtenRows]]; +} + +- (void)testAMoveWithinTheClickSlopDoesNotStartADrag +{ + [self useDragDataSource]; + + var start = [self pointInRow:2]; + + [self dragFromRow:2 toPoint:CGPointMake(start.x + 2.0, start.y)]; + + [self assertNull:[tableView dragCalls]]; +} + +- (void)testDataSourceCanRefuseADrag +{ + [self useDragDataSource]; + [dataSource setAllowsDrag:NO]; + + var start = [self pointInRow:2]; + + [self dragFromRow:2 toPoint:CGPointMake(start.x + 20.0, start.y)]; + + [self assertNull:[tableView dragCalls]]; +} + +// MARK: Dropping + +- (void)testAnUnregisteredTypeIsRefused +{ + [self useDragDataSource]; + [tableView unregisterDraggedTypes]; + + [self assert:CPDragOperationNone equals:[tableView draggingEntered:[self draggingInfoAtPoint:[self pointInRow:2]]]]; + [self assert:0 equals:[dataSource validations].length]; +} + +- (void)testARegisteredTypeIsValidated +{ + [self useDragDataSource]; + + [self assert:CPDragOperationMove equals:[tableView draggingEntered:[self draggingInfoAtPoint:[self pointInRow:2]]]]; + [self assert:1 equals:[dataSource validations].length]; +} + +- (void)testValidationCanRefuseADrop +{ + [self useDragDataSource]; + [dataSource setValidation:CPDragOperationNone]; + + [self assert:CPDragOperationNone equals:[tableView draggingUpdated:[self draggingInfoAtPoint:[self pointInRow:2]]]]; +} + +- (void)testTheMiddleOfARowProposesADropOnThatRow +{ + [self useDragDataSource]; + [tableView draggingUpdated:[self draggingInfoAtPoint:[self pointInRow:2]]]; + + [self assert:2 equals:[dataSource validations][0].row]; + [self assert:CPTableViewDropOn equals:[dataSource validations][0].operation]; +} + +- (void)testTheTopOfARowProposesADropAboveThatRow +{ + [self useDragDataSource]; + + var rect = [tableView rectOfRow:2]; + + [tableView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(20.0, CGRectGetMinY(rect) + 1.0)]]; + + [self assert:2 equals:[dataSource validations][0].row]; + [self assert:CPTableViewDropAbove equals:[dataSource validations][0].operation]; +} + +- (void)testTheBottomOfARowProposesADropAboveTheNextRow +{ + [self useDragDataSource]; + + var rect = [tableView rectOfRow:2]; + + [tableView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(20.0, CGRectGetMaxY(rect) - 1.0)]]; + + [self assert:3 equals:[dataSource validations][0].row]; + [self assert:CPTableViewDropAbove equals:[dataSource validations][0].operation]; +} + +- (void)testBelowTheLastRowProposesADropAtTheEnd +{ + [self useDragDataSource]; + [tableView draggingUpdated:[self draggingInfoAtPoint:CGPointMake(20.0, 290.0)]]; + + [self assert:5 equals:[dataSource validations][0].row]; + [self assert:CPTableViewDropAbove equals:[dataSource validations][0].operation]; +} + +- (void)testAcceptingADropReceivesTheProposedRow +{ + [self useDragDataSource]; + + var info = [self draggingInfoAtPoint:[self pointInRow:2]]; + + [tableView draggingUpdated:info]; + + [self assertTrue:[tableView prepareForDragOperation:info]]; + [self assertTrue:[tableView performDragOperation:info]]; + [self assert:2 equals:[dataSource acceptedDrops][0].row]; + [self assert:CPTableViewDropOn equals:[dataSource acceptedDrops][0].operation]; +} + +- (void)testDataSourceCanRefuseADrop +{ + [self useDragDataSource]; + [dataSource setAcceptsDrop:NO]; + + var info = [self draggingInfoAtPoint:[self pointInRow:2]]; + + [tableView draggingUpdated:info]; + + [self assertFalse:[tableView performDragOperation:info]]; +} + +- (void)testDataSourceCanRetargetADrop +{ + [self useDragDataSource]; + [dataSource setRetargetRow:4]; + [dataSource setRetargetOperation:CPTableViewDropAbove]; + + var info = [self draggingInfoAtPoint:[self pointInRow:2]]; + + [tableView draggingUpdated:info]; + [tableView performDragOperation:info]; + + [self assert:4 equals:[dataSource acceptedDrops][0].row]; + [self assert:CPTableViewDropAbove equals:[dataSource acceptedDrops][0].operation]; +} + +- (void)testPreparingADropNeedsValidation +{ + var info = [self draggingInfoAtPoint:[self pointInRow:2]]; + + [self assertFalse:[tableView prepareForDragOperation:info]]; +} + +@end From 34371c1e0f6dd45fd71da1fbfdea5da598c42a1a Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 21:27:07 -0600 Subject: [PATCH 07/15] Tests: Add view theme state regression tests Protects themed drawing by verifying that the states selecting theme values remain correct as views enter and leave windows and as window status changes. * CPViewThemeStateTest: Verifies the key window, first responder and appearance states across nested views, including views added, removed and moved between windows; the key and main states of the window view; and the order of window move notifications. --- Tests/AppKit/CPViewThemeStateTest.j | 408 ++++++++++++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 Tests/AppKit/CPViewThemeStateTest.j diff --git a/Tests/AppKit/CPViewThemeStateTest.j b/Tests/AppKit/CPViewThemeStateTest.j new file mode 100644 index 000000000..38028859d --- /dev/null +++ b/Tests/AppKit/CPViewThemeStateTest.j @@ -0,0 +1,408 @@ +/* + * CPViewThemeStateTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + A theme value is chosen by the state of a view, so a view with the wrong state + draws wrongly with a correct theme. These tests check that the states that depend + on a view's surroundings stay correct as views enter and leave windows and as + windows change. The states are the key window state, the first responder state + and the appearance states. Only a window's own window view has the main window + state. + + These tests run with no theme loaded. They check the states, and not what a theme + does with them. +*/ + +@implementation _CPThemeStateRecordingView : CPView +{ + CPArray calls @accessors; + BOOL hadKeyStateOnArrival @accessors; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + self = [super initWithFrame:aFrame]; + + if (self) + calls = []; + + return self; +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (void)viewWillMoveToWindow:(CPWindow)aWindow +{ + calls.push({ @"call": @"willMove", @"from": [self window], @"to": aWindow }); +} + +- (void)viewDidMoveToWindow +{ + hadKeyStateOnArrival = [self hasThemeState:CPThemeStateKeyWindow]; + calls.push({ @"call": @"didMove", @"window": [self window] }); +} + +@end + +@implementation CPViewThemeStateTest : OJTestCase +{ + CPWindow firstWindow; + CPWindow secondWindow; + _CPThemeStateRecordingView parentView; + _CPThemeStateRecordingView childView; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + firstWindow = [self newWindow]; + secondWindow = [self newWindow]; + + parentView = [[_CPThemeStateRecordingView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + childView = [[_CPThemeStateRecordingView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)]; + + [parentView addSubview:childView]; +} + +- (CPWindow)newWindow +{ + return [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 200.0, 200.0) styleMask:CPTitledWindowMask]; +} + +- (void)assertKeyState:(BOOL)shouldHaveState +{ + [self assert:shouldHaveState equals:[parentView hasThemeState:CPThemeStateKeyWindow] message:@"parent view"]; + [self assert:shouldHaveState equals:[childView hasThemeState:CPThemeStateKeyWindow] message:@"child view"]; +} + +- (void)assertFirstResponderState:(BOOL)shouldHaveState +{ + [self assert:shouldHaveState equals:[parentView hasThemeState:CPThemeStateFirstResponder] message:@"parent view"]; + [self assert:shouldHaveState equals:[childView hasThemeState:CPThemeStateFirstResponder] message:@"child view"]; +} + +- (void)clearCalls +{ + [parentView setCalls:[]]; + [childView setCalls:[]]; +} + +// MARK: Key window state + +- (void)testAViewOutsideAWindowHasNoKeyState +{ + [self assertKeyState:NO]; +} + +- (void)testBecomingKeyReachesNestedViews +{ + [[firstWindow contentView] addSubview:parentView]; + [self assertKeyState:NO]; + + [firstWindow makeKeyWindow]; + [self assertKeyState:YES]; +} + +- (void)testResigningKeyReachesNestedViews +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeKeyWindow]; + [firstWindow resignKeyWindow]; + + [self assertKeyState:NO]; +} + +- (void)testAnotherWindowBecomingKeyClearsTheState +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeKeyWindow]; + [secondWindow makeKeyWindow]; + + [self assertKeyState:NO]; +} + +- (void)testAViewAddedToAKeyWindowGainsTheState +{ + [firstWindow makeKeyWindow]; + [[firstWindow contentView] addSubview:parentView]; + + [self assertKeyState:YES]; +} + +- (void)testAViewAddedBelowAViewInAKeyWindowGainsTheState +{ + var lateView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeKeyWindow]; + [childView addSubview:lateView]; + + [self assertTrue:[lateView hasThemeState:CPThemeStateKeyWindow]]; +} + +- (void)testAViewRemovedFromAKeyWindowLosesTheState +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeKeyWindow]; + [parentView removeFromSuperview]; + + [self assertKeyState:NO]; +} + +- (void)testMovingToANonKeyWindowClearsTheState +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeKeyWindow]; + [[secondWindow contentView] addSubview:parentView]; + + [self assertKeyState:NO]; +} + +- (void)testMovingToAKeyWindowSetsTheState +{ + [[firstWindow contentView] addSubview:parentView]; + [secondWindow makeKeyWindow]; + [[secondWindow contentView] addSubview:parentView]; + + [self assertKeyState:YES]; +} + +- (void)testANewContentViewGainsTheState +{ + [firstWindow makeKeyWindow]; + [firstWindow setContentView:parentView]; + + [self assertKeyState:YES]; +} + +- (void)testTheStateIsCorrectInViewDidMoveToWindow +{ + [firstWindow makeKeyWindow]; + [[firstWindow contentView] addSubview:parentView]; + + [self assertTrue:[parentView hadKeyStateOnArrival]]; + [self assertTrue:[childView hadKeyStateOnArrival]]; +} + +// MARK: Window view + +/* + A window must be visible to become main, and ordering a window front needs a DOM. + So this test sends becomeMainWindow directly, and it does not cover makeMainWindow. +*/ +- (void)testTheWindowViewFollowsKeyAndMainStatus +{ + var windowView = [firstWindow _windowView]; + + [firstWindow makeKeyWindow]; + [firstWindow becomeMainWindow]; + + [self assertTrue:[windowView hasThemeState:CPThemeStateKeyWindow]]; + [self assertTrue:[windowView hasThemeState:CPThemeStateMainWindow]]; + + [firstWindow resignKeyWindow]; + [firstWindow resignMainWindow]; + + [self assertFalse:[windowView hasThemeState:CPThemeStateKeyWindow]]; + [self assertFalse:[windowView hasThemeState:CPThemeStateMainWindow]]; +} + +// MARK: First responder state + +- (void)testBecomingFirstResponderReachesNestedViews +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeFirstResponder:parentView]; + + [self assertFirstResponderState:YES]; +} + +- (void)testResigningFirstResponderReachesNestedViews +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeFirstResponder:parentView]; + [firstWindow makeFirstResponder:nil]; + + [self assertFirstResponderState:NO]; +} + +- (void)testAViewAddedBelowTheFirstResponderGainsTheState +{ + var lateView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeFirstResponder:parentView]; + [childView addSubview:lateView]; + + [self assertTrue:[lateView hasThemeState:CPThemeStateFirstResponder]]; +} + +- (void)testRemovingTheFirstResponderClearsTheState +{ + [[firstWindow contentView] addSubview:parentView]; + [firstWindow makeFirstResponder:parentView]; + [parentView removeFromSuperview]; + + [self assertFirstResponderState:NO]; + [self assertFalse:[firstWindow firstResponder] === parentView]; +} + +// MARK: Window notifications + +- (void)testEnteringAWindowNotifiesEachViewInOrder +{ + [[firstWindow contentView] addSubview:parentView]; + + [parentView, childView].forEach(function(aView) + { + var calls = [aView calls]; + + [self assert:2 equals:calls.length]; + [self assert:@"willMove" equals:calls[0].call]; + [self assert:firstWindow equals:calls[0].to]; + [self assertNull:calls[0].from]; + [self assert:@"didMove" equals:calls[1].call]; + [self assert:firstWindow equals:calls[1].window]; + }); +} + +- (void)testLeavingAWindowNotifiesEachView +{ + [[firstWindow contentView] addSubview:parentView]; + [self clearCalls]; + [parentView removeFromSuperview]; + + [parentView, childView].forEach(function(aView) + { + var calls = [aView calls]; + + [self assert:2 equals:calls.length]; + [self assertNull:calls[0].to]; + [self assert:firstWindow equals:calls[0].from]; + [self assertNull:calls[1].window]; + }); +} + +- (void)testMovingBetweenWindowsNotifiesEachView +{ + [[firstWindow contentView] addSubview:parentView]; + [self clearCalls]; + [[secondWindow contentView] addSubview:parentView]; + + [parentView, childView].forEach(function(aView) + { + var calls = [aView calls]; + + [self assert:2 equals:calls.length]; + [self assert:firstWindow equals:calls[0].from]; + [self assert:secondWindow equals:calls[0].to]; + [self assert:secondWindow equals:calls[1].window]; + }); +} + +/* + Cocoa also sends these notifications when a view stays in its window and only its + position in the view hierarchy changes. +*/ +- (void)testMovingWithinAWindowNotifiesEachView +{ + var otherView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [[firstWindow contentView] addSubview:parentView]; + [[firstWindow contentView] addSubview:otherView]; + [self clearCalls]; + [otherView addSubview:parentView]; + + [parentView, childView].forEach(function(aView) + { + var calls = [aView calls]; + + [self assert:2 equals:calls.length]; + [self assert:@"willMove" equals:calls[0].call]; + [self assert:firstWindow equals:calls[0].to]; + [self assert:@"didMove" equals:calls[1].call]; + [self assert:firstWindow equals:calls[1].window]; + }); +} + +// MARK: Appearance states + +- (void)testEffectiveAppearanceComesFromTheNearestAncestor +{ + var appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]; + + [parentView setAppearance:appearance]; + + [self assert:appearance equals:[childView effectiveAppearance]]; +} + +- (void)testOwnAppearanceOverridesAnAncestor +{ + var appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]; + + [parentView setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + [childView setAppearance:appearance]; + + [self assert:appearance equals:[childView effectiveAppearance]]; +} + +- (void)testAppearanceStateReachesNestedViews +{ + [parentView setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + [_CPDisplayServer run]; + + [self assertTrue:[parentView hasThemeState:CPThemeStateAppearanceVibrantDark]]; + [self assertTrue:[childView hasThemeState:CPThemeStateAppearanceVibrantDark]]; +} + +- (void)testChangingAppearanceReplacesTheState +{ + [parentView setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + [_CPDisplayServer run]; + [parentView setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + [_CPDisplayServer run]; + + [self assertFalse:[childView hasThemeState:CPThemeStateAppearanceVibrantDark]]; + [self assertTrue:[childView hasThemeState:CPThemeStateAppearanceVibrantLight]]; +} + +- (void)testAViewAddedBelowAnAppearanceGainsItsState +{ + var lateView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [parentView setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + [_CPDisplayServer run]; + [childView addSubview:lateView]; + [lateView setNeedsLayout]; + [_CPDisplayServer run]; + + [self assertTrue:[lateView hasThemeState:CPThemeStateAppearanceVibrantDark]]; +} + +@end From 5e9fb5e36382f1dd646582a0fe9ad0b7b8dfd7a5 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 21:39:38 -0600 Subject: [PATCH 08/15] Tests: Add view theme change regression tests Protects runtime theme changes by verifying that views resolve the correct values, and request layout and display, when a theme, state, theme class or per-view value changes. * CPViewThemeChangeTest: Verifies resolution order, theme and default theme changes, propagation to nested views, state and theme class selection, and preservation of per-view values through theme changes and archiving. --- Tests/AppKit/CPViewThemeChangeTest.j | 327 +++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 Tests/AppKit/CPViewThemeChangeTest.j diff --git a/Tests/AppKit/CPViewThemeChangeTest.j b/Tests/AppKit/CPViewThemeChangeTest.j new file mode 100644 index 000000000..5b139a2f8 --- /dev/null +++ b/Tests/AppKit/CPViewThemeChangeTest.j @@ -0,0 +1,327 @@ +/* + * CPViewThemeChangeTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + A view resolves each theme attribute from its own values, then its theme, then its + class default. When any of these changes, the view must resolve the new value and + lay itself out again. These tests build small themes in code, so they depend on no + real theme. +*/ + +@implementation _CPThemeChangeView : CPView +{ + int layoutCount @accessors; + int themeChangeCount @accessors; + int displayRequestCount @accessors; +} + ++ (CPString)defaultThemeClass +{ + return @"theme-change-view"; +} + ++ (CPDictionary)themeAttributes +{ + return @{ + @"accent": @"class default", + @"margin": @"class default" + }; +} + +- (void)layoutSubviews +{ + layoutCount++; +} + +/* + needsDisplay is true only for a view with its own drawRect:, so the request is + recorded here. +*/ +- (void)setNeedsDisplay:(BOOL)aFlag +{ + if (aFlag) + displayRequestCount++; + + [super setNeedsDisplay:aFlag]; +} + +- (void)objectDidChangeTheme +{ + themeChangeCount++; + + [super objectDidChangeTheme]; +} + +@end + +@implementation CPViewThemeChangeTest : OJTestCase +{ + CPTheme firstTheme; + CPTheme secondTheme; + CPTheme defaultTheme; + _CPThemeChangeView view; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + defaultTheme = [CPTheme defaultTheme]; + firstTheme = [self themeNamed:@"theme-change-first" themeClass:nil accent:@"first"]; + secondTheme = [self themeNamed:@"theme-change-second" themeClass:nil accent:@"second"]; + view = [self newView]; + + [view setTheme:firstTheme]; + [_CPDisplayServer run]; + [view setLayoutCount:0]; + [view setThemeChangeCount:0]; +} + +- (void)tearDown +{ + [CPTheme setDefaultTheme:defaultTheme]; +} + +- (_CPThemeChangeView)newView +{ + return [[_CPThemeChangeView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; +} + +- (CPTheme)themeNamed:(CPString)aName themeClass:(CPString)aThemeClass accent:(CPString)anAccent +{ + var theme = [[CPTheme alloc] initWithName:aName], + template = [self newView]; + + if (aThemeClass) + [template setThemeClass:aThemeClass]; + + [template setValue:anAccent forThemeAttribute:@"accent"]; + [theme takeThemeFromObject:template]; + + return theme; +} + +- (id)archived:(CPView)aView +{ + return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:aView]]; +} + +- (void)assertAccent:(CPString)aValue ofView:(CPView)aView +{ + [self assert:aValue equals:[aView currentValueForThemeAttribute:@"accent"]]; +} + +- (void)testAViewResolvesItsThemeValue +{ + [self assertAccent:@"first" ofView:view]; +} + +- (void)testAnAttributeTheThemeDoesNotDefineUsesTheClassDefault +{ + [self assert:@"class default" equals:[view currentValueForThemeAttribute:@"margin"]]; +} + +- (void)testAViewWithoutAThemeUsesTheClassDefault +{ + [view setTheme:nil]; + + [self assertAccent:@"class default" ofView:view]; +} + +- (void)testSettingAThemeChangesTheResolvedValue +{ + [view setTheme:secondTheme]; + + [self assertAccent:@"second" ofView:view]; +} + +- (void)testSettingAThemeNotifiesTheView +{ + [view setTheme:secondTheme]; + + [self assert:1 equals:[view themeChangeCount]]; +} + +- (void)testSettingTheSameThemeDoesNothing +{ + [view setTheme:firstTheme]; + + [self assert:0 equals:[view themeChangeCount]]; +} + +- (void)testSettingAThemeQueuesLayout +{ + [view setTheme:secondTheme]; + [_CPDisplayServer run]; + + [self assert:1 equals:[view layoutCount]]; +} + +- (void)testSettingAThemeRequestsDisplay +{ + [view setDisplayRequestCount:0]; + [view setTheme:secondTheme]; + + [self assertTrue:[view displayRequestCount] > 0]; +} + +- (void)testAThemeChangeReachesNestedViews +{ + var parent = [self newView], + child = [self newView], + grandchild = [self newView]; + + [parent addSubview:child]; + [child addSubview:grandchild]; + [parent _setThemeIncludingDescendants:secondTheme]; + + [self assertAccent:@"second" ofView:parent]; + [self assertAccent:@"second" ofView:child]; + [self assertAccent:@"second" ofView:grandchild]; +} + +- (void)testAPerViewValueTakesPriorityOverTheTheme +{ + [view setValue:@"own" forThemeAttribute:@"accent"]; + + [self assertAccent:@"own" ofView:view]; +} + +- (void)testAPerViewValueSurvivesAThemeChange +{ + [view setValue:@"own" forThemeAttribute:@"accent"]; + [view setTheme:secondTheme]; + + [self assertAccent:@"own" ofView:view]; +} + +- (void)testAPerViewValueQueuesLayout +{ + [view setValue:@"own" forThemeAttribute:@"accent"]; + [_CPDisplayServer run]; + + [self assert:1 equals:[view layoutCount]]; +} + +- (void)testSettingTheSamePerViewValueQueuesNoLayout +{ + [view setValue:@"first" forThemeAttribute:@"accent"]; + [_CPDisplayServer run]; + + [self assert:0 equals:[view layoutCount]]; +} + +- (void)testAStateSelectsItsValue +{ + [view setValue:@"disabled" forThemeAttribute:@"accent" inState:CPThemeStateDisabled]; + [self assertAccent:@"first" ofView:view]; + + [view setThemeState:CPThemeStateDisabled]; + [self assertAccent:@"disabled" ofView:view]; + + [view unsetThemeState:CPThemeStateDisabled]; + [self assertAccent:@"first" ofView:view]; +} + +- (void)testAStateChangeQueuesLayout +{ + [view setThemeState:CPThemeStateDisabled]; + [_CPDisplayServer run]; + + [self assert:1 equals:[view layoutCount]]; +} + +- (void)testSettingAThemeClassChangesTheResolvedValue +{ + var theme = [self themeNamed:@"theme-change-class" themeClass:@"other-class" accent:@"other class"]; + + [view setTheme:theme]; + [view setThemeClass:@"other-class"]; + + [self assertAccent:@"other class" ofView:view]; +} + +- (void)testSettingAThemeClassQueuesLayout +{ + [view setThemeClass:@"other-class"]; + [_CPDisplayServer run]; + + [self assert:1 equals:[view layoutCount]]; +} + +- (void)testANewViewUsesTheDefaultTheme +{ + [CPTheme setDefaultTheme:secondTheme]; + + [self assertAccent:@"second" ofView:[self newView]]; +} + +- (void)testChangingTheDefaultThemeLeavesAnExistingViewUnchanged +{ + [CPTheme setDefaultTheme:secondTheme]; + + [self assertAccent:@"first" ofView:view]; +} + +- (void)testADecodedViewUsesTheDefaultTheme +{ + [CPTheme setDefaultTheme:secondTheme]; + + [self assertAccent:@"second" ofView:[self archived:view]]; +} + +- (void)testADecodedViewKeepsAPerViewValue +{ + [view setValue:@"own" forThemeAttribute:@"accent"]; + + [self assertAccent:@"own" ofView:[self archived:view]]; +} + +- (void)testADecodedViewKeepsAPerViewStateValue +{ + [view setValue:@"disabled" forThemeAttribute:@"accent" inState:CPThemeStateDisabled]; + + var decoded = [self archived:view]; + + [decoded setThemeState:CPThemeStateDisabled]; + + [self assertAccent:@"disabled" ofView:decoded]; +} + +- (void)testADecodedViewKeepsItsThemeState +{ + [view setThemeState:CPThemeStateDisabled]; + + [self assertTrue:[[self archived:view] hasThemeState:CPThemeStateDisabled]]; +} + +- (void)testADecodedViewKeepsItsThemeClass +{ + [view setThemeClass:@"other-class"]; + + [self assert:@"other-class" equals:[[self archived:view] themeClass]]; +} + +@end From 994465977654e60d2839d1ecdaefb3ac9003bff9 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 22:02:28 -0600 Subject: [PATCH 09/15] AppKit: Protect behaviour of decoded views and add regression tests Ensure decoded views are correct by verifying they retain their connections and respond as before archiving. A decoded table no longer raises, and decoded button bars, tab views, text fields and outlines retain their observers, selection, delegates and data source methods. * CPButtonBar: Observe the hidden state of decoded buttons. * CPOutlineView: Decode the data source and delegate through their setters. * CPTableView: Set the data source and delegate after _init during decoding. * CPTabView: Select the archived tab view item during decoding, before the delegate is set. * CPTextField: Archive the delegate. * CPViewDecodedBehaviorTest: Verifies connections, the view hierarchy, and the behaviour of objects each class creates or observes after decoding. --- AppKit/CPButtonBar.j | 5 + AppKit/CPOutlineView.j | 11 +- AppKit/CPTabView.j | 9 +- AppKit/CPTableView.j | 7 +- AppKit/CPTextField.j | 7 +- Tests/AppKit/CPViewDecodedBehaviorTest.j | 475 +++++++++++++++++++++++ 6 files changed, 505 insertions(+), 9 deletions(-) create mode 100644 Tests/AppKit/CPViewDecodedBehaviorTest.j diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j index 44aba3384..e32f17a5f 100644 --- a/AppKit/CPButtonBar.j +++ b/AppKit/CPButtonBar.j @@ -390,6 +390,11 @@ var CPButtonBarHasResizeControlKey = @"CPButtonBarHasResizeControlKey", _rightButtons = [aCoder decodeObjectForKey:CPButtonBarRightButtonsKey] || []; _hasResizeControl = [aCoder decodeBoolForKey:CPButtonBarHasResizeControlKey]; _resizeControlIsLeftAligned = [aCoder decodeBoolForKey:CPButtonBarResizeControlIsLeftAlignedKey]; + + var buttons = [_buttons arrayByAddingObjectsFromArray:_rightButtons]; + + for (var i = [buttons count] - 1; i >= 0; i--) + [buttons[i] addObserver:self forKeyPath:@"hidden" options:CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld context:nil]; } return self; diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 2c4c520f8..6a94ef52b 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -2332,12 +2332,17 @@ var CPOutlineViewIndentationPerLevelKey = @"CPOutlineViewIndentationPerLevelKey" _outlineTableColumn = [aCoder decodeObjectForKey:CPOutlineViewOutlineTableColumnKey]; _indentationPerLevel = [aCoder decodeFloatForKey:CPOutlineViewIndentationPerLevelKey]; - _outlineViewDataSource = [aCoder decodeObjectForKey:CPOutlineViewDataSourceKey]; - _outlineViewDelegate = [aCoder decodeObjectForKey:CPOutlineViewDelegateKey]; - [super setDataSource:self]; [super setDelegate:self]; + // The setters record which optional methods each object implements. + var dataSource = [aCoder decodeObjectForKey:CPOutlineViewDataSourceKey]; + + if (dataSource) + [self setDataSource:dataSource]; + + [self setDelegate:[aCoder decodeObjectForKey:CPOutlineViewDelegateKey]]; + [self _updateIsViewBased]; } diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 4159f390b..bd9857485 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -826,9 +826,14 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", var items = [aCoder decodeObjectForKey:CPTabViewItemsKey] || [CPArray array]; [self _insertTabViewItems:items atIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [items count])] canUpdateSelectedTab:NO]; - [self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]]; + // Inserting the items selected the first one. This is done before there is a + // delegate, because decoding is not a selection made by the user. + var selectedItem = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; - _selectedTabViewItem = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; + if (selectedItem) + [self _selectTabViewItemAtIndex:[self indexOfTabViewItem:selectedItem]]; + + [self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]]; _type = [aCoder decodeIntForKey:CPTabViewTypeKey]; } diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 41f3fdce0..9d6a12daf 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -6269,14 +6269,15 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", _headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey]; _cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey]; - [self setDataSource:[aCoder decodeObjectForKey:CPTableViewDataSourceKey]]; - [self setDelegate:[aCoder decodeObjectForKey:CPTableViewDelegateKey]]; - [self _init]; if ([aCoder containsValueForKey:CPTableViewArchivedReusableViewsKey]) _archivedDataViews = [aCoder decodeObjectForKey:CPTableViewArchivedReusableViewsKey]; + // Setting the data source reloads the table, which needs the state set by _init. + [self setDataSource:[aCoder decodeObjectForKey:CPTableViewDataSourceKey]]; + [self setDelegate:[aCoder decodeObjectForKey:CPTableViewDelegateKey]]; + [self _updateIsViewBased]; [self viewWillMoveToSuperview:[self superview]]; diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 5558ee60a..0152a7389 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -2273,7 +2273,8 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", CPTextFieldPlaceholderStringKey = "CPTextFieldPlaceholderStringKey", CPTextFieldUsesSingleLineMode = "CPTextFieldUsesSingleLineMode", CPTextFieldWraps = "CPTextFieldWraps", - CPTextFieldScrolls = "CPTextFieldScrolls"; + CPTextFieldScrolls = "CPTextFieldScrolls", + CPTextFieldDelegateKey = "CPTextFieldDelegateKey"; @implementation CPTextField (CPCoding) @@ -2303,6 +2304,8 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]]; [self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]]; [self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]]; + + [self setDelegate:[aCoder decodeObjectForKey:CPTextFieldDelegateKey]]; [self updateTrackingAreas]; } @@ -2332,6 +2335,8 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [aCoder encodeBool:_usesSingleLineMode forKey:CPTextFieldUsesSingleLineMode]; [aCoder encodeBool:_wraps forKey:CPTextFieldWraps]; [aCoder encodeBool:_scrolls forKey:CPTextFieldScrolls]; + + [aCoder encodeConditionalObject:_delegate forKey:CPTextFieldDelegateKey]; } @end diff --git a/Tests/AppKit/CPViewDecodedBehaviorTest.j b/Tests/AppKit/CPViewDecodedBehaviorTest.j new file mode 100644 index 000000000..47781492f --- /dev/null +++ b/Tests/AppKit/CPViewDecodedBehaviorTest.j @@ -0,0 +1,475 @@ +/* + * CPViewDecodedBehaviorTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + DropInArchiveTest.j checks that a decoded view has the right content. These tests + check that it still works: that its connections were restored, and that the + objects a class creates or observes for itself were set up again. + + A target or delegate is encoded conditionally, so each test archives a container + that holds the target too. Bindings are not here. They are stored in cibs as + connectors, and not in the views. +*/ + +@implementation _CPDecodedTarget : CPView +{ + int actionCount @accessors; + id lastSender @accessors; +} + +- (void)performAction:(id)aSender +{ + actionCount++; + lastSender = aSender; +} + +@end + +@implementation _CPDecodedTableDataSource : CPObject +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self init]; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ +} + +- (int)numberOfRowsInTableView:(CPTableView)aTableView +{ + return 3; +} + +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +{ + return @"Row"; +} + +@end + +@implementation _CPDecodedOutlineDataSource : _CPDecodedTableDataSource +{ +} + +- (id)outlineView:(CPOutlineView)anOutlineView child:(int)anIndex ofItem:(id)anItem +{ + return anItem ? @"Child" : @"Parent"; +} + +- (BOOL)outlineView:(CPOutlineView)anOutlineView isItemExpandable:(id)anItem +{ + return anItem === @"Parent"; +} + +- (int)outlineView:(CPOutlineView)anOutlineView numberOfChildrenOfItem:(id)anItem +{ + return (!anItem || anItem === @"Parent") ? 1 : 0; +} + +- (id)outlineView:(CPOutlineView)anOutlineView objectValueForTableColumn:(CPTableColumn)aColumn byItem:(id)anItem +{ + return anItem; +} + +@end + +@implementation CPViewDecodedBehaviorTest : OJTestCase +{ + CPView container; + _CPDecodedTarget target; +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + container = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 300.0)]; + target = [[_CPDecodedTarget alloc] initWithFrame:CGRectMakeZero()]; + + [container addSubview:target]; +} + +- (id)archived:(id)anObject +{ + return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:anObject]]; +} + +/* + Connects a control to the target, archives the container, and returns the decoded + control. The decoded target is its action's receiver. +*/ +- (id)decodedConnectedControl:(CPControl)aControl +{ + [aControl setTarget:target]; + [aControl setAction:@selector(performAction:)]; + [container addSubview:aControl]; + + return [[self archived:container] subviews][1]; +} + +// MARK: Connections + +- (void)testAControlKeepsItsTargetAndAction +{ + var decoded = [self decodedConnectedControl:[[CPButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 80.0, 24.0)]], + decodedTarget = [[decoded superview] subviews][0]; + + [self assert:decodedTarget equals:[decoded target]]; + [self assert:@selector(performAction:) equals:[decoded action]]; +} + +- (void)testADecodedButtonSendsItsAction +{ + var decoded = [self decodedConnectedControl:[[CPButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 80.0, 24.0)]]; + + [decoded performClick:nil]; + + [self assert:1 equals:[[decoded target] actionCount]]; + [self assert:decoded equals:[[decoded target] lastSender]]; +} + +- (void)testADecodedSliderSendsItsAction +{ + var decoded = [self decodedConnectedControl:[[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 80.0, 24.0)]]; + + [decoded sendAction:[decoded action] to:[decoded target]]; + + [self assert:1 equals:[[decoded target] actionCount]]; +} + +- (void)testADecodedTextFieldKeepsItsDelegate +{ + var field = [[CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 80.0, 24.0)]; + + [field setDelegate:target]; + [container addSubview:field]; + + var decoded = [[self archived:container] subviews][1]; + + [self assert:[[decoded superview] subviews][0] equals:[decoded delegate]]; +} + +- (void)testADecodedTabViewKeepsItsDelegate +{ + var tabView = [[CPTabView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + + [tabView setDelegate:target]; + [container addSubview:tabView]; + + var decoded = [[self archived:container] subviews][1]; + + [self assert:[[decoded superview] subviews][0] equals:[decoded delegate]]; +} + +- (void)testADecodedSplitViewKeepsItsDelegate +{ + var splitView = [[CPSplitView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + + [splitView setDelegate:target]; + [container addSubview:splitView]; + + var decoded = [[self archived:container] subviews][1]; + + [self assert:[[decoded superview] subviews][0] equals:[decoded delegate]]; +} + +// MARK: The view hierarchy + +- (void)testADecodedSubviewKeepsItsResponderChain +{ + var child = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [container addSubview:child]; + + var decoded = [self archived:container]; + + [self assert:decoded equals:[[decoded subviews][1] nextResponder]]; +} + +- (void)testADecodedViewAutoresizesItsSubviews +{ + var child = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + + [child setAutoresizingMask:CPViewWidthSizable]; + [container addSubview:child]; + + var decoded = [self archived:container]; + + [decoded setFrameSize:CGSizeMake(400.0, 300.0)]; + + [self assert:200.0 equals:CGRectGetWidth([[decoded subviews][1] frame])]; +} + +// MARK: Objects a class creates or observes + +- (void)testADecodedButtonBarFollowsAHiddenButton +{ + var buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 26.0)], + buttons = [[CPButtonBar plusButton], [CPButtonBar minusButton]]; + + [buttonBar setButtons:buttons]; + [buttonBar layoutSubviews]; + + var decoded = [self archived:buttonBar], + decodedButtons = [decoded buttons]; + + [decoded layoutSubviews]; + [_CPDisplayServer run]; + + var firstOrigin = CGRectGetMinX([decodedButtons[0] frame]); + + [decodedButtons[0] setHidden:YES]; + [_CPDisplayServer run]; + + [self assert:firstOrigin equals:CGRectGetMinX([decodedButtons[1] frame])]; +} + +- (void)testADecodedStepperStepsItsValue +{ + var stepper = [[CPStepper alloc] initWithFrame:CGRectMake(0.0, 0.0, 30.0, 25.0)]; + + [stepper setMinValue:1.0]; + [stepper setMaxValue:9.0]; + [stepper setDoubleValue:4.0]; + + var decoded = [self decodedConnectedControl:stepper]; + + [decoded performClickUp:nil]; + [self assert:5.0 equals:[decoded doubleValue]]; + + [decoded performClickDown:nil]; + [self assert:4.0 equals:[decoded doubleValue]]; + + [self assert:2 equals:[[decoded target] actionCount]]; +} + +- (void)testADecodedSearchFieldCancelsItsText +{ + var field = [[CPSearchField alloc] initWithFrame:CGRectMake(0.0, 0.0, 120.0, 30.0)]; + + [field setStringValue:@"Text"]; + + var decoded = [self archived:field]; + + [decoded cancelOperation:nil]; + + [self assert:@"" equals:[decoded stringValue]]; + [self assertTrue:[[decoded cancelButton] isHidden]]; +} + +- (void)testADecodedPopUpButtonAcceptsNewItems +{ + var button = [[CPPopUpButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 120.0, 24.0)]; + + [button addItemsWithTitles:[@"One", @"Two"]]; + [button selectItemAtIndex:1]; + + var decoded = [self archived:button]; + + [self assert:1 equals:[decoded indexOfSelectedItem]]; + [self assert:@"Two" equals:[decoded titleOfSelectedItem]]; + + [decoded addItemWithTitle:@"Three"]; + [decoded selectItemAtIndex:2]; + + [self assert:3 equals:[decoded numberOfItems]]; + [self assert:@"Three" equals:[decoded title]]; +} + +- (void)testADecodedSegmentedControlSelectsASegment +{ + var control = [[CPSegmentedControl alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 24.0)]; + + [control setSegmentCount:2]; + [control setLabel:@"One" forSegment:0]; + [control setLabel:@"Two" forSegment:1]; + [control setSelectedSegment:0]; + + var decoded = [self archived:control]; + + [self assert:0 equals:[decoded selectedSegment]]; + [self assert:@"Two" equals:[decoded labelForSegment:1]]; + + [decoded setSelectedSegment:1]; + + [self assert:1 equals:[decoded selectedSegment]]; +} + +- (void)testADecodedTabViewSwitchesItsContent +{ + var tabView = [[CPTabView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)]; + + [@"one", @"two"].forEach(function(anIdentifier) + { + var item = [[CPTabViewItem alloc] initWithIdentifier:anIdentifier]; + + [item setLabel:anIdentifier]; + [item setView:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)]]; + [tabView addTabViewItem:item]; + }); + + [tabView selectTabViewItemAtIndex:1]; + + var decoded = [self archived:tabView]; + + [self assert:@"two" equals:[[decoded selectedTabViewItem] identifier]]; + [self assertNotNull:[[[decoded selectedTabViewItem] view] superview]]; + + [decoded selectTabViewItemAtIndex:0]; + + [self assert:@"one" equals:[[decoded selectedTabViewItem] identifier]]; + [self assertNotNull:[[[decoded selectedTabViewItem] view] superview]]; +} + +- (void)testADecodedSplitViewMovesItsDivider +{ + var splitView = [[CPSplitView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 100.0)]; + + [splitView setVertical:YES]; + [splitView addSubview:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 95.0, 100.0)]]; + [splitView addSubview:[[CPView alloc] initWithFrame:CGRectMake(100.0, 0.0, 95.0, 100.0)]]; + + var decoded = [self archived:splitView]; + + [decoded setPosition:60.0 ofDividerAtIndex:0]; + + [self assert:60.0 equals:CGRectGetWidth([[decoded arrangedSubviews][0] frame])]; +} + +- (void)testADecodedScrollViewScrollsItsDocument +{ + var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + + [scrollView setDocumentView:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 300.0)]]; + + var decoded = [self archived:scrollView]; + + [[decoded documentView] scrollPoint:CGPointMake(0.0, 50.0)]; + + [self assert:50.0 equals:CGRectGetMinY([decoded documentVisibleRect])]; +} + +- (void)testADecodedBoxAcceptsANewContentView +{ + var box = [[CPBox alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 100.0)]; + + [box setContentView:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)]]; + + var decoded = [self archived:box], + newContentView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 60.0)]; + + [decoded setContentView:newContentView]; + + [self assert:newContentView equals:[decoded contentView]]; + [self assertNotNull:[newContentView superview]]; +} + +- (void)testADecodedAccordionKeepsACollapsedItem +{ + var accordion = [[CPAccordionView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)], + item = [[CPAccordionViewItem alloc] initWithIdentifier:@"item"]; + + [item setLabel:@"Item"]; + [item setView:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 50.0)]]; + [accordion addItem:item]; + [accordion collapseItemAtIndex:0]; + + var decoded = [self archived:accordion]; + + [self assertFalse:[[decoded expandedItemIndexes] containsIndex:0]]; + + [decoded toggleItemAtIndex:0]; + + [self assertTrue:[[decoded expandedItemIndexes] containsIndex:0]]; +} + +- (void)testADecodedStackViewAcceptsAnArrangedSubview +{ + var stackView = [[CPStackView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)]; + + [stackView addArrangedSubview:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)]]; + + var decoded = [self archived:stackView]; + + [decoded addArrangedSubview:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)]]; + + [self assert:2 equals:[[decoded arrangedSubviews] count]]; +} + +- (void)testADecodedTokenFieldEndsWithItsTokens +{ + var field = [[CPTokenField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 30.0)]; + + [field setObjectValue:[@"One", @"Two"]]; + + var decoded = [self archived:field]; + + [self assert:[@"One", @"Two"] equals:[decoded objectValue]]; + + [decoded setObjectValue:[@"Two"]]; + + [self assert:[@"Two"] equals:[decoded objectValue]]; +} + +- (void)testADecodedTableReadsItsDataSource +{ + var tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)]; + + [tableView addTableColumn:[[CPTableColumn alloc] initWithIdentifier:@"Column"]]; + [tableView setDataSource:[[_CPDecodedTableDataSource alloc] init]]; + + var decoded = [self archived:tableView]; + + [decoded reloadData]; + + [self assert:3 equals:[decoded numberOfRows]]; +} + +- (void)testADecodedOutlineReadsItsDataSource +{ + var outlineView = [[CPOutlineView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)], + column = [[CPTableColumn alloc] initWithIdentifier:@"Column"]; + + [outlineView addTableColumn:column]; + [outlineView setOutlineTableColumn:column]; + [outlineView setDataSource:[[_CPDecodedOutlineDataSource alloc] init]]; + + var decoded = [self archived:outlineView]; + + [decoded reloadData]; + + [self assert:1 equals:[decoded numberOfRows]]; + [self assert:@"Parent" equals:[decoded itemAtRow:0]]; + [self assert:@"Parent" equals:[decoded _objectValueForTableColumn:[decoded outlineTableColumn] row:0 useCache:NO]]; + + [decoded expandItem:@"Parent"]; + + [self assert:2 equals:[decoded numberOfRows]]; +} + +@end From 6ddcfe0d79a706f80fbac12a32ff2ce855a665a7 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Sat, 31 Oct 2026 22:18:28 -0600 Subject: [PATCH 10/15] AppKit: Protect archiving of non-view objects and add regression tests Ensure objects held and shared by views are correct by verifying they retain the properties applications read after archiving. * CPAppearance: Add the name accessor. * CPShadow: * Add CPCoding. * Add init with the default shadow values. * CPObjectArchivingTest: Verifies round trips of Foundation values, AppKit values, and objects that belong to views. * DropInArchiveTest: State the reasons the MainMenu cibs are not included. --- AppKit/CPAppearance.j | 5 + AppKit/CPShadow.j | 30 +++ Tests/AppKit/CPObjectArchivingTest.j | 356 +++++++++++++++++++++++++++ Tests/AppKit/DropInArchiveTest.j | 5 +- 4 files changed, 394 insertions(+), 2 deletions(-) create mode 100644 Tests/AppKit/CPObjectArchivingTest.j diff --git a/AppKit/CPAppearance.j b/AppKit/CPAppearance.j index d0dcc9ce0..208c429ce 100644 --- a/AppKit/CPAppearance.j +++ b/AppKit/CPAppearance.j @@ -125,6 +125,11 @@ CPThemeStateAppearanceVibrantDark = CPThemeState("appearance-vibrant-dark") // MARK: - // MARK: Implementation +- (CPString)name +{ + return _name; +} + - (BOOL)isEqual:(id)anObject { if (![anObject isKindOfClass:CPAppearance]) diff --git a/AppKit/CPShadow.j b/AppKit/CPShadow.j index 06656f2c6..6733d16fe 100644 --- a/AppKit/CPShadow.j +++ b/AppKit/CPShadow.j @@ -52,6 +52,14 @@ } /* @ignore */ +/*! + Initializes a shadow with no offset or blur, and a black color at one third opacity. +*/ +- (id)init +{ + return [self _initWithOffset:CGSizeMakeZero() blurRadius:0.0 color:[CPColor colorWithWhite:0.0 alpha:1.0 / 3.0]]; +} + - (id)_initWithOffset:(CGSize)anOffset blurRadius:(float)aBlurRadius color:(CPColor)aColor { self = [super init]; @@ -82,3 +90,25 @@ } @end + +var CPShadowOffsetKey = @"CPShadowOffsetKey", + CPShadowBlurRadiusKey = @"CPShadowBlurRadiusKey", + CPShadowColorKey = @"CPShadowColorKey"; + +@implementation CPShadow (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self _initWithOffset:[aCoder decodeSizeForKey:CPShadowOffsetKey] + blurRadius:[aCoder decodeFloatForKey:CPShadowBlurRadiusKey] + color:[aCoder decodeObjectForKey:CPShadowColorKey]]; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeSize:_offset forKey:CPShadowOffsetKey]; + [aCoder encodeFloat:_blurRadius forKey:CPShadowBlurRadiusKey]; + [aCoder encodeObject:_color forKey:CPShadowColorKey]; +} + +@end diff --git a/Tests/AppKit/CPObjectArchivingTest.j b/Tests/AppKit/CPObjectArchivingTest.j new file mode 100644 index 000000000..9eadf3a49 --- /dev/null +++ b/Tests/AppKit/CPObjectArchivingTest.j @@ -0,0 +1,356 @@ +/* + * CPObjectArchivingTest.j + * AppKit + * + * Created by David Richardson on 31/10/2026. + * Copyright David Richardson 2026. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +/* + Views hold and share objects that are not views, and those objects are archived + with them. An object that is archived and read back must keep the properties that + an application reads. DropInArchiveTest.j and CPViewDecodedBehaviorTest.j cover + the views. +*/ + +@implementation CPObjectArchivingTest : OJTestCase + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; +} + +- (id)archived:(id)anObject +{ + return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:anObject]]; +} + +// MARK: Foundation collections and values + +- (void)testAnArrayKeepsItsObjects +{ + [self assert:[@"One", 2, YES] equals:[self archived:[@"One", 2, YES]]]; +} + +- (void)testADictionaryKeepsItsEntries +{ + var dictionary = @{ @"one": @"first", @"two": 2 }; + + [self assert:dictionary equals:[self archived:dictionary]]; +} + +- (void)testASetKeepsItsObjects +{ + var set = [CPSet setWithArray:[@"One", @"Two"]]; + + [self assert:set equals:[self archived:set]]; +} + +- (void)testAnIndexSetKeepsItsIndexes +{ + var indexes = [CPMutableIndexSet indexSetWithIndexesInRange:CPMakeRange(2, 3)]; + + [indexes addIndex:9]; + + [self assert:indexes equals:[self archived:indexes]]; +} + +- (void)testAnIndexPathKeepsItsIndexes +{ + var indexPath = [CPIndexPath indexPathWithIndexes:[1, 2, 3] length:3]; + + [self assert:indexPath equals:[self archived:indexPath]]; +} + +- (void)testADateKeepsItsTime +{ + var date = [CPDate dateWithTimeIntervalSince1970:1000.0]; + + [self assert:1000.0 equals:[[self archived:date] timeIntervalSince1970]]; +} + +- (void)testNullStaysTheSingleton +{ + [self assert:[CPNull null] equals:[self archived:[CPNull null]]]; +} + +- (void)testADecimalNumberKeepsItsValue +{ + var number = [CPDecimalNumber decimalNumberWithString:@"12.5"]; + + [self assert:[number stringValue] equals:[[self archived:number] stringValue]]; +} + +- (void)testAnAttributedStringKeepsItsText +{ + var string = [[CPAttributedString alloc] initWithString:@"Text" attributes:@{ @"key": @"value" }]; + + [self assert:string equals:[self archived:string]]; +} + +- (void)testASortDescriptorKeepsItsDefinition +{ + var descriptor = [CPSortDescriptor sortDescriptorWithKey:@"name" ascending:NO selector:@selector(compare:)], + decoded = [self archived:descriptor]; + + [self assert:@"name" equals:[decoded key]]; + [self assertFalse:[decoded ascending]]; + [self assert:@selector(compare:) equals:[decoded selector]]; +} + +- (void)testACharacterSetKeepsItsMembers +{ + var decoded = [self archived:[CPCharacterSet characterSetWithCharactersInString:@"ab"]]; + + [self assertTrue:[decoded characterIsMember:@"a"]]; + [self assertFalse:[decoded characterIsMember:@"c"]]; +} + +- (void)testAnErrorKeepsItsDefinition +{ + var error = [CPError errorWithDomain:@"Domain" code:7 userInfo:@{ @"key": @"value" }], + decoded = [self archived:error]; + + [self assert:@"Domain" equals:[decoded domain]]; + [self assert:7 equals:[decoded code]]; + [self assert:@"value" equals:[[decoded userInfo] objectForKey:@"key"]]; +} + +- (void)testAnExceptionKeepsItsDefinition +{ + var exception = [CPException exceptionWithName:@"Name" reason:@"Reason" userInfo:nil], + decoded = [self archived:exception]; + + [self assert:@"Name" equals:[decoded name]]; + [self assert:@"Reason" equals:[decoded reason]]; +} + +- (void)testALocaleKeepsItsIdentifier +{ + var locale = [[CPLocale alloc] initWithLocaleIdentifier:@"fr_FR"]; + + [self assert:@"fr_FR" equals:[[self archived:locale] localeIdentifier]]; +} + +- (void)testANumberFormatterKeepsItsStyle +{ + var formatter = [[CPNumberFormatter alloc] init]; + + [formatter setNumberStyle:CPNumberFormatterDecimalStyle]; + + [self assert:CPNumberFormatterDecimalStyle equals:[[self archived:formatter] numberStyle]]; +} + +- (void)testADateFormatterKeepsItsFormat +{ + var formatter = [[CPDateFormatter alloc] init]; + + [formatter setDateFormat:@"yyyy-MM-dd"]; + + [self assert:@"yyyy-MM-dd" equals:[[self archived:formatter] dateFormat]]; +} + +- (void)testAComparisonPredicateStillEvaluates +{ + var decoded = [self archived:[CPPredicate predicateWithFormat:@"self BEGINSWITH 'a'"]]; + + [self assertTrue:[decoded evaluateWithObject:@"apple"]]; + [self assertFalse:[decoded evaluateWithObject:@"pear"]]; +} + +- (void)testACompoundPredicateStillEvaluates +{ + var decoded = [self archived:[CPPredicate predicateWithFormat:@"self BEGINSWITH 'a' AND self ENDSWITH 'e'"]]; + + [self assertTrue:[decoded evaluateWithObject:@"apple"]]; + [self assertFalse:[decoded evaluateWithObject:@"apricot"]]; +} + +// MARK: AppKit values + +- (void)testAColorKeepsItsComponents +{ + var color = [CPColor colorWithRed:0.25 green:0.5 blue:0.75 alpha:0.5]; + + [self assert:[color cssString] equals:[[self archived:color] cssString]]; +} + +- (void)testANamedFontKeepsItsDefinition +{ + var font = [CPFont boldFontWithName:@"Courier" size:21.0], + decoded = [self archived:font]; + + [self assert:[font cssString] equals:[decoded cssString]]; + [self assertTrue:[decoded isBold]]; +} + +- (void)testASystemFontStaysASystemFont +{ + var decoded = [self archived:[CPFont systemFontOfSize:15.0]]; + + [self assertTrue:[decoded isSystem]]; + [self assert:15.0 equals:[decoded size]]; +} + +- (void)testAnImageKeepsItsDefinition +{ + var image = [[CPImage alloc] initWithContentsOfFile:@"image.png" size:CGSizeMake(16.0, 32.0)], + decoded = [self archived:image]; + + [self assert:@"image.png" equals:[decoded filename]]; + [self assertTrue:CGSizeEqualToSize(CGSizeMake(16.0, 32.0), [decoded size])]; +} + +- (void)testAShadowKeepsItsDefinition +{ + var shadow = [[CPShadow alloc] init]; + + [shadow setShadowOffset:CGSizeMake(2.0, 3.0)]; + [shadow setShadowBlurRadius:4.0]; + [shadow setShadowColor:[CPColor redColor]]; + + var decoded = [self archived:shadow]; + + [self assertTrue:CGSizeEqualToSize(CGSizeMake(2.0, 3.0), [decoded shadowOffset])]; + [self assert:4.0 equals:[decoded shadowBlurRadius]]; + [self assert:[[CPColor redColor] cssString] equals:[[decoded shadowColor] cssString]]; +} + +- (void)testANewShadowKeepsItsDefaults +{ + var decoded = [self archived:[[CPShadow alloc] init]]; + + [self assertTrue:CGSizeEqualToSize(CGSizeMakeZero(), [decoded shadowOffset])]; + [self assert:0.0 equals:[decoded shadowBlurRadius]]; + [self assert:1.0 / 3.0 equals:[[decoded shadowColor] alphaComponent]]; +} + +- (void)testAParagraphStyleKeepsItsAlignment +{ + var style = [[CPMutableParagraphStyle alloc] init]; + + [style setAlignment:CPCenterTextAlignment]; + + [self assert:CPCenterTextAlignment equals:[[self archived:style] alignment]]; +} + +- (void)testAnAppearanceKeepsItsName +{ + var appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]; + + [self assert:CPAppearanceNameVibrantDark equals:[[self archived:appearance] name]]; +} + +// MARK: Objects that belong to views + +- (void)testAMenuKeepsItsItems +{ + var menu = [[CPMenu alloc] initWithTitle:@"Menu"], + item = [[CPMenuItem alloc] initWithTitle:@"Item" action:@selector(performAction:) keyEquivalent:@"i"], + submenu = [[CPMenu alloc] initWithTitle:@""]; + + [item setTag:7]; + [item setState:CPOnState]; + [item setKeyEquivalentModifierMask:CPShiftKeyMask]; + [menu addItem:item]; + [menu addItem:[CPMenuItem separatorItem]]; + [menu setSubmenu:submenu forItem:[menu addItemWithTitle:@"Parent" action:nil keyEquivalent:@""]]; + + var decoded = [self archived:menu], + decodedItem = [decoded itemAtIndex:0]; + + [self assert:@"Menu" equals:[decoded title]]; + [self assert:3 equals:[decoded numberOfItems]]; + [self assert:@"Item" equals:[decodedItem title]]; + [self assert:@selector(performAction:) equals:[decodedItem action]]; + [self assert:@"i" equals:[decodedItem keyEquivalent]]; + [self assert:CPShiftKeyMask equals:[decodedItem keyEquivalentModifierMask]]; + [self assert:7 equals:[decodedItem tag]]; + [self assert:CPOnState equals:[decodedItem state]]; + [self assert:decoded equals:[decodedItem menu]]; + [self assertTrue:[[decoded itemAtIndex:1] isSeparatorItem]]; + [self assert:@"Parent" equals:[[[decoded itemAtIndex:2] submenu] title]]; + [self assert:decoded equals:[[[decoded itemAtIndex:2] submenu] supermenu]]; +} + +- (void)testATableColumnKeepsItsDefinition +{ + var column = [[CPTableColumn alloc] initWithIdentifier:@"Column"]; + + [column setWidth:120.0]; + [column setMinWidth:50.0]; + [column setMaxWidth:300.0]; + [column setEditable:YES]; + [column setHidden:YES]; + [[column headerView] setStringValue:@"Title"]; + [column setSortDescriptorPrototype:[CPSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]; + + var decoded = [self archived:column]; + + [self assert:@"Column" equals:[decoded identifier]]; + [self assert:120.0 equals:[decoded width]]; + [self assert:50.0 equals:[decoded minWidth]]; + [self assert:300.0 equals:[decoded maxWidth]]; + [self assertTrue:[decoded isEditable]]; + [self assertTrue:[decoded isHidden]]; + [self assert:@"Title" equals:[[decoded headerView] stringValue]]; + [self assert:@"name" equals:[[decoded sortDescriptorPrototype] key]]; +} + +- (void)testATabViewItemKeepsItsDefinition +{ + var item = [[CPTabViewItem alloc] initWithIdentifier:@"identifier"]; + + [item setLabel:@"Label"]; + [item setView:[[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 10.0, 20.0)]]; + + var decoded = [self archived:item]; + + [self assert:@"identifier" equals:[decoded identifier]]; + [self assert:@"Label" equals:[decoded label]]; + [self assertNotNull:[decoded view]]; +} + +- (void)testAnObjectControllerKeepsItsContent +{ + var controller = [[CPObjectController alloc] initWithContent:@"Content"]; + + [controller setEditable:NO]; + + var decoded = [self archived:controller]; + + [self assert:@"Content" equals:[decoded content]]; + [self assertFalse:[decoded isEditable]]; +} + +- (void)testAnArrayControllerKeepsItsConfiguration +{ + var controller = [[CPArrayController alloc] initWithContent:[@"One", @"Two"]]; + + [controller setAvoidsEmptySelection:NO]; + [controller setPreservesSelection:NO]; + + var decoded = [self archived:controller]; + + [self assertFalse:[decoded avoidsEmptySelection]]; + [self assertFalse:[decoded preservesSelection]]; +} + +@end diff --git a/Tests/AppKit/DropInArchiveTest.j b/Tests/AppKit/DropInArchiveTest.j index 7eb893a8e..d7165f03a 100644 --- a/Tests/AppKit/DropInArchiveTest.j +++ b/Tests/AppKit/DropInArchiveTest.j @@ -162,8 +162,9 @@ var fs = require("fs"), Tests/Manual/SmartFoldersTest/Resources/PredicateEditor.cib and Tests/Manual/TextEditor/Resources/DocumentWindow.cib, as of commit 5db5adac0. Loading one must produce the same windows, views and frames as main. The MainMenu - cibs of those applications are not here, because they need application classes - to load. + cibs of those applications are not here. TextEditor's shows a menu bar, which needs + a platform window, and SmartFoldersTest's connects a data source that is defined by + the application. */ - (void)testExistingCibsProduceTheSameObjects { From 3494fddba4cff8cee573d2b4da20c3ea02c9c69f Mon Sep 17 00:00:00 2001 From: David Richardson Date: Mon, 2 Nov 2026 09:56:11 -0600 Subject: [PATCH 11/15] Foundation: Compute time zone abbreviations per date and fix seasonal tests Ensure time zone results are verified identically on any date and host, including zones in jurisdictions that have abolished seasonal offset changes, by asserting against fixed dates in January and July. Abbreviations are computed for the current date, as in Cocoa. * CPTimeZone: * Compute abbreviation for the current date. * Use the computed abbreviation in description. * CPTimeZoneTest: * Assert offsets, abbreviations and daylight saving state at fixed dates. * Replace host-dependent and season-dependent assertions. --- Foundation/CPTimeZone.j | 12 ++- Tests/Foundation/CPTimeZoneTest.j | 173 ++++++++++++------------------ 2 files changed, 77 insertions(+), 108 deletions(-) diff --git a/Foundation/CPTimeZone.j b/Foundation/CPTimeZone.j index f02b07fdb..962189c3c 100644 --- a/Foundation/CPTimeZone.j +++ b/Foundation/CPTimeZone.j @@ -320,7 +320,7 @@ function _systemTimeZoneFromRuntime() { CPData _data @accessors(property=data, readonly); CPInteger _secondsFromGMT @accessors(property=secondFromGMT, readonly); - CPString _abbreviation @accessors(property=abbreviation, readonly); + CPString _abbreviation; CPString _name @accessors(property=name, readonly); // Set only for zones created with +timeZoneForSecondsFromGMT:, which per @@ -738,6 +738,14 @@ function _systemTimeZoneFromRuntime() Returns nil if the date is nil @return the abbreviation */ +/*! + Returns the abbreviation for the current date, as abbreviationForDate: does. +*/ +- (CPString)abbreviation +{ + return [self abbreviationForDate:[CPDate date]]; +} + - (CPString)abbreviationForDate:(CPDate)date { if (!date) @@ -856,7 +864,7 @@ function _systemTimeZoneFromRuntime() */ - (CPString)description { - return [CPString stringWithFormat:@"%s (%s) offset %i", _name, _abbreviation, [self secondsFromGMT]]; + return [CPString stringWithFormat:@"%s (%s) offset %i", _name, [self abbreviation], [self secondsFromGMT]]; } diff --git a/Tests/Foundation/CPTimeZoneTest.j b/Tests/Foundation/CPTimeZoneTest.j index 04dbfac33..0d4207ffe 100644 --- a/Tests/Foundation/CPTimeZoneTest.j +++ b/Tests/Foundation/CPTimeZoneTest.j @@ -27,6 +27,8 @@ CPLocale _locale; CPData _data; CPDate _date; + CPDate _januaryDate; + CPDate _julyDate; } - (void)setUp @@ -34,6 +36,42 @@ _locale = [[CPLocale alloc] initWithLocaleIdentifier:@"en_US"]; _data = [CPData dataWithRawString:@"Data with string"]; _date = [[CPDate alloc] initWithString:@"2011-10-05 16:34:38 +0900"]; + + /* + The rules of a zone decide its offset and abbreviation on a given date. Fixed + dates in January and July give the same result on any day and on any host. + A zone with daylight saving time differs between them, and a zone without it + has the same offset on both. + */ + _januaryDate = [[CPDate alloc] initWithString:@"2026-01-15 12:00:00 +0000"]; + _julyDate = [[CPDate alloc] initWithString:@"2026-07-15 12:00:00 +0000"]; +} + +- (void)assertPacificTimeZone:(CPTimeZone)timeZone +{ + [self assert:@"America/Los_Angeles" equals:[timeZone name]]; + + [self assert:@"PST" equals:[timeZone abbreviationForDate:_januaryDate]]; + [self assert:(-480 * 60) equals:[timeZone secondsFromGMTForDate:_januaryDate]]; + [self assertFalse:[timeZone isDaylightSavingTimeForDate:_januaryDate]]; + + [self assert:@"PDT" equals:[timeZone abbreviationForDate:_julyDate]]; + [self assert:(-420 * 60) equals:[timeZone secondsFromGMTForDate:_julyDate]]; + [self assertTrue:[timeZone isDaylightSavingTimeForDate:_julyDate]]; + + // The abbreviation and the offset are both those of the current date. + var now = [CPDate date]; + + [self assert:[timeZone abbreviationForDate:now] equals:[timeZone abbreviation]]; + [self assert:[timeZone secondsFromGMTForDate:now] equals:[timeZone secondsFromGMT]]; + [self assert:@"America/Los_Angeles (" + [timeZone abbreviation] + ") offset " + [timeZone secondsFromGMT] equals:[timeZone description]]; + + [self assert:@"Pacific Standard Time" equals:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale]]; + [self assert:@"PST" equals:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale]]; + [self assert:@"Pacific Daylight Time" equals:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale]]; + [self assert:@"PDT" equals:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale]]; + [self assert:@"Pacific Time" equals:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale]]; + [self assert:@"PT" equals:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale]]; } - (void)tearDown @@ -43,17 +81,8 @@ - (void)testTimeZoneWithAbbreviation { - var timeZone = [CPTimeZone timeZoneWithAbbreviation:@"PDT"]; - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; + [self assertPacificTimeZone:[CPTimeZone timeZoneWithAbbreviation:@"PDT"]]; + [self assertPacificTimeZone:[CPTimeZone timeZoneWithAbbreviation:@"PST"]]; } - (void)testTimeZoneWithWrongAbbreviation @@ -64,26 +93,7 @@ - (void)testTimeZoneWithName { - var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles"]; - - // The current implementation can return daylight saving time or standard time depending on the current date - if ([timeZone abbreviation] === @"PDT") { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; - } else { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PST"]; - [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; - } - [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; + [self assertPacificTimeZone:[CPTimeZone timeZoneWithName:@"America/Los_Angeles"]]; } - (void)testTimeZoneWithWrongName @@ -109,24 +119,8 @@ { var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles" data:_data]; - if ([timeZone abbreviation] === @"PDT") { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; - } else { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PST"]; - [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; - } - [self assert:[timeZone data] equals:_data]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; + [self assertPacificTimeZone:timeZone]; + [self assert:_data equals:[timeZone data]]; } - (void)testTimeZoneWithWrongNameWithData @@ -179,25 +173,7 @@ - (void)testInitTimeZoneWithName { - var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; - - if ([timeZone abbreviation] === @"PDT") { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; - } else { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PST"]; - [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; - } - [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; + [self assertPacificTimeZone:[[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]]; } - (void)testInitTimeZoneWithWrongName @@ -223,24 +199,8 @@ { var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles" data:_data]; - if ([timeZone abbreviation] === @"PDT") { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; - } else { - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PST"]; - [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; - } - [self assert:[timeZone data] equals:_data]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; - [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; + [self assertPacificTimeZone:timeZone]; + [self assert:_data equals:[timeZone data]]; } - (void)testInitTimeZoneWithWrongNameWithData @@ -262,14 +222,17 @@ } } +/* + The local time zone depends on the host, and many zones have no curated + abbreviation, so a named zone is used. +*/ - (void)testAbbreviationWithDate { - var timeZone = [CPTimeZone localTimeZone], - abbreviation = [timeZone abbreviationForDate:_date]; + var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles"]; - [self assert:(abbreviation !== nil) equals:YES]; - var knownAbbreviations = [CPTimeZone abbreviationDictionary]; - [self assert:[knownAbbreviations containsKey:abbreviation] equals:YES]; + [self assert:@"PDT" equals:[timeZone abbreviationForDate:_date]]; + [self assert:@"PST" equals:[timeZone abbreviationForDate:_januaryDate]]; + [self assertNotNull:[[CPTimeZone localTimeZone] abbreviationForDate:_date]]; } - (void)testAbbreviationWithNilDate @@ -301,22 +264,17 @@ { var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; - if ([timeZone abbreviation] === @"PDT") { - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - } else { - [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; - } + [self assert:(-480 * 60) equals:[timeZone secondsFromGMTForDate:_januaryDate]]; + [self assert:(-420 * 60) equals:[timeZone secondsFromGMTForDate:_julyDate]]; + [self assert:[timeZone secondsFromGMTForDate:[CPDate date]] equals:[timeZone secondsFromGMT]]; } - (void)testDescription { - var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"], + expected = [timeZone secondsFromGMT] === -480 * 60 ? @"America/Los_Angeles (PST) offset -28800" : @"America/Los_Angeles (PDT) offset -25200"; - if ([timeZone abbreviation] === @"PDT") { - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; - } else { - [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; - } + [self assert:expected equals:[timeZone description]]; } - (void)testLocalizedName @@ -401,11 +359,14 @@ - (void)testMSKCorrectCurrentValue { - // MSD/MSK resolve to Europe/Moscow. - // Russia abolished DST in 2014, so there is no distinct summer offset. - // The current permanent offset is +03:00 (10800 seconds). + // MSD and MSK resolve to Europe/Moscow, which has no daylight saving time. var timeZone = [CPTimeZone timeZoneWithAbbreviation:@"MSD"]; - [self assert:[timeZone secondsFromGMT] equals:(180 * 60)]; + + [self assert:@"Europe/Moscow" equals:[timeZone name]]; + [self assert:(180 * 60) equals:[timeZone secondsFromGMTForDate:_januaryDate]]; + [self assert:(180 * 60) equals:[timeZone secondsFromGMTForDate:_julyDate]]; + [self assertFalse:[timeZone isDaylightSavingTimeForDate:_julyDate]]; + [self assert:[timeZone secondsFromGMTForDate:[CPDate date]] equals:[timeZone secondsFromGMT]]; } - (void)testKnownTimeZoneNamesUsesIntlWhenAvailable From bb3c81bd6b8f141f501bc301dc79a5b08aeef22f Mon Sep 17 00:00:00 2001 From: David Richardson Date: Mon, 2 Nov 2026 10:40:08 -0600 Subject: [PATCH 12/15] jake clobber target: include framework-specific Build directories Accommodate Build directories created by capp-build at framework level. These would otherwise interfere with the Node compiler and orchestration's operation. * AppKit/Jakefile: Add Build to the clobber target. * Foundation/Jakefile: Add Build to the clobber target. --- AppKit/Jakefile | 1 + Foundation/Jakefile | 1 + 2 files changed, 2 insertions(+) diff --git a/AppKit/Jakefile b/AppKit/Jakefile index 9836e39bf..fb989a80e 100644 --- a/AppKit/Jakefile +++ b/AppKit/Jakefile @@ -63,3 +63,4 @@ task ("Theme", [$BUILD_CJS_CAPPUCCINO_APPKIT], function() task ("build", ["AppKit", $BUILD_CJS_CAPPUCCINO_APPKIT, "Theme"]); CLOBBER.include($BUILD_CJS_CAPPUCCINO_APPKIT); +CLOBBER.include(path.join(__dirname, "Build")); diff --git a/Foundation/Jakefile b/Foundation/Jakefile index 19ed1ed2c..097212738 100644 --- a/Foundation/Jakefile +++ b/Foundation/Jakefile @@ -70,3 +70,4 @@ filedir ($BUILD_CJS_FOUNDATION, ["Foundation"], function() task ("build", ["Foundation", $BUILD_CJS_FOUNDATION]); CLOBBER.include($BUILD_CJS_FOUNDATION); +CLOBBER.include(path.join(__dirname, "Build")); From 1e979ea2fb46f376c852764ab7468af51d894b2b Mon Sep 17 00:00:00 2001 From: David Richardson Date: Mon, 2 Nov 2026 10:56:05 -0600 Subject: [PATCH 13/15] Improve Tests: Isolate global scroller style in CPScrollViewTest * CPScrollViewTest: Save and restore global scroller style in setUp and tearDown. --- Tests/AppKit/CPScrollViewTest.j | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/AppKit/CPScrollViewTest.j b/Tests/AppKit/CPScrollViewTest.j index f2d6ad3d0..f1a193dee 100644 --- a/Tests/AppKit/CPScrollViewTest.j +++ b/Tests/AppKit/CPScrollViewTest.j @@ -5,12 +5,24 @@ @implementation CPScrollViewTest : OJTestCase { + CPScrollerStyle globalScrollerStyle; } - (void)setUp { // This will init the global var CPApp which are used internally in the AppKit [[CPApplication alloc] init]; + + globalScrollerStyle = [CPScrollView globalScrollerStyle]; +} + +/* + The global scroller style applies to every scroll view, including those in later + test suites, so a test that changes it must not leave it changed. +*/ +- (void)tearDown +{ + [CPScrollView setGlobalScrollerStyle:globalScrollerStyle]; } /*! From aa4652921a8fa0e666e0e6336b6f633ad9fbe059 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Mon, 2 Nov 2026 11:15:27 -0600 Subject: [PATCH 14/15] CPPredicate improvement: Parse custom selector comparisons in predicate format strings Brings format string parsing into line with canonical NSPredicate. * _CPPredicate: Accept a one-argument selector as a comparison operator. * CPPredicateTest: Verify parsing and evaluation of custom selector comparisons. --- Foundation/CPPredicate/_CPPredicate.j | 33 ++++++++++++++++++++++++- Tests/Foundation/CPPredicateTest.j | 35 +++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Foundation/CPPredicate/_CPPredicate.j b/Foundation/CPPredicate/_CPPredicate.j index cf1628990..bd47c2844 100644 --- a/Foundation/CPPredicate/_CPPredicate.j +++ b/Foundation/CPPredicate/_CPPredicate.j @@ -526,7 +526,21 @@ type = CPBetweenPredicateOperatorType; } else - CPRaiseParseError(self, @"comparison predicate"); + { + /* + A selector such as isKindOfClass: is a custom comparison operator. As in + Cocoa, a custom selector comparison has no modifier. + */ + var selector = [self parseCustomSelector]; + + if (!selector || modifier !== CPDirectPredicateModifier) + CPRaiseParseError(self, @"comparison predicate"); + + right = [self parseExpression]; + p = [CPComparisonPredicate predicateWithLeftExpression:left rightExpression:right customSelector:selector]; + + return negate ? [CPCompoundPredicate notPredicateWithSubpredicate:p] : p; + } if ([self scanString:@"[cd]" intoString:NULL]) { @@ -552,6 +566,23 @@ return negate ? [CPCompoundPredicate notPredicateWithSubpredicate:p]:p; } +/* + Scans a one-argument selector, such as isKindOfClass:, and returns it. Returns nil + and leaves the scan location unchanged when there is none. +*/ +- (SEL)parseCustomSelector +{ + var location = [self scanLocation], + name = [self scanCharactersFromSet:[CPCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"]]; + + if (name && [self scanString:@":" intoString:NULL]) + return CPSelectorFromString(name + ":"); + + [self setScanLocation:location]; + + return nil; +} + - (CPExpression)parseExpression { return [self parseBinaryExpression]; diff --git a/Tests/Foundation/CPPredicateTest.j b/Tests/Foundation/CPPredicateTest.j index f57868a9d..be0688f23 100644 --- a/Tests/Foundation/CPPredicateTest.j +++ b/Tests/Foundation/CPPredicateTest.j @@ -434,6 +434,41 @@ [self assertTrue:[predicate evaluateWithObject:dict] message:"Predicate " + predicate + " should evaluate to TRUE"]; } +- (void)testCustomSelectorPredicateParsing +{ + var predicate = [CPPredicate predicateWithFormat:@"SELF isKindOfClass: %@", [CPArray class]]; + + [self assert:CPCustomSelectorPredicateOperatorType equals:[predicate predicateOperatorType]]; + [self assert:@selector(isKindOfClass:) equals:[predicate customSelector]]; + [self assertTrue:[predicate evaluateWithObject:[CPArray array]]]; + [self assertFalse:[predicate evaluateWithObject:@{}]]; + + var negated = [CPPredicate predicateWithFormat:@"NOT SELF isKindOfClass: %@", [CPArray class]]; + + [self assertFalse:[negated evaluateWithObject:[CPArray array]]]; + [self assertTrue:[negated evaluateWithObject:@{}]]; + + // A parse failure is reported through CPLogConsole, which is captured here. + var logConsole = CPLogConsole, + messages = []; + + CPLogConsole = function(aString) + { + messages.push(aString); + }; + + try + { + [self assertNull:[CPPredicate predicateWithFormat:@"ANY SELF isKindOfClass: %@", [CPArray class]]]; + } + finally + { + CPLogConsole = logConsole; + } + + [self assertTrue:messages.length > 0]; +} + - (void)testExpressionAndPredicateIsEqual { var cexp1 = [CPExpression expressionForConstantValue:2], From a4b3d76da1b92d4704a624db6fedd43e9d882bd2 Mon Sep 17 00:00:00 2001 From: David Richardson Date: Mon, 2 Nov 2026 17:30:09 -0600 Subject: [PATCH 15/15] Tests: Record dates by instant in the drop-in snapshot * DropInSnapshot.j: - Describe a CPDate by its UTC instant instead of its class name. - Record the string value of a control holding a date by the date's instant, since the browser formats it in the local time zone. * DropInArchives.json: Update the CPDatePicker entry to the instant it archives. * DropInArchiveTest.j: State that the test must pass in every time zone, and how to check it in UTC. --- Tests/AppKit/DropInArchiveTest.j | 8 ++++++++ Tests/AppKit/DropInSnapshot.j | 16 ++++++++++++++++ Tests/AppKit/Resources/DropInArchives.json | 4 ++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Tests/AppKit/DropInArchiveTest.j b/Tests/AppKit/DropInArchiveTest.j index d7165f03a..e1132369a 100644 --- a/Tests/AppKit/DropInArchiveTest.j +++ b/Tests/AppKit/DropInArchiveTest.j @@ -125,6 +125,14 @@ var fs = require("fs"), /* An archive written by main must restore the view it was written from. + + The descriptions compared must be the same on every machine. A date, and the + string value of a control that holds one, are recorded by the date's instant in + UTC, because their text is in the local time zone (DropInSnapshot.j). GitHub's + continuous integration runs this test in UTC, so run it in UTC as well as in the + local time zone before committing a change: + + TZ=UTC npx jake test */ - (void)testExistingArchivesRestoreTheOriginalView { diff --git a/Tests/AppKit/DropInSnapshot.j b/Tests/AppKit/DropInSnapshot.j index 1247781b9..f097190a0 100644 --- a/Tests/AppKit/DropInSnapshot.j +++ b/Tests/AppKit/DropInSnapshot.j @@ -165,6 +165,13 @@ function DropInDescribeValue(aValue) if (aValue.isa) { + /* + A date is recorded by its instant in UTC. Its description is in the time zone + of the machine that runs the test, so it differs between machines. + */ + if ([aValue isKindOfClass:[CPDate class]]) + return "CPDate:" + (isNaN(aValue.getTime()) ? "invalid" : aValue.toISOString()); + if ([aValue isKindOfClass:[CPColor class]]) return "CPColor:" + [aValue cssString]; @@ -286,6 +293,15 @@ function DropInViewTreeState(aView) var value = [aView performSelector:selector]; + /* + A control that holds a date gives its string value in the time zone of the + machine that runs the test, because the browser formats it, not Cappuccino. It + is recorded by the date's instant instead, so that every machine records the + same snapshot. + */ + if (aGetter === @"stringValue" && [aView respondsToSelector:@selector(objectValue)] && [[aView objectValue] isKindOfClass:[CPDate class]]) + value = [aView objectValue]; + state[aGetter] = DropInDescribeValue(DropInBooleanGetters.indexOf(aGetter) !== -1 ? !!value : value); }); diff --git a/Tests/AppKit/Resources/DropInArchives.json b/Tests/AppKit/Resources/DropInArchives.json index 3875862d4..8c6fa8389 100644 --- a/Tests/AppKit/Resources/DropInArchives.json +++ b/Tests/AppKit/Resources/DropInArchives.json @@ -755,8 +755,8 @@ "lineBreakMode": "2", "verticalAlignment": "1", "doubleValue": "0", - "objectValue": "CPDate", - "stringValue": "Sat Oct 31 2026 06:00:00 GMT-0600 (Mountain Daylight Time)", + "objectValue": "CPDate:2026-10-31T12:00:00.000Z", + "stringValue": "CPDate:2026-10-31T12:00:00.000Z", "tag": "-1" }, "subviews": [