[
  {
    "path": ".github/workflows/swift.yml",
    "content": "# This workflow will build a Swift project\n# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift\n\nname: Swift\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n\njobs:\n  macos_build_test:\n    name: Build/test on macOS\n    runs-on: macos-latest\n    steps:\n    - uses: actions/checkout@v4\n    - name: Build\n      run: swift build -v\n    - name: Run tests\n      run: swift test -v\n\n  ios_tests:\n    name: Build/test on iOS\n    runs-on: macos-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Run tests on iOS\n        run: xcodebuild -scheme DSFSparkline test -destination \"platform=iOS Simulator,name=iPhone SE (3rd generation),OS=latest\"\n"
  },
  {
    "path": ".gitignore",
    "content": "Demos/Demos.xcodeproj/project.xcworkspace/xcshareddata\nDemos/Demos.xcodeproj/project.xcworkspace/xcuserdata\nDemos/Demos.xcworkspace/xcshareddata\nPodfile.lock\nDemos/Demos.xcodeproj/xcshareddata\nDemos/Pods\nxcschememanagement.plist\nDemos/Demos.xcworkspace/xcuserdata\n.swiftpm/xcode/package.xcworkspace/xcuserdata\n.swiftpm/xcode/xcuserdata\nDemos/Demos.xcodeproj/xcuserdata\nDemos/Documentation Project/Documentation Project.xcodeproj/xcuserdata\nDemos/Documentation Project/Documentation Project.xcodeproj/project.xcworkspace/xcuserdata\nDemos/Samples/Demos.xcworkspace/xcuserdata\nDemos/Sparkline Demos/Sparkline Demos.xcodeproj/project.xcworkspace/xcuserdata/dford.xcuserdatad/UserInterfaceState.xcuserstate\nDemos/Sparkline Demos/Sparkline Demos.xcodeproj/xcuserdata/dford.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist\nDemos/Sparkline Demos/Sparkline Demos.xcodeproj/xcuserdata\nDemos/Sparkline Demos/Sparkline Demos.xcodeproj/project.xcworkspace/xcuserdata\nDemos/Playground/Sparklines Playground.xcworkspace/xcuserdata\nDemos/Playground/Sparklines Playground.playground/playground.xcworkspace/xcuserdata\nDemos/Playground/Sparklines Playground.xcworkspace/xcshareddata\n.build\nDemos/Samples/Demos.xcodeproj/project.xcworkspace/xcuserdata\nDemos/Simple Wiper Gauge/Simple Wiper Gauge.xcodeproj/xcuserdata\nIDEWorkspaceChecks.plist\nDemos/Simple Wiper Gauge/Simple Wiper Gauge.xcodeproj/project.xcworkspace/xcuserdata\n"
  },
  {
    "path": ".swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": ".swiftpm/xcode/xcshareddata/xcschemes/DSFSparkline.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"DSFSparkline\"\n               BuildableName = \"DSFSparkline\"\n               BlueprintName = \"DSFSparkline\"\n               ReferencedContainer = \"container:\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"DSFSparklineTests\"\n               BuildableName = \"DSFSparklineTests\"\n               BlueprintName = \"DSFSparklineTests\"\n               ReferencedContainer = \"container:\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"DSFSparklineTests\"\n               BuildableName = \"DSFSparklineTests\"\n               BlueprintName = \"DSFSparklineTests\"\n               ReferencedContainer = \"container:\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"DSFSparkline\"\n            BuildableName = \"DSFSparkline\"\n            BlueprintName = \"DSFSparkline\"\n            ReferencedContainer = \"container:\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Documentation project\n//\n//  Created by Darren Ford on 14/2/21.\n//\n\nimport Cocoa\n\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n\t\n\n\n\tfunc applicationDidFinishLaunching(_ aNotification: Notification) {\n\t\t// Insert code here to initialize your application\n\t}\n\n\tfunc applicationWillTerminate(_ aNotification: Notification) {\n\t\t// Insert code here to tear down your application\n\t}\n\n\n}\n\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"22505\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"22505\"/>\n        <capability name=\"System colors introduced in macOS 10.14\" minToolsVersion=\"10.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"Documentation project\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Documentation project\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About Documentation project\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide Documentation project\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit Documentation project\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"Documentation project Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Documentation_Project\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Sparkline Styles\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <toolbar key=\"toolbar\" implicitIdentifier=\"23AF9603-C832-4FE3-A81D-B206A5BFC7D4\" autosavesConfiguration=\"NO\" displayMode=\"iconAndLabel\" sizeMode=\"regular\" id=\"lko-rv-i99\">\n                            <allowedToolbarItems>\n                                <toolbarItem implicitItemIdentifier=\"1B4215A3-F7A3-4B6E-B583-23388B47B01F\" label=\"Generate\" paletteLabel=\"Generate\" tag=\"-1\" image=\"NSFlowViewTemplate\" sizingBehavior=\"auto\" autovalidates=\"NO\" id=\"gvX-FX-l92\" userLabel=\"Generate\">\n                                    <connections>\n                                        <action selector=\"generate:\" target=\"Oky-zY-oP4\" id=\"WUv-hc-T9T\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarSpaceItem\" id=\"HhV-To-ah9\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarFlexibleSpaceItem\" id=\"UEo-ky-M9k\"/>\n                            </allowedToolbarItems>\n                            <defaultToolbarItems>\n                                <toolbarItem reference=\"UEo-ky-M9k\"/>\n                                <toolbarItem reference=\"gvX-FX-l92\"/>\n                            </defaultToolbarItems>\n                        </toolbar>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"98r-iN-zZc\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"261\" y=\"334\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModule=\"Documentation_Project\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"867\" height=\"561\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <scrollView borderType=\"none\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kty-ak-QC3\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"867\" height=\"561\"/>\n                                <clipView key=\"contentView\" ambiguous=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"do4-xR-lo2\" customClass=\"CenteringClipView\" customModule=\"Documentation_Project\" customModuleProvider=\"target\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"852\" height=\"546\"/>\n                                    <subviews>\n                                        <view ambiguous=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7UI-6Z-z5D\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"856\" height=\"486\"/>\n                                            <subviews>\n                                                <gridView xPlacement=\"leading\" yPlacement=\"bottom\" rowAlignment=\"none\" rowSpacing=\"16\" columnSpacing=\"16\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hOh-4e-Vtx\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"20\" width=\"816\" height=\"1202\"/>\n                                                    <rows>\n                                                        <gridRow height=\"64\" id=\"47u-jo-OYT\"/>\n                                                        <gridRow height=\"64\" id=\"rf1-Sg-8OA\"/>\n                                                        <gridRow height=\"64\" id=\"5sQ-Aa-yfE\"/>\n                                                        <gridRow id=\"H3e-Ol-bBd\"/>\n                                                        <gridRow id=\"kkS-K4-DXg\"/>\n                                                        <gridRow id=\"S0C-Pu-lmw\"/>\n                                                        <gridRow id=\"HB5-mQ-V2B\"/>\n                                                        <gridRow id=\"luz-is-ypo\"/>\n                                                        <gridRow id=\"utc-Nl-zmD\"/>\n                                                        <gridRow id=\"6oS-Fm-DQZ\"/>\n                                                        <gridRow id=\"hsD-F4-k8U\"/>\n                                                        <gridRow id=\"r5p-Hs-XDA\"/>\n                                                        <gridRow id=\"gw1-yq-e3j\"/>\n                                                        <gridRow id=\"7WA-8A-T7M\"/>\n                                                        <gridRow id=\"JFM-k5-Fm8\"/>\n                                                    </rows>\n                                                    <columns>\n                                                        <gridColumn width=\"400\" id=\"Fgv-Q3-Ekz\"/>\n                                                        <gridColumn width=\"400\" id=\"Wsh-KX-sd2\"/>\n                                                    </columns>\n                                                    <gridCells>\n                                                        <gridCell row=\"47u-jo-OYT\" column=\"Fgv-Q3-Ekz\" id=\"fBp-FV-8td\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"P1e-zq-3Kb\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"1138\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"PeM-5L-g65\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"cmV-xb-fqd\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                        <real key=\"value\" value=\"2\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemYellowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"47u-jo-OYT\" column=\"Wsh-KX-sd2\" id=\"paB-Kc-fn9\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lwo-B5-fXw\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"1138\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"AmA-sQ-cTd\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"k5B-GP-KV6\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                                        <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"unemphasizedSelectedTextBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"rf1-Sg-8OA\" column=\"Fgv-Q3-Ekz\" id=\"WZQ-gH-xjR\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9Uq-bZ-Qih\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"1058\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"CAC-zl-i43\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"I7X-h3-4It\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                        <real key=\"value\" value=\"2\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"rf1-Sg-8OA\" column=\"Wsh-KX-sd2\" id=\"guE-UA-jgS\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aCQ-sL-A3S\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"1058\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"Z6T-Sr-UR1\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"niz-rm-4pc\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                                        <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"linkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"2,2\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"5sQ-Aa-yfE\" column=\"Fgv-Q3-Ekz\" id=\"Pq1-kd-r9g\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"O21-tc-rhl\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"978\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"O3G-bL-oZv\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"SvM-kG-FwN\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemTealColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                                        <real key=\"value\" value=\"3\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                        <real key=\"value\" value=\"1\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"5sQ-Aa-yfE\" column=\"Wsh-KX-sd2\" id=\"a5N-JY-mYJ\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fJm-or-Kg8\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"978\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"SUb-RU-Pfj\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"VVP-5w-JVc\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemBlueColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                                        <real key=\"value\" value=\"6\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"H3e-Ol-bBd\" column=\"Fgv-Q3-Ekz\" id=\"rf2-AY-ih3\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"43s-kw-e5c\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"898\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"wCV-42-WtN\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"wZy-pG-uWG\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemOrangeColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                                        <real key=\"value\" value=\"8\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"H3e-Ol-bBd\" column=\"Wsh-KX-sd2\" id=\"QeP-6M-gU3\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2QD-LI-Nfa\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"898\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"4Xb-LW-sk3\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"kgg-2T-eNU\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemOrangeColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                                        <real key=\"value\" value=\"8\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"kkS-K4-DXg\" column=\"Fgv-Q3-Ekz\" id=\"dRo-n6-uEO\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"i6C-86-GhI\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"818\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"KWz-06-o4D\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"n8Y-Xv-w4H\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"kkS-K4-DXg\" column=\"Wsh-KX-sd2\" id=\"Hbx-jo-sRD\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RNH-ZJ-Tq5\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"818\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"79F-vE-19C\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"ARW-OU-fq3\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemTealColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                                        <color key=\"value\" name=\"systemOrangeColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"S0C-Pu-lmw\" column=\"Fgv-Q3-Ekz\" id=\"dMp-6n-HZH\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"umI-Ph-yaN\" customClass=\"DSFSparklineStackLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"738\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"VbZ-wX-ctJ\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"uLo-0U-xH8\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"linkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"NO\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"S0C-Pu-lmw\" column=\"Wsh-KX-sd2\" id=\"OPb-9q-brt\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"UO4-nH-tLy\" customClass=\"DSFSparklineStackLineGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"738\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"1Ka-V0-teG\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"N4E-sn-5XV\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemGrayColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                                        <color key=\"value\" name=\"selectedControlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"HB5-mQ-V2B\" column=\"Fgv-Q3-Ekz\" id=\"Jha-X7-k9q\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SEq-8N-hcb\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"658\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"1E2-oL-g5b\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"cEQ-iv-2P5\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"HB5-mQ-V2B\" column=\"Wsh-KX-sd2\" id=\"CfV-5c-n4Z\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"G7g-fC-Oe0\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"658\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"9O7-rm-mHW\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"SFi-bH-u15\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                        <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                                        <color key=\"value\" red=\"1\" green=\"0.27058823529411763\" blue=\"0.22745098039215686\" alpha=\"0.20686758030726257\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"upsideDown\" value=\"YES\"/>\n                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                                        <integer key=\"value\" value=\"8\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"luz-is-ypo\" column=\"Fgv-Q3-Ekz\" id=\"moa-qM-lWG\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lqw-wT-484\" customClass=\"DSFSparklineWinLossGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"578\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"bHl-GZ-huh\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"jTA-am-ERC\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"luz-is-ypo\" column=\"Wsh-KX-sd2\" id=\"jdF-Kd-tgU\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Wfv-p8-aS4\" customClass=\"DSFSparklineWinLossGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"578\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"26K-LL-4cx\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"7dQ-9H-bCq\"/>\n                                                                </constraints>\n                                                                <userDefinedRuntimeAttributes>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"tieColor\">\n                                                                        <color key=\"value\" red=\"1\" green=\"0.57810515169999999\" blue=\"0.0\" alpha=\"0.32188100122206703\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"winColor\">\n                                                                        <color key=\"value\" red=\"0.0044808890670000002\" green=\"0.030145617199999999\" blue=\"0.34826511139999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lossColor\">\n                                                                        <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </userDefinedRuntimeAttribute>\n                                                                </userDefinedRuntimeAttributes>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"utc-Nl-zmD\" column=\"Fgv-Q3-Ekz\" id=\"V9N-iI-Ii8\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Qh3-wL-K7r\" customClass=\"DSFSparklineTabletGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"498\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"KpC-kg-bkX\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"lHG-nv-eiV\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"utc-Nl-zmD\" column=\"Wsh-KX-sd2\" id=\"6nP-TW-gBi\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gi0-4d-DPA\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"498\" width=\"400\" height=\"64\"/>\n                                                                <subviews>\n                                                                    <stackView distribution=\"equalSpacing\" orientation=\"horizontal\" alignment=\"centerY\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"e41-yn-7PI\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"400\" height=\"64\"/>\n                                                                        <subviews>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5tQ-mY-7Fh\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"20\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"edO-sf-Zlx\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"5tQ-mY-7Fh\" secondAttribute=\"height\" id=\"u6c-9F-8hx\"/>\n                                                                                </constraints>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GNz-4m-0t3\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"66\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"GNz-4m-0t3\" secondAttribute=\"height\" id=\"4no-ve-TE7\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"GNz-4m-0t3\" secondAttribute=\"height\" id=\"OXO-Kg-Adn\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"ioy-iM-Whu\"/>\n                                                                                </constraints>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8nY-fj-FYr\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"113\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"8nY-fj-FYr\" secondAttribute=\"height\" id=\"k3U-YU-Ln6\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"8nY-fj-FYr\" secondAttribute=\"height\" id=\"m0g-1c-iDe\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"quK-UF-1wf\"/>\n                                                                                </constraints>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Pvz-x2-3SE\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"159\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"4Hy-aD-63o\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"Pvz-x2-3SE\" secondAttribute=\"height\" id=\"7rc-zx-jvb\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"Pvz-x2-3SE\" secondAttribute=\"height\" id=\"UWB-wc-Irh\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                        <real key=\"value\" value=\"2\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A2M-xk-19s\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"205\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"A2M-xk-19s\" secondAttribute=\"height\" id=\"DwY-HI-i8J\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"A2M-xk-19s\" secondAttribute=\"height\" id=\"f1j-Nh-p5g\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"grg-TG-pev\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                        <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                        <real key=\"value\" value=\"2\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Apr-ah-BVH\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"251\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"Apr-ah-BVH\" secondAttribute=\"height\" id=\"3I6-e9-j3W\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"Apr-ah-BVH\" secondAttribute=\"height\" id=\"9ES-6p-WC0\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"ayH-pL-aoX\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                        <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                        <real key=\"value\" value=\"2\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mc2-pp-glr\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"298\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"mc2-pp-glr\" secondAttribute=\"height\" id=\"TDe-cc-trP\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"Uwv-uz-Cin\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"mc2-pp-glr\" secondAttribute=\"height\" id=\"ajf-8M-T3o\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"mc2-pp-glr\" secondAttribute=\"height\" id=\"vBU-lu-8BS\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                        <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                        <real key=\"value\" value=\"2\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0B4-x9-yaI\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"344\" y=\"14\" width=\"36\" height=\"36\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"0B4-x9-yaI\" secondAttribute=\"height\" id=\"LYU-Qd-Jnf\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"0B4-x9-yaI\" secondAttribute=\"height\" id=\"bhp-Ii-bMj\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"0B4-x9-yaI\" secondAttribute=\"height\" id=\"j3K-TX-GK9\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"36\" id=\"o7n-gp-7Yu\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                        <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                        <real key=\"value\" value=\"2\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                        </subviews>\n                                                                        <edgeInsets key=\"edgeInsets\" left=\"20\" right=\"20\" top=\"0.0\" bottom=\"0.0\"/>\n                                                                        <visibilityPriorities>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                        </visibilityPriorities>\n                                                                        <customSpacing>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                        </customSpacing>\n                                                                    </stackView>\n                                                                </subviews>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"trailing\" secondItem=\"e41-yn-7PI\" secondAttribute=\"trailing\" id=\"0lh-KO-Q88\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"8Se-a5-tr9\"/>\n                                                                    <constraint firstAttribute=\"bottom\" secondItem=\"e41-yn-7PI\" secondAttribute=\"bottom\" id=\"Dfm-I4-ltT\"/>\n                                                                    <constraint firstItem=\"e41-yn-7PI\" firstAttribute=\"top\" secondItem=\"Gi0-4d-DPA\" secondAttribute=\"top\" id=\"ZxR-hQ-C4t\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"bDC-WZ-n9R\"/>\n                                                                    <constraint firstItem=\"e41-yn-7PI\" firstAttribute=\"leading\" secondItem=\"Gi0-4d-DPA\" secondAttribute=\"leading\" id=\"pii-kJ-hzX\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"6oS-Fm-DQZ\" column=\"Fgv-Q3-Ekz\" id=\"L2t-rF-mxM\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uQn-ly-t6H\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"418\" width=\"400\" height=\"64\"/>\n                                                                <subviews>\n                                                                    <stackView distribution=\"fillEqually\" orientation=\"horizontal\" alignment=\"centerY\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ciX-I1-78t\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"400\" height=\"64\"/>\n                                                                        <subviews>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"4\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xyq-GF-cEQ\">\n                                                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eLf-w7-L1h\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"108\" height=\"19\"/>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yjH-tc-13Z\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"23\" width=\"108\" height=\"18\"/>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FSr-yL-zXR\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"108\" height=\"19\"/>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"4\" horizontalStackHuggingPriority=\"100\" verticalStackHuggingPriority=\"249.99998474121094\" horizontalHuggingPriority=\"100\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Tvm-He-zYu\">\n                                                                                <rect key=\"frame\" x=\"204\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QZM-NO-joW\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"65\" height=\"19\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                                <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                                <real key=\"value\" value=\"1\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4qX-G6-YfU\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"23\" width=\"65\" height=\"18\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                                <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                                <real key=\"value\" value=\"1\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vxG-qt-6b5\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"65\" height=\"19\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                                <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                                <real key=\"value\" value=\"1\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                        </subviews>\n                                                                        <visibilityPriorities>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                        </visibilityPriorities>\n                                                                        <customSpacing>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                        </customSpacing>\n                                                                    </stackView>\n                                                                </subviews>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"trailing\" secondItem=\"ciX-I1-78t\" secondAttribute=\"trailing\" id=\"An8-vT-2xQ\"/>\n                                                                    <constraint firstAttribute=\"bottom\" secondItem=\"ciX-I1-78t\" secondAttribute=\"bottom\" id=\"Cuj-4L-2ep\"/>\n                                                                    <constraint firstItem=\"ciX-I1-78t\" firstAttribute=\"leading\" secondItem=\"uQn-ly-t6H\" secondAttribute=\"leading\" id=\"KCi-ah-myc\"/>\n                                                                    <constraint firstItem=\"ciX-I1-78t\" firstAttribute=\"top\" secondItem=\"uQn-ly-t6H\" secondAttribute=\"top\" id=\"gnK-if-lQY\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"hOH-0X-vfn\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"m4z-ui-Zmy\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"6oS-Fm-DQZ\" column=\"Wsh-KX-sd2\" id=\"o1i-xH-1W5\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3Ek-ZN-wI3\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"418\" width=\"400\" height=\"64\"/>\n                                                                <subviews>\n                                                                    <stackView distribution=\"fillEqually\" orientation=\"horizontal\" alignment=\"centerY\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qfH-1l-1b2\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"400\" height=\"64\"/>\n                                                                        <subviews>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"4\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BC5-FW-7Gv\">\n                                                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ei2-eA-iob\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"108\" height=\"19\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetColor\">\n                                                                                                <color key=\"value\" red=\"0.57045853140000002\" green=\"0.57047235969999999\" blue=\"0.57046490910000003\" alpha=\"0.30169780027932963\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pH4-OL-eR7\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"23\" width=\"108\" height=\"18\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetColor\">\n                                                                                                <color key=\"value\" red=\"0.57045853140000002\" green=\"0.57047235969999999\" blue=\"0.57046490910000003\" alpha=\"0.30169780027932963\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QqD-Tb-ELA\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"108\" height=\"19\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetColor\">\n                                                                                                <color key=\"value\" red=\"0.57045853140000002\" green=\"0.57047235969999999\" blue=\"0.57046490910000003\" alpha=\"0.30169780027932963\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"4\" horizontalStackHuggingPriority=\"100\" verticalStackHuggingPriority=\"249.99998474121094\" horizontalHuggingPriority=\"100\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"IhF-KL-tVQ\">\n                                                                                <rect key=\"frame\" x=\"204\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pOL-gw-eiY\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"65\" height=\"19\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                                <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                                <real key=\"value\" value=\"1\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetColor\">\n                                                                                                <color key=\"value\" red=\"0.57045853140000002\" green=\"0.57047235969999999\" blue=\"0.57046490910000003\" alpha=\"0.30169780027932963\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"b6a-gb-wNQ\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"23\" width=\"65\" height=\"18\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                                <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                                <real key=\"value\" value=\"1\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetColor\">\n                                                                                                <color key=\"value\" red=\"0.57045853140000002\" green=\"0.57047235969999999\" blue=\"0.57046490910000003\" alpha=\"0.30169780027932963\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PF3-L5-n8m\" customClass=\"DSFSparklineDataBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"65\" height=\"19\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                                                <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                                                <real key=\"value\" value=\"1\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetColor\">\n                                                                                                <color key=\"value\" red=\"0.57045853140000002\" green=\"0.57047235969999999\" blue=\"0.57046490910000003\" alpha=\"0.30169780027932963\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                        </subviews>\n                                                                        <visibilityPriorities>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                        </visibilityPriorities>\n                                                                        <customSpacing>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                        </customSpacing>\n                                                                    </stackView>\n                                                                </subviews>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"2oq-p3-m9Y\"/>\n                                                                    <constraint firstItem=\"qfH-1l-1b2\" firstAttribute=\"top\" secondItem=\"3Ek-ZN-wI3\" secondAttribute=\"top\" id=\"5yg-Fg-6H6\"/>\n                                                                    <constraint firstItem=\"qfH-1l-1b2\" firstAttribute=\"leading\" secondItem=\"3Ek-ZN-wI3\" secondAttribute=\"leading\" id=\"DRX-5H-Ju5\"/>\n                                                                    <constraint firstAttribute=\"trailing\" secondItem=\"qfH-1l-1b2\" secondAttribute=\"trailing\" id=\"Usw-aa-WeK\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"bxA-4b-vdy\"/>\n                                                                    <constraint firstAttribute=\"bottom\" secondItem=\"qfH-1l-1b2\" secondAttribute=\"bottom\" id=\"h0b-3b-KMp\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"hsD-F4-k8U\" column=\"Fgv-Q3-Ekz\" id=\"YXd-2q-lkN\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CVK-JB-TRV\" customClass=\"DSFSparklineStripesGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"338\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"Mui-ep-2bF\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"zoX-5w-x4D\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"hsD-F4-k8U\" column=\"Wsh-KX-sd2\" id=\"ySw-8S-UHd\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Tg-Zl-izg\" customClass=\"DSFSparklineStripesGraphView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"338\" width=\"400\" height=\"64\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"F5a-fW-LzZ\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"TpU-wg-ZQW\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"r5p-Hs-XDA\" column=\"Fgv-Q3-Ekz\" id=\"jVF-u6-UIQ\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7sC-Mq-lN0\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"258\" width=\"400\" height=\"64\"/>\n                                                                <subviews>\n                                                                    <stackView distribution=\"fillEqually\" orientation=\"horizontal\" alignment=\"centerY\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"odc-s6-dkH\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"400\" height=\"64\"/>\n                                                                        <subviews>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"2\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Eew-N2-owo\">\n                                                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EuU-hj-8tS\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"108\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.34000000000000002\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.92143100499999997\" green=\"0.92145264149999995\" blue=\"0.92144101860000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                                                <real key=\"value\" value=\"13\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"X44-fu-3QS\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"22\" width=\"108\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.94999999999999996\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.92143100499999997\" green=\"0.92145264149999995\" blue=\"0.92144101860000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                                                <real key=\"value\" value=\"13\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fsE-VY-XfE\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"108\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.050000000000000003\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.92143100499999997\" green=\"0.92145264149999995\" blue=\"0.92144101860000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                                                <real key=\"value\" value=\"13\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"2\" horizontalStackHuggingPriority=\"100\" verticalStackHuggingPriority=\"249.99998474121094\" horizontalHuggingPriority=\"100\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aT9-Pf-kdZ\">\n                                                                                <rect key=\"frame\" x=\"204\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lno-lz-z95\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"65\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.34000000000000002\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.92143100499999997\" green=\"0.92145264149999995\" blue=\"0.92144101860000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lDn-Oe-f0d\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"22\" width=\"65\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.94999999999999996\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.92143100499999997\" green=\"0.92145264149999995\" blue=\"0.92144101860000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qg3-ol-Urh\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"65\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.050000000000000003\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.92143100499999997\" green=\"0.92145264149999995\" blue=\"0.92144101860000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                        </subviews>\n                                                                        <visibilityPriorities>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                        </visibilityPriorities>\n                                                                        <customSpacing>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                        </customSpacing>\n                                                                    </stackView>\n                                                                </subviews>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"3je-oj-njX\"/>\n                                                                    <constraint firstAttribute=\"bottom\" secondItem=\"odc-s6-dkH\" secondAttribute=\"bottom\" id=\"FBu-Fq-ttG\"/>\n                                                                    <constraint firstAttribute=\"trailing\" secondItem=\"odc-s6-dkH\" secondAttribute=\"trailing\" id=\"JSP-s5-1f9\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"N7T-pJ-10B\"/>\n                                                                    <constraint firstItem=\"odc-s6-dkH\" firstAttribute=\"leading\" secondItem=\"7sC-Mq-lN0\" secondAttribute=\"leading\" id=\"jiW-JU-HM3\"/>\n                                                                    <constraint firstItem=\"odc-s6-dkH\" firstAttribute=\"top\" secondItem=\"7sC-Mq-lN0\" secondAttribute=\"top\" id=\"tuF-tb-9i7\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"r5p-Hs-XDA\" column=\"Wsh-KX-sd2\" id=\"Dho-2h-Zpo\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Fm2-9C-8wg\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"258\" width=\"400\" height=\"64\"/>\n                                                                <subviews>\n                                                                    <stackView distribution=\"fillEqually\" orientation=\"horizontal\" alignment=\"centerY\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9vO-5V-49J\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"400\" height=\"64\"/>\n                                                                        <subviews>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"2\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fNK-JC-qNL\">\n                                                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gMf-rh-Cfd\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"108\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.34000000000000002\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" name=\"systemTealColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" name=\"systemIndigoColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                                                <real key=\"value\" value=\"13\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KTC-Iq-Pfi\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"22\" width=\"108\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.94999999999999996\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" name=\"systemTealColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" name=\"systemIndigoColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                                                <real key=\"value\" value=\"13\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2uw-IM-Zhb\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"108\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.050000000000000003\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" name=\"systemTealColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" name=\"systemIndigoColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                                                <color key=\"value\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                                                <real key=\"value\" value=\"13\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                            <stackView distribution=\"fillEqually\" orientation=\"vertical\" alignment=\"leading\" spacing=\"2\" horizontalStackHuggingPriority=\"100\" verticalStackHuggingPriority=\"249.99998474121094\" horizontalHuggingPriority=\"100\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"57F-X8-W0r\">\n                                                                                <rect key=\"frame\" x=\"204\" y=\"0.0\" width=\"196\" height=\"64\"/>\n                                                                                <subviews>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CF6-xS-CM1\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"65\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.34000000000000002\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.66422420739999999\" green=\"0.66424006219999998\" blue=\"0.66423153879999997\" alpha=\"0.27175578010000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RfN-Jv-RX3\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"22\" width=\"65\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.94999999999999996\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.66422420739999999\" green=\"0.66424006219999998\" blue=\"0.66423153879999997\" alpha=\"0.27175578010000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nGY-2t-ljt\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"65\" height=\"20\"/>\n                                                                                        <userDefinedRuntimeAttributes>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                                <real key=\"value\" value=\"0.050000000000000003\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                                                <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                                                <color key=\"value\" red=\"0.66422420739999999\" green=\"0.66424006219999998\" blue=\"0.66423153879999997\" alpha=\"0.27175578010000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                                            </userDefinedRuntimeAttribute>\n                                                                                        </userDefinedRuntimeAttributes>\n                                                                                    </customView>\n                                                                                </subviews>\n                                                                                <visibilityPriorities>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                    <integer value=\"1000\"/>\n                                                                                </visibilityPriorities>\n                                                                                <customSpacing>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                                </customSpacing>\n                                                                            </stackView>\n                                                                        </subviews>\n                                                                        <visibilityPriorities>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                        </visibilityPriorities>\n                                                                        <customSpacing>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                        </customSpacing>\n                                                                    </stackView>\n                                                                </subviews>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"trailing\" secondItem=\"9vO-5V-49J\" secondAttribute=\"trailing\" id=\"J6R-bk-XFU\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"JBE-Ng-aJY\"/>\n                                                                    <constraint firstItem=\"9vO-5V-49J\" firstAttribute=\"leading\" secondItem=\"Fm2-9C-8wg\" secondAttribute=\"leading\" id=\"M57-ww-OQv\"/>\n                                                                    <constraint firstItem=\"9vO-5V-49J\" firstAttribute=\"top\" secondItem=\"Fm2-9C-8wg\" secondAttribute=\"top\" id=\"NWU-em-dzV\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"RoN-nx-04e\"/>\n                                                                    <constraint firstAttribute=\"bottom\" secondItem=\"9vO-5V-49J\" secondAttribute=\"bottom\" id=\"sxd-9I-0Zx\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"gw1-yq-e3j\" column=\"Fgv-Q3-Ekz\" id=\"PxR-MV-nki\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5W0-gr-b2c\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"178\" width=\"400\" height=\"64\"/>\n                                                                <subviews>\n                                                                    <stackView distribution=\"equalSpacing\" orientation=\"horizontal\" alignment=\"centerY\" spacing=\"4\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ays-Bd-sg8\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"400\" height=\"64\"/>\n                                                                        <subviews>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"evP-B8-z5q\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"8\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"evP-B8-z5q\" secondAttribute=\"height\" id=\"ixO-Fz-Tai\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"wWl-YH-2F3\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.050000000000000003\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Prr-jr-3GY\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"64\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"Prr-jr-3GY\" secondAttribute=\"height\" id=\"Np3-MT-q7t\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"Prr-jr-3GY\" secondAttribute=\"height\" id=\"p4i-zE-C7t\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"rkb-ui-G15\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.14999999999999999\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xGj-ny-sQ1\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"120\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"HeT-2V-Y20\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"xGj-ny-sQ1\" secondAttribute=\"height\" id=\"N2H-vA-Prt\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"xGj-ny-sQ1\" secondAttribute=\"height\" id=\"SQY-Wl-582\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.28999999999999998\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9PI-63-hJY\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"176\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"9PI-63-hJY\" secondAttribute=\"height\" id=\"38c-yL-PTa\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"9PI-63-hJY\" secondAttribute=\"height\" id=\"U6R-yH-qRp\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"aNj-jd-5ma\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.42999999999999999\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cne-Df-n4j\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"232\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"cne-Df-n4j\" secondAttribute=\"height\" id=\"1hg-1m-twA\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"cHO-6X-z8r\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"cne-Df-n4j\" secondAttribute=\"height\" id=\"gME-NR-l4J\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.57999999999999996\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uxB-Sk-eBr\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"288\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"uxB-Sk-eBr\" secondAttribute=\"height\" id=\"TDg-p5-RNf\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"uxB-Sk-eBr\" secondAttribute=\"height\" id=\"rjX-pg-CLg\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"tOc-GZ-qMX\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.71999999999999997\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qNO-dq-m20\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                                                <rect key=\"frame\" x=\"344\" y=\"8\" width=\"48\" height=\"48\"/>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"qNO-dq-m20\" secondAttribute=\"height\" id=\"16N-IA-Bgk\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"qNO-dq-m20\" secondAttribute=\"height\" id=\"I5J-GT-nD2\"/>\n                                                                                    <constraint firstAttribute=\"width\" constant=\"48\" id=\"jBO-ak-lIm\"/>\n                                                                                    <constraint firstAttribute=\"width\" secondItem=\"qNO-dq-m20\" secondAttribute=\"height\" id=\"v97-1J-GkX\"/>\n                                                                                </constraints>\n                                                                                <userDefinedRuntimeAttributes>\n                                                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                        <real key=\"value\" value=\"0.85999999999999999\"/>\n                                                                                    </userDefinedRuntimeAttribute>\n                                                                                </userDefinedRuntimeAttributes>\n                                                                            </customView>\n                                                                        </subviews>\n                                                                        <edgeInsets key=\"edgeInsets\" left=\"8\" right=\"8\" top=\"0.0\" bottom=\"0.0\"/>\n                                                                        <visibilityPriorities>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                            <integer value=\"1000\"/>\n                                                                        </visibilityPriorities>\n                                                                        <customSpacing>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                            <real value=\"3.4028234663852886e+38\"/>\n                                                                        </customSpacing>\n                                                                    </stackView>\n                                                                </subviews>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"trailing\" secondItem=\"ays-Bd-sg8\" secondAttribute=\"trailing\" id=\"KQp-aG-8W0\"/>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"PGK-14-ydr\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"l8L-IU-48w\"/>\n                                                                    <constraint firstItem=\"ays-Bd-sg8\" firstAttribute=\"leading\" secondItem=\"5W0-gr-b2c\" secondAttribute=\"leading\" id=\"mgK-ah-MKa\"/>\n                                                                    <constraint firstItem=\"ays-Bd-sg8\" firstAttribute=\"top\" secondItem=\"5W0-gr-b2c\" secondAttribute=\"top\" id=\"qG6-DV-kax\"/>\n                                                                    <constraint firstAttribute=\"bottom\" secondItem=\"ays-Bd-sg8\" secondAttribute=\"bottom\" id=\"y84-qH-QnH\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"gw1-yq-e3j\" column=\"Wsh-KX-sd2\" id=\"ahz-Eq-LjY\"/>\n                                                        <gridCell row=\"7WA-8A-T7M\" column=\"Fgv-Q3-Ekz\" id=\"mD7-qH-OJV\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"q0f-Mo-5Wl\" customClass=\"DSFSparklineActivityGridView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"66\" width=\"400\" height=\"96\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"lcv-xn-iq8\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"96\" id=\"tPE-O1-lnm\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"7WA-8A-T7M\" column=\"Wsh-KX-sd2\" id=\"XBq-Ny-COv\">\n                                                            <customView key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0vo-py-JRJ\" customClass=\"DSFSparklineActivityGridView\" customModule=\"DSFSparkline\">\n                                                                <rect key=\"frame\" x=\"416\" y=\"66\" width=\"400\" height=\"96\"/>\n                                                                <constraints>\n                                                                    <constraint firstAttribute=\"width\" constant=\"400\" id=\"nZS-yU-lzi\"/>\n                                                                    <constraint firstAttribute=\"height\" constant=\"96\" id=\"s1s-47-pEZ\"/>\n                                                                </constraints>\n                                                            </customView>\n                                                        </gridCell>\n                                                        <gridCell row=\"JFM-k5-Fm8\" column=\"Fgv-Q3-Ekz\" id=\"n6y-WU-C5s\">\n                                                            <stackView key=\"contentView\" distribution=\"fill\" orientation=\"horizontal\" alignment=\"top\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6g5-qN-LOv\">\n                                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"340\" height=\"50\"/>\n                                                                <subviews>\n                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uRh-qO-1PN\" customClass=\"DSFSparklineCircularProgressView\" customModule=\"DSFSparkline\">\n                                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"PUG-F0-7Fk\"/>\n                                                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"kPj-c4-4YZ\"/>\n                                                                        </constraints>\n                                                                        <userDefinedRuntimeAttributes>\n                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                            </userDefinedRuntimeAttribute>\n                                                                        </userDefinedRuntimeAttributes>\n                                                                    </customView>\n                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xh3-hR-qBk\" customClass=\"DSFSparklineCircularProgressView\" customModule=\"DSFSparkline\">\n                                                                        <rect key=\"frame\" x=\"58\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"Lrk-ip-Dkh\"/>\n                                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"rCW-bh-XHG\"/>\n                                                                        </constraints>\n                                                                        <userDefinedRuntimeAttributes>\n                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                <real key=\"value\" value=\"0.34999999999999998\"/>\n                                                                            </userDefinedRuntimeAttribute>\n                                                                        </userDefinedRuntimeAttributes>\n                                                                    </customView>\n                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jk3-AR-mNz\" customClass=\"DSFSparklineCircularProgressView\" customModule=\"DSFSparkline\">\n                                                                        <rect key=\"frame\" x=\"116\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"WDf-KB-Bav\"/>\n                                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"qQa-cP-FBg\"/>\n                                                                        </constraints>\n                                                                        <userDefinedRuntimeAttributes>\n                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                <real key=\"value\" value=\"0.75\"/>\n                                                                            </userDefinedRuntimeAttribute>\n                                                                        </userDefinedRuntimeAttributes>\n                                                                    </customView>\n                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FOh-so-ury\" customClass=\"DSFSparklineCircularProgressView\" customModule=\"DSFSparkline\">\n                                                                        <rect key=\"frame\" x=\"174\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"2OI-6q-NAs\"/>\n                                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"PXc-FK-rZk\"/>\n                                                                        </constraints>\n                                                                        <userDefinedRuntimeAttributes>\n                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                <real key=\"value\" value=\"1.2\"/>\n                                                                            </userDefinedRuntimeAttribute>\n                                                                        </userDefinedRuntimeAttributes>\n                                                                    </customView>\n                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lkE-vo-Blc\" customClass=\"DSFSparklineCircularProgressView\" customModule=\"DSFSparkline\">\n                                                                        <rect key=\"frame\" x=\"232\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"01Y-FE-FVr\"/>\n                                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"bvm-7y-c8Z\"/>\n                                                                        </constraints>\n                                                                        <userDefinedRuntimeAttributes>\n                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                            </userDefinedRuntimeAttribute>\n                                                                        </userDefinedRuntimeAttributes>\n                                                                    </customView>\n                                                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Fxz-of-hV9\" customClass=\"DSFSparklineCircularProgressView\" customModule=\"DSFSparkline\">\n                                                                        <rect key=\"frame\" x=\"290\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"bX3-mA-L1p\"/>\n                                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"uyA-UV-nqL\"/>\n                                                                        </constraints>\n                                                                        <userDefinedRuntimeAttributes>\n                                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                                <real key=\"value\" value=\"0.0\"/>\n                                                                            </userDefinedRuntimeAttribute>\n                                                                        </userDefinedRuntimeAttributes>\n                                                                    </customView>\n                                                                </subviews>\n                                                                <visibilityPriorities>\n                                                                    <integer value=\"1000\"/>\n                                                                    <integer value=\"1000\"/>\n                                                                    <integer value=\"1000\"/>\n                                                                    <integer value=\"1000\"/>\n                                                                    <integer value=\"1000\"/>\n                                                                    <integer value=\"1000\"/>\n                                                                </visibilityPriorities>\n                                                                <customSpacing>\n                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                    <real value=\"3.4028234663852886e+38\"/>\n                                                                </customSpacing>\n                                                            </stackView>\n                                                        </gridCell>\n                                                        <gridCell row=\"JFM-k5-Fm8\" column=\"Wsh-KX-sd2\" id=\"1gD-vc-OXf\"/>\n                                                    </gridCells>\n                                                </gridView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"hOh-4e-Vtx\" firstAttribute=\"top\" secondItem=\"7UI-6Z-z5D\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"Ga9-u6-hQG\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"hOh-4e-Vtx\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"fRu-IZ-Wo7\"/>\n                                                <constraint firstItem=\"hOh-4e-Vtx\" firstAttribute=\"leading\" secondItem=\"7UI-6Z-z5D\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"goh-Tw-Khq\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"hOh-4e-Vtx\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"sOn-HJ-arE\"/>\n                                            </constraints>\n                                        </view>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"7UI-6Z-z5D\" firstAttribute=\"leading\" secondItem=\"do4-xR-lo2\" secondAttribute=\"leading\" id=\"Q2M-FO-O4K\"/>\n                                        <constraint firstItem=\"7UI-6Z-z5D\" firstAttribute=\"top\" secondItem=\"do4-xR-lo2\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"uhO-h5-rYt\"/>\n                                    </constraints>\n                                </clipView>\n                                <scroller key=\"horizontalScroller\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"psD-Rr-2o6\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"546\" width=\"852\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"0TC-Rj-jAq\">\n                                    <rect key=\"frame\" x=\"852\" y=\"0.0\" width=\"15\" height=\"546\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                            </scrollView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Kty-ak-QC3\" secondAttribute=\"trailing\" id=\"d5O-g0-fMn\"/>\n                            <constraint firstItem=\"Kty-ak-QC3\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" id=\"dtO-vr-QAk\"/>\n                            <constraint firstItem=\"Kty-ak-QC3\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" id=\"rcy-49-gu6\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Kty-ak-QC3\" secondAttribute=\"bottom\" id=\"t9G-pr-fPf\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"activityGrid1\" destination=\"q0f-Mo-5Wl\" id=\"TC1-8n-Yid\"/>\n                        <outlet property=\"activityGrid2\" destination=\"0vo-py-JRJ\" id=\"qW2-ac-VlA\"/>\n                        <outlet property=\"barCenteredView\" destination=\"RNH-ZJ-Tq5\" id=\"ND5-6v-qTI\"/>\n                        <outlet property=\"barStandardView\" destination=\"i6C-86-GhI\" id=\"q95-Yj-Qb7\"/>\n                        <outlet property=\"databarContainerView\" destination=\"uQn-ly-t6H\" id=\"4qc-Mq-NQH\"/>\n                        <outlet property=\"databarPercent1\" destination=\"eLf-w7-L1h\" id=\"IWM-ay-AeL\"/>\n                        <outlet property=\"databarPercent2\" destination=\"yjH-tc-13Z\" id=\"l3r-AS-TgN\"/>\n                        <outlet property=\"databarPercent3\" destination=\"FSr-yL-zXR\" id=\"XGr-c2-72J\"/>\n                        <outlet property=\"databarPercent4\" destination=\"QZM-NO-joW\" id=\"C5v-SC-FFt\"/>\n                        <outlet property=\"databarPercent5\" destination=\"4qX-G6-YfU\" id=\"euW-fl-L3a\"/>\n                        <outlet property=\"databarPercent6\" destination=\"vxG-qt-6b5\" id=\"tJp-hh-aCg\"/>\n                        <outlet property=\"databarTotal1\" destination=\"Ei2-eA-iob\" id=\"TzL-fw-qou\"/>\n                        <outlet property=\"databarTotal2\" destination=\"pH4-OL-eR7\" id=\"brQ-Pp-bKl\"/>\n                        <outlet property=\"databarTotal3\" destination=\"QqD-Tb-ELA\" id=\"yBh-cy-Hrv\"/>\n                        <outlet property=\"databarTotal4\" destination=\"pOL-gw-eiY\" id=\"ALF-kR-y0t\"/>\n                        <outlet property=\"databarTotal5\" destination=\"b6a-gb-wNQ\" id=\"4fq-0S-YUb\"/>\n                        <outlet property=\"databarTotal6\" destination=\"PF3-L5-n8m\" id=\"FS9-gT-gGd\"/>\n                        <outlet property=\"databarTotalContainerView\" destination=\"3Ek-ZN-wI3\" id=\"0VF-rJ-JQ2\"/>\n                        <outlet property=\"dotSecondView\" destination=\"G7g-fC-Oe0\" id=\"lx6-c8-PES\"/>\n                        <outlet property=\"dotStandardView\" destination=\"SEq-8N-hcb\" id=\"TO4-Qj-Bvm\"/>\n                        <outlet property=\"lineCenteredView\" destination=\"Lwo-B5-fXw\" id=\"iRg-Mf-ceO\"/>\n                        <outlet property=\"lineInterpolatedCenteredView\" destination=\"aCQ-sL-A3S\" id=\"r2B-N2-oPg\"/>\n                        <outlet property=\"lineInterpolatedStandardView\" destination=\"9Uq-bZ-Qih\" id=\"3bG-Yq-tKc\"/>\n                        <outlet property=\"lineMarkersCenteredView\" destination=\"fJm-or-Kg8\" id=\"HR7-2M-c0L\"/>\n                        <outlet property=\"lineMarkersCustomMarkersView1\" destination=\"43s-kw-e5c\" id=\"PgM-kp-IcR\"/>\n                        <outlet property=\"lineMarkersCustomMarkersView2\" destination=\"2QD-LI-Nfa\" id=\"qU8-rP-QoB\"/>\n                        <outlet property=\"lineMarkersStandardView\" destination=\"O21-tc-rhl\" id=\"6fU-lL-FWH\"/>\n                        <outlet property=\"lineStandardView\" destination=\"P1e-zq-3Kb\" id=\"mWV-lg-Nt7\"/>\n                        <outlet property=\"percentBarGraph1\" destination=\"CF6-xS-CM1\" id=\"W3a-hK-81l\"/>\n                        <outlet property=\"percentBarGraph11\" destination=\"gMf-rh-Cfd\" id=\"bSH-xZ-wEj\"/>\n                        <outlet property=\"percentBarGraph12\" destination=\"KTC-Iq-Pfi\" id=\"jq1-SD-liw\"/>\n                        <outlet property=\"percentBarGraph13\" destination=\"2uw-IM-Zhb\" id=\"Y84-n1-APi\"/>\n                        <outlet property=\"percentBarGraph2\" destination=\"RfN-Jv-RX3\" id=\"NDe-EU-9zK\"/>\n                        <outlet property=\"percentBarGraph3\" destination=\"nGY-2t-ljt\" id=\"xar-n5-x0K\"/>\n                        <outlet property=\"percentBarTotalContainerView\" destination=\"7sC-Mq-lN0\" id=\"DAG-zM-bjb\"/>\n                        <outlet property=\"percentBarTotalContainerView2\" destination=\"Fm2-9C-8wg\" id=\"ic0-sR-31C\"/>\n                        <outlet property=\"pie1\" destination=\"5tQ-mY-7Fh\" id=\"MrB-ne-ul2\"/>\n                        <outlet property=\"pie2\" destination=\"GNz-4m-0t3\" id=\"fRA-CP-VIn\"/>\n                        <outlet property=\"pie3\" destination=\"8nY-fj-FYr\" id=\"0Gz-cF-o0c\"/>\n                        <outlet property=\"pie4\" destination=\"Pvz-x2-3SE\" id=\"yol-29-pFg\"/>\n                        <outlet property=\"pie5\" destination=\"A2M-xk-19s\" id=\"g8p-xI-Hqa\"/>\n                        <outlet property=\"pie6\" destination=\"Apr-ah-BVH\" id=\"AEP-bZ-bSs\"/>\n                        <outlet property=\"pie7\" destination=\"mc2-pp-glr\" id=\"cEb-b9-XPr\"/>\n                        <outlet property=\"pie8\" destination=\"0B4-x9-yaI\" id=\"H3C-nY-NOa\"/>\n                        <outlet property=\"pieContainerView\" destination=\"Gi0-4d-DPA\" id=\"FNd-nh-h79\"/>\n                        <outlet property=\"primaryScrollView\" destination=\"Kty-ak-QC3\" id=\"ZYG-EA-mkB\"/>\n                        <outlet property=\"stackCenteredView\" destination=\"UO4-nH-tLy\" id=\"UcA-FD-oWm\"/>\n                        <outlet property=\"stackStandardView\" destination=\"umI-Ph-yaN\" id=\"NEW-jG-nOg\"/>\n                        <outlet property=\"stripes1\" destination=\"CVK-JB-TRV\" id=\"hmf-JF-Yfk\"/>\n                        <outlet property=\"stripes2\" destination=\"0Tg-Zl-izg\" id=\"akH-sm-jGo\"/>\n                        <outlet property=\"tablet1\" destination=\"Qh3-wL-K7r\" id=\"h1B-1l-woe\"/>\n                        <outlet property=\"winLoss\" destination=\"Lqw-wT-484\" id=\"dsI-83-dQv\"/>\n                        <outlet property=\"winLossTie\" destination=\"Wfv-p8-aS4\" id=\"IQq-sD-0XG\"/>\n                        <outlet property=\"wiperContainer\" destination=\"ays-Bd-sg8\" id=\"KQo-gL-DQ0\"/>\n                        <outlet property=\"wiperGauge1\" destination=\"evP-B8-z5q\" id=\"Qeq-wa-DDn\"/>\n                        <outlet property=\"wiperGauge2\" destination=\"Prr-jr-3GY\" id=\"X0q-sa-lBi\"/>\n                        <outlet property=\"wiperGauge3\" destination=\"xGj-ny-sQ1\" id=\"G4g-rK-jHf\"/>\n                        <outlet property=\"wiperGauge4\" destination=\"9PI-63-hJY\" id=\"zli-Kb-J73\"/>\n                        <outlet property=\"wiperGauge5\" destination=\"cne-Df-n4j\" id=\"p6J-vZ-SA2\"/>\n                        <outlet property=\"wiperGauge6\" destination=\"uxB-Sk-eBr\" id=\"sBQ-dB-5lH\"/>\n                        <outlet property=\"wiperGauge7\" destination=\"qNO-dq-m20\" id=\"nKx-sr-dl9\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"262\" y=\"1002\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"NSFlowViewTemplate\" width=\"18\" height=\"10\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/CenteringClipView.swift",
    "content": "/*\n    Copyright (C) 2016 Apple Inc. All Rights Reserved.\n    See LICENSE.txt for this sample’s licensing information\n    \n    Abstract:\n    Contains the definition for `CenteringClipView` which is a specialized clip view subclass to center its document.\n*/\n\nimport Cocoa\n\n/**\n    `CenteringClipView` is a clip view subclass that centers smaller documents views\n    within its inset clip bounds (as described by the set `contentInsets`).\n*/\nclass CenteringClipView: NSClipView {\n    override func constrainBoundsRect(_ proposedBounds: NSRect) -> NSRect {\n        guard let documentView = documentView else { return super.constrainBoundsRect(proposedBounds) }\n\n        var newClipBoundsRect = super.constrainBoundsRect(proposedBounds)\n\n        // Get the `contentInsets` scaled to the future bounds size.\n        let insets = convertedContentInsetsToProposedBoundsSize(newClipBoundsRect.size)\n\n        // Get the insets in terms of the view geometry edges, accounting for flippedness.\n        let minYInset = isFlipped ? insets.top : insets.bottom\n        let maxYInset = isFlipped ? insets.bottom : insets.top\n        let minXInset = insets.left\n        let maxXInset = insets.right\n\n        /*\n            Get and outset the `documentView`'s frame by the scaled contentInsets.\n            The outset frame is used to align and constrain the `newClipBoundsRect`.\n        */\n        let documentFrame = documentView.frame\n        let outsetDocumentFrame = NSRect(x: documentFrame.minX - minXInset,\n                                         y: documentFrame.minY - minYInset,\n                                     width: (documentFrame.width + (minXInset + maxXInset)),\n                                    height: documentFrame.height + (minYInset + maxYInset))\n\n        if newClipBoundsRect.width > outsetDocumentFrame.width {\n            /*\n                If the clip bounds width is larger than the document, center the\n                bounds around the document.\n            */\n            newClipBoundsRect.origin.x = outsetDocumentFrame.minX - (newClipBoundsRect.width - outsetDocumentFrame.width) / 2.0\n        }\n        else if newClipBoundsRect.width < outsetDocumentFrame.width {\n            /*\n                Otherwise, the document is wider than the clip rect. Make sure that \n                the clip rect stays within the document frame.\n            */\n            if newClipBoundsRect.maxX > outsetDocumentFrame.maxX {\n                // The clip rect is outside the maxX edge of the document, bring it in.\n                newClipBoundsRect.origin.x = outsetDocumentFrame.maxX - newClipBoundsRect.width\n            }\n            else if newClipBoundsRect.minX < outsetDocumentFrame.minX {\n                // The clip rect is outside the minX edge of the document, bring it in.\n                newClipBoundsRect.origin.x = outsetDocumentFrame.minX\n            }\n        }\n\n        if newClipBoundsRect.height > outsetDocumentFrame.height {\n            /*\n                If the clip bounds height is larger than the document, center the \n                bounds around the document.\n            */\n            newClipBoundsRect.origin.y = outsetDocumentFrame.minY - (newClipBoundsRect.height - outsetDocumentFrame.height) / 2.0\n        }\n        else if newClipBoundsRect.height < outsetDocumentFrame.height {\n            /*\n                Otherwise, the document is taller than the clip rect. Make sure \n                that the clip rect stays within the document frame.\n            */\n            if newClipBoundsRect.maxY > outsetDocumentFrame.maxY {\n                // The clip rect is outside the maxY edge of the document, bring it in.\n                newClipBoundsRect.origin.y = outsetDocumentFrame.maxY - newClipBoundsRect.height\n            }\n            else if newClipBoundsRect.minY < outsetDocumentFrame.minY {\n                // The clip rect is outside the minY edge of the document, bring it in.\n                newClipBoundsRect.origin.y = outsetDocumentFrame.minY\n            }\n        }\n\n        return backingAlignedRect(newClipBoundsRect, options: .alignAllEdgesNearest)\n    }\n\n    /**\n        The `contentInsets` scaled to the scale factor of a new potential bounds\n        rect. Used by `constrainBoundsRect(NSRect)`.\n    */\n\tfileprivate func convertedContentInsetsToProposedBoundsSize(_ proposedBoundsSize: NSSize) -> NSEdgeInsets {\n        // Base the scale factor on the width scale factor to the new proposedBounds.\n        let fromBoundsToProposedBoundsFactor = bounds.width > 0 ? (proposedBoundsSize.width / bounds.width) : 1.0\n\n        // Scale the set `contentInsets` by the width scale factor.\n        var newContentInsets = contentInsets\n        newContentInsets.top *= fromBoundsToProposedBoundsFactor\n        newContentInsets.left *= fromBoundsToProposedBoundsFactor\n        newContentInsets.bottom *= fromBoundsToProposedBoundsFactor\n        newContentInsets.right *= fromBoundsToProposedBoundsFactor\n\n        return newContentInsets\n    }\n}\n\n\n/*\nSample code project: Exhibition: An Adaptive OS X App\nVersion: 1.2\n\nIMPORTANT:  This Apple software is supplied to you by Apple\nInc. (\"Apple\") in consideration of your agreement to the following\nterms, and your use, installation, modification or redistribution of\nthis Apple software constitutes acceptance of these terms.  If you do\nnot agree with these terms, please do not use, install, modify or\nredistribute this Apple software.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, Apple grants you a personal, non-exclusive\nlicense, under Apple's copyrights in this original Apple software (the\n\"Apple Software\"), to use, reproduce, modify and redistribute the Apple\nSoftware, with or without modifications, in source and/or binary forms;\nprovided that if you redistribute the Apple Software in its entirety and\nwithout modifications, you must retain this notice and the following\ntext and disclaimers in all such redistributions of the Apple Software.\nNeither the name, trademarks, service marks or logos of Apple Inc. may\nbe used to endorse or promote products derived from the Apple Software\nwithout specific prior written permission from Apple.  Except as\nexpressly stated in this notice, no other rights or licenses, express or\nimplied, are granted by Apple herein, including but not limited to any\npatent rights that may be infringed by your derivative works or by other\nworks in which the Apple Software may be incorporated.\n\nThe Apple Software is provided by Apple on an \"AS IS\" basis.  APPLE\nMAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION\nTHE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND\nOPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.\n\nIN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,\nMODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED\nAND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),\nSTRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n\nCopyright (C) 2016 Apple Inc. All Rights Reserved.\n\n*/\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Documentation_Project.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.files.user-selected.read-write</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/Utilities.swift",
    "content": "//\n//  Utilities.swift\n//  Documentation Project\n//\n//  Created by Darren Ford on 14/4/21.\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// A CGPath creation function using a block\n/// - Parameter block: The block used to add to a mutablepath object\n/// - Returns: The created path object\n///\n/// Example :-\n///   ```\n///   let path = CGPath.Create { path in\n///      path.move(to: CGPoint(x: 0, y: 5))\n///      path.addLine(to: CGPoint(x: 10, y: 5))\n///      path.move(to: CGPoint(x: 5, y: 0))\n///      path.addLine(to: CGPoint(x: 10, y: 5))\n///   }\n///   ```\n@inlinable func CGPath(_ block: (CGMutablePath) throws -> Void) rethrows -> CGPath {\n\tlet pth = CGMutablePath()\n\ttry block(pth)\n\treturn pth.copy()!\n}\n\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  Documentation project\n//\n//  Created by Darren Ford on 14/2/21.\n//\n\nimport Cocoa\nimport DSFSparkline\nimport SwiftImageReadWrite\n\nclass FlippedClipView: NSClipView {\n\toverride var isFlipped: Bool {\n\t\treturn true\n\t}\n}\n\npublic extension NSView {\n\tfunc snapshot() -> NSImage? {\n\t\tguard let bitmapRep = self.bitmapImageRepForCachingDisplay(in: self.bounds) else { return nil }\n\t\tself.cacheDisplay(in: self.bounds, to: bitmapRep)\n\t\tlet image = NSImage()\n\t\timage.addRepresentation(bitmapRep)\n\t\treturn image\n\t}\n}\n\n// Temperture anomolies\n// https://www.ncdc.noaa.gov/cag/global/time-series/globe/land_ocean/ytd/12/1880-2019\nlet land_ocean_temp_anomolies: [CGFloat] = [\n\t-0.12, -0.09, -0.10, -0.19, -0.27, -0.26, -0.25, -0.29, -0.14, -0.10, -0.36,\n\t-0.27, -0.32, -0.34, -0.32, -0.25, -0.10, -0.11, -0.28, -0.16, -0.08, -0.16,\n\t-0.26, -0.37, -0.46, -0.28, -0.21, -0.39, -0.43, -0.44, -0.40, -0.44, -0.34,\n\t-0.32, -0.14, -0.09, -0.32, -0.39, -0.30, -0.24, -0.23, -0.16, -0.24, -0.25,\n\t-0.24, -0.18, -0.07, -0.17, -0.18, -0.33, -0.11, -0.06, -0.13, -0.26, -0.11,\n\t-0.16, -0.12, -0.01, -0.02, 0.01, 0.16, 0.27, 0.11, 0.11, 0.28, 0.18, -0.01,\n\t-0.04, -0.05, -0.08, -0.15, 0.00, 0.04, 0.13, -0.10, -0.13, -0.18,\n\t0.07, 0.13, 0.08, 0.05, 0.09, 0.11, 0.12, -0.14, -0.07, -0.01,\n\t0.00, -0.03, 0.11, 0.06, -0.07, 0.04, 0.19, -0.06, 0.01, -0.07,\n\t0.21, 0.12, 0.23, 0.28, 0.32, 0.19, 0.36, 0.17, 0.16, 0.24,\n\t0.38, 0.39, 0.29, 0.45, 0.39, 0.24, 0.28, 0.34, 0.47, 0.32,\n\t0.51, 0.65, 0.44, 0.42, 0.57, 0.62, 0.64, 0.58, 0.67, 0.64,\n\t0.62, 0.54, 0.64, 0.72, 0.57, 0.64, 0.68, 0.74, 0.93, 1.00,\n\t0.91, 0.83, 0.95\n]\n\nvar SimpleDataSet: DSFSparkline.DataSource = {\n\tlet s = DSFSparkline.DataSource(values: [1, 5, 2, 3, 6, 1, 4])\n\ts.range = 0 ... 7\n\treturn s\n}()\n\nvar SimpleWinLossDataSet: DSFSparkline.DataSource = {\n\tlet s = DSFSparkline.DataSource(values: [1, -5, -2, 3, 6, -1, 4])\n\treturn s\n}()\n\n\nclass ViewController: NSViewController {\n\n\t@IBOutlet weak var primaryScrollView: NSScrollView!\n\n\n\t@IBOutlet weak var lineStandardView: DSFSparklineLineGraphView!\n\t@IBOutlet weak var lineCenteredView: DSFSparklineLineGraphView!\n\n\t@IBOutlet weak var lineInterpolatedStandardView: DSFSparklineLineGraphView!\n\t@IBOutlet weak var lineInterpolatedCenteredView: DSFSparklineLineGraphView!\n\n\t@IBOutlet weak var lineMarkersStandardView: DSFSparklineLineGraphView!\n\t@IBOutlet weak var lineMarkersCenteredView: DSFSparklineLineGraphView!\n\n\t@IBOutlet weak var lineMarkersCustomMarkersView1: DSFSparklineLineGraphView!\n\t@IBOutlet weak var lineMarkersCustomMarkersView2: DSFSparklineLineGraphView!\n\n\n\n\n\t@IBOutlet weak var barStandardView: DSFSparklineBarGraphView!\n\t@IBOutlet weak var barCenteredView: DSFSparklineBarGraphView!\n\n\t@IBOutlet weak var stackStandardView: DSFSparklineStackLineGraphView!\n\t@IBOutlet weak var stackCenteredView: DSFSparklineStackLineGraphView!\n\n\t@IBOutlet weak var dotStandardView: DSFSparklineDotGraphView!\n\t@IBOutlet weak var dotSecondView: DSFSparklineDotGraphView!\n\n\t@IBOutlet weak var winLoss: DSFSparklineWinLossGraphView!\n\t@IBOutlet weak var winLossTie: DSFSparklineWinLossGraphView!\n\n\t@IBOutlet weak var tablet1: DSFSparklineTabletGraphView!\n\n\t@IBOutlet weak var stripes1: DSFSparklineStripesGraphView!\n\t@IBOutlet weak var stripes2: DSFSparklineStripesGraphView!\n\n\t@IBOutlet weak var pie1: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie2: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie3: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie4: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie5: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie6: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie7: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pie8: DSFSparklinePieGraphView!\n\t@IBOutlet weak var pieContainerView: NSView!\n\n\t@IBOutlet weak var databarPercent1: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarPercent2: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarPercent3: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarPercent4: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarPercent5: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarPercent6: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarContainerView: NSView!\n\n\t@IBOutlet weak var databarTotal1: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarTotal2: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarTotal3: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarTotal4: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarTotal5: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarTotal6: DSFSparklineDataBarGraphView!\n\t@IBOutlet weak var databarTotalContainerView: NSView!\n\n\t@IBOutlet weak var percentBarTotalContainerView: NSView!\n\t@IBOutlet weak var percentBarTotalContainerView2: NSView!\n\n\t@IBOutlet weak var wiperGauge: DSFSparklineWiperGaugeGraphView!\n\n\t@IBOutlet weak var percentBarGraph1: DSFSparklinePercentBarGraphView!\n\t@IBOutlet weak var percentBarGraph2: DSFSparklinePercentBarGraphView!\n\t@IBOutlet weak var percentBarGraph3: DSFSparklinePercentBarGraphView!\n\n\t@IBOutlet weak var percentBarGraph11: DSFSparklinePercentBarGraphView!\n\t@IBOutlet weak var percentBarGraph12: DSFSparklinePercentBarGraphView!\n\t@IBOutlet weak var percentBarGraph13: DSFSparklinePercentBarGraphView!\n\n\t@IBOutlet weak var wiperContainer: NSView!\n\t@IBOutlet weak var wiperGauge1: DSFSparklineWiperGaugeGraphView!\n\t@IBOutlet weak var wiperGauge2: DSFSparklineWiperGaugeGraphView!\n\t@IBOutlet weak var wiperGauge3: DSFSparklineWiperGaugeGraphView!\n\t@IBOutlet weak var wiperGauge4: DSFSparklineWiperGaugeGraphView!\n\t@IBOutlet weak var wiperGauge5: DSFSparklineWiperGaugeGraphView!\n\t@IBOutlet weak var wiperGauge6: DSFSparklineWiperGaugeGraphView!\n\t@IBOutlet weak var wiperGauge7: DSFSparklineWiperGaugeGraphView!\n\n\t@IBOutlet weak var activityGrid1: DSFSparklineActivityGridView!\n\t@IBOutlet weak var activityGrid2: DSFSparklineActivityGridView!\n\n\tvar bitmapMap: [String: Data] = [:]\n\n\tvar nameMap: [String: NSView] = [:]\n\tfunc buildNameMap() {\n\t\tnameMap[\"line-standard\"] = lineStandardView\n\t\tnameMap[\"line-centered\"] = lineCenteredView\n\t\tnameMap[\"line-interpolated\"] = lineInterpolatedStandardView\n\t\tnameMap[\"line-interpolated-centered\"] = lineInterpolatedCenteredView\n\t\tnameMap[\"line-markers\"] = lineMarkersStandardView\n\t\tnameMap[\"line-markers-centered\"] = lineMarkersCenteredView\n\t\tnameMap[\"line-custom-marker-1\"] = self.lineMarkersCustomMarkersView1\n\t\tnameMap[\"line-custom-marker-2\"] = self.lineMarkersCustomMarkersView2\n\t\tnameMap[\"bar-standard\"] = barStandardView\n\t\tnameMap[\"bar-centered\"] = barCenteredView\n\t\tnameMap[\"stackline-standard\"] = stackStandardView\n\t\tnameMap[\"stackline-centered\"] = stackCenteredView\n\t\tnameMap[\"dot-standard\"] = dotStandardView\n\t\tnameMap[\"dot-inverted\"] = dotSecondView\n\t\tnameMap[\"win-loss\"] = self.winLoss\n\t\tnameMap[\"win-loss-tie\"] = self.winLossTie\n\t\tnameMap[\"tablet\"] = self.tablet1\n\t\tnameMap[\"pie\"] = self.pieContainerView\n\t\tnameMap[\"databar\"] = self.databarContainerView\n\t\tnameMap[\"databar-max\"] = self.databarTotalContainerView\n\t\tnameMap[\"stripes-standard\"] = self.stripes1\n\t\tnameMap[\"stripes-integral\"] = self.stripes2\n\t\tnameMap[\"percent-bar\"] = self.percentBarTotalContainerView\n\t\tnameMap[\"percent-bar-2\"] = self.percentBarTotalContainerView2\n\t\tnameMap[\"wiper-gauge\"] = self.wiperContainer\n\t\tnameMap[\"activity-grid-1\"] = self.activityGrid1\n\t\tnameMap[\"activity-grid-2\"] = self.activityGrid2\n\t}\n\n\tfileprivate var lineSource: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.3)\n\t\td.push(values: [\n\t\t\t0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,\n\t\t\t0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n\t\t])\n\t\treturn d\n\t}()\n\n\tfileprivate var dotSource: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 70, range: 0 ... 1)\n\t\td.push(values: [\n\t\t\t0.73, 0.86, 0.72, 0.35, 0.36, 0.09, 0.06, 0.89, 0.94, 0.22,\n\t\t\t0.52, 0.74, 0.53, 0.89, 0.34, 0.67, 0.88, 0.00, 0.78, 0.99,\n\t\t\t0.84, 0.55, 0.02, 0.96, 0.66, 0.94, 0.70, 0.27, 0.18, 0.02,\n\t\t\t0.18, 0.03, 0.00, 0.23, 0.93, 0.17, 0.48, 0.34, 0.89, 0.56,\n\t\t\t0.70, 0.59, 0.12, 0.77, 0.98, 0.31, 0.10, 0.47, 0.42, 0.06,\n\t\t\t1.00, 0.12, 0.50, 0.18, 0.02, 0.90, 0.33, 0.05, 0.60, 0.17,\n\t\t\t0.53, 0.84, 0.72, 0.39, 0.56, 0.57, 0.61, 0.23, 0.96, 0.85\n\t\t])\n\t\treturn d\n\t}()\n\n\tfileprivate var winLossDataSource1: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 10, range: -1.0 ... 1)\n\t\td.push(values: [1, -1, 0, 1, -1, -1, 1, -1, 0, 1])\n\t\treturn d\n\t}()\n\n\tfileprivate var landOceanTempAnomolies: DSFSparkline.DataSource = {\n\t\tlet e = DSFSparkline.DataSource(windowSize: UInt(land_ocean_temp_anomolies.count))\n\t\te.set(values: land_ocean_temp_anomolies)\n\t\treturn e\n\t}()\n\n\tfileprivate var twiggle: DSFSparkline.DataSource = {\n\t\tlet e = DSFSparkline.DataSource(windowSize: 50)\n\n\t\tvar v: Int = 0\n\t\tlet vv: [CGFloat] = (0 ..< 24).map { value in\n\t\t\tlet d = v\n\t\t\tv = (v + 1) % 3\n\t\t\tif d == 0 { return -1 }\n\t\t\tif d == 1 { return 0 }\n\t\t\treturn 1\n\t\t}\n\t\te.set(values: vv)\n\t\te.windowSize = 50\n\t\treturn e\n\t}()\n\n\tfileprivate var world: DSFSparkline.DataSource = {\n\t\tlet e = DSFSparkline.DataSource(windowSize: UInt(rawData.count))\n\t\te.set(values: rawData)\n\t\treturn e\n\t}()\n\n\n\tfileprivate var australianAnomaly: DSFSparkline.DataSource = {\n\t\tlet e = DSFSparkline.DataSource(windowSize: UInt(temperature.count))\n\t\te.set(values: temperature)\n\t\treturn e\n\t}()\n\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\n\n\t\tdo {\n\n\t\t\tlet winloss = DSFSparkline.DataSource(values: [1, 1, 0, -1, 1, 1, 1, 0, 1, -1])\n\n\t\t\tlet bitmap = DSFSparklineSurface.Bitmap()\n\n\t\t\tlet zeroLine = DSFSparklineOverlay.ZeroLine()\n\t\t\tzeroLine.dataSource = winloss\n\t\t\t//\tzeroLine.strokeWidth = 1.0\n\t\t\t//\tzeroLine.strokeColor = NSColor.textColor.cgColor\n\t\t\tbitmap.addOverlay(zeroLine)\n\n\t\t\tlet graph = DSFSparklineOverlay.WinLossTie()\n\t\t\tgraph.dataSource = winloss\n\t\t\tbitmap.addOverlay(graph)\n\n\t\t\t// Generate an image with retina scale\n\t\t\tlet image = bitmap.image(width: 75, height: 16, scale: 2)\n\t\t\tassert(image != nil)\n\t\t}\n\n\n\n\n\n\t\tself.buildNameMap()\n\n\n\t\tself.percentBarGraph1.displayStyle.barEdgeInsets = NSEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\t\tself.percentBarGraph2.displayStyle.barEdgeInsets = NSEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\t\tself.percentBarGraph3.displayStyle.barEdgeInsets = NSEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\n\t\tself.percentBarGraph11.displayStyle.barEdgeInsets = NSEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\t\tself.percentBarGraph12.displayStyle.barEdgeInsets = NSEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\t\tself.percentBarGraph13.displayStyle.barEdgeInsets = NSEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\n\n\t\tdo {\n\t\t\tlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\n\n\t\t\tlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033,  0.277, 0.650, 1.000])!\n\t\t\tlet primaryStroke = baseColor // (gray: 0.0, alpha: 0.3))\n\t\t\tlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\n\t\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\t\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\t\t\tline.strokeWidth = 1\n\t\t\tline.primaryStrokeColor = primaryStroke\n\t\t\tline.primaryFill = primaryFill\n\t\t\tline.dataSource = source                    // Assign the datasource to the overlay\n\t\t\tbitmap.addOverlay(line)                     // And add the overlay to the surface.\n\n\t\t\tlet attr = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)!\n\t\t\tlet message = NSMutableAttributedString(string: \"Inlined \")\n\t\t\tmessage.append(attr)\n\t\t\tmessage.append(NSAttributedString(string: \" line graph\"))\n\n\t\t\tSwift.print(message)\n\t\t}\n\n\n//\t\tdo {\n//\t\t\tguard let scroll = self.primaryScrollView,\n//\t\t\t\t\tlet documentView = scroll.documentView else {\n//\t\t\t\treturn\n//\t\t\t}\n//\n//\t\t\tscroll.translatesAutoresizingMaskIntoConstraints = false\n//\n//\t\t\tlet clip = scroll.contentView\n//\t\t\tclip.translatesAutoresizingMaskIntoConstraints = false\n//\n//\t\t\tscroll.addConstraint(NSLayoutConstraint(item: clip, attribute: .left, relatedBy: .equal, toItem: scroll, attribute: .left, multiplier: 1, constant: 0))\n//\t\t\tscroll.addConstraint(NSLayoutConstraint(item: clip, attribute: .top, relatedBy: .equal, toItem: scroll, attribute: .top, multiplier: 1, constant: 0))\n//\t\t\tscroll.addConstraint(NSLayoutConstraint(item: clip, attribute: .right, relatedBy: .equal, toItem: scroll, attribute: .right, multiplier: 1, constant: 0))\n//\t\t\tscroll.addConstraint(NSLayoutConstraint(item: clip, attribute: .bottom, relatedBy: .equal, toItem: scroll, attribute: .bottom, multiplier: 1, constant: 0))\n//\n//\t\t\tdocumentView.translatesAutoresizingMaskIntoConstraints = false\n//\n//\t\t\tclip.addConstraint(NSLayoutConstraint(item: clip, attribute: .left, relatedBy: .equal, toItem: documentView, attribute: .left, multiplier: 1, constant: 0))\n//\t\t\tclip.addConstraint(NSLayoutConstraint(item: clip, attribute: .top, relatedBy: .equal, toItem: documentView, attribute: .top, multiplier: 1, constant: 0))\n//\t\t\t//clip.addConstraint(NSLayoutConstraint(item: clip, attribute: .right, relatedBy: .equal, toItem: documentView, attribute: .right, multiplier: 1, constant: 0))\n//\t\t}\n\n\t\tself.lineStandardView.dataSource = lineSource\n\t\tself.lineCenteredView.dataSource = lineSource\n\n\t\tself.lineInterpolatedStandardView.dataSource = lineSource\n\t\tself.lineInterpolatedCenteredView.dataSource = lineSource\n\n\t\tself.lineMarkersStandardView.dataSource = lineSource\n\t\tself.lineMarkersCenteredView.dataSource = lineSource\n\n\t\tself.lineMarkersCustomMarkersView1.dataSource = lineSource\n\t\tself.lineMarkersCustomMarkersView1.markerDrawingBlock = { context, markerFrames in\n\t\t\tlet maxV = markerFrames.min { (a, b) -> Bool in a.value > b.value }!\n\t\t\tlet minV = markerFrames.min { (a, b) -> Bool in a.value < b.value }!\n\n\t\t\t// Min\n\n\t\t\tcontext.setFillColor(DSFColor.systemRed.cgColor)\n\t\t\tcontext.fill(minV.rect)\n\n\t\t\tcontext.setLineWidth(0.5)\n\t\t\tcontext.setStrokeColor(DSFColor.white.cgColor)\n\t\t\tcontext.stroke(minV.rect)\n\n\t\t\t// Max\n\n\t\t\tcontext.setFillColor(DSFColor.systemGreen.cgColor)\n\t\t\tcontext.fill(maxV.rect)\n\n\t\t\tcontext.setLineWidth(0.5)\n\t\t\tcontext.setStrokeColor(DSFColor.white.cgColor)\n\t\t\tcontext.stroke(maxV.rect)\n\t\t}\n\n\t\tself.lineMarkersCustomMarkersView2.dataSource = lineSource\n\t\tself.lineMarkersCustomMarkersView2.markerDrawingBlock = { context, markerFrames in\n\t\t\tlet lastFrames = markerFrames.suffix(5)\n\t\t\tlastFrames.forEach { marker in\n\n\t\t\t\tlet path = CGPath { p in\n\t\t\t\t\tp.move(to: CGPoint(x: marker.rect.minX, y: marker.rect.midY))\n\t\t\t\t\tp.addLine(to: CGPoint(x: marker.rect.maxX, y: marker.rect.midY))\n\t\t\t\t\tp.move(to: CGPoint(x: marker.rect.midX, y: marker.rect.minY))\n\t\t\t\t\tp.addLine(to: CGPoint(x: marker.rect.midX, y: marker.rect.maxY))\n\t\t\t\t}\n\n\t\t\t\tcontext.addPath(path)\n\t\t\t\tcontext.setStrokeColor(DSFColor.systemBlue.cgColor)\n\t\t\t\tcontext.setLineWidth(2)\n\t\t\t\tcontext.strokePath()\n\t\t\t}\n\t\t}\n\n\n\t\tself.barStandardView.dataSource = lineSource\n\t\tself.barCenteredView.dataSource = lineSource\n\n\t\tself.stackStandardView.dataSource = lineSource\n\t\tself.stackCenteredView.dataSource = lineSource\n\n\t\tself.dotStandardView.dataSource = dotSource\n\t\tself.dotSecondView.dataSource = dotSource\n\n\t\tself.winLoss.dataSource = winLossDataSource1\n\t\tself.winLossTie.dataSource = winLossDataSource1\n\n\t\tself.tablet1.dataSource = winLossDataSource1\n\n\t\tself.pie1.dataSource = DSFSparkline.StaticDataSource([10, 30, 20])\n\t\tself.pie2.dataSource = DSFSparkline.StaticDataSource([33, 33, 33])\n\t\tself.pie3.dataSource = DSFSparkline.StaticDataSource([40, 5, 80])\n\t\tself.pie4.dataSource = DSFSparkline.StaticDataSource([1, 2, 3])\n\t\tself.pie5.dataSource = DSFSparkline.StaticDataSource([66.7, 66, 66.9])\n\t\tself.pie6.dataSource = DSFSparkline.StaticDataSource([9, 9, 4])\n\t\tself.pie7.dataSource = DSFSparkline.StaticDataSource([0.5, 0.1, 0.1])\n\t\tself.pie8.dataSource = DSFSparkline.StaticDataSource([1000, 2000, 300])\n\n\t\tlet palette = DSFSparkline.Palette([\n\t\t\tDSFColor(deviceRed: 0, green: 0, blue: 1, alpha: 1),\n\t\t\tDSFColor(deviceRed: 0.33, green: 0.33, blue: 1, alpha: 1),\n\t\t\tDSFColor(deviceRed: 0.66, green: 0.66, blue: 1, alpha: 1)\n\t\t])\n\t\tself.pie2.palette = DSFSparkline.Palette.sharedGrays\n\t\tself.pie4.palette = palette\n\t\tself.pie6.palette = palette\n\t\tself.pie6.palette = DSFSparkline.Palette.sharedGrays\n\t\tself.pie8.palette = palette\n\n\n\t\t///\n\n\t\tself.databarPercent1.dataSource = DSFSparkline.StaticDataSource([10, 30, 20])\n\t\tself.databarPercent2.dataSource = DSFSparkline.StaticDataSource([33, 33, 33])\n\t\tself.databarPercent3.dataSource = DSFSparkline.StaticDataSource([40, 5, 80])\n\t\tself.databarPercent4.dataSource = DSFSparkline.StaticDataSource([1, 2, 3])\n\t\tself.databarPercent5.dataSource = DSFSparkline.StaticDataSource([66.7, 66, 66.9])\n\t\tself.databarPercent6.dataSource = DSFSparkline.StaticDataSource([9, 9, 4])\n\n\n\t\tself.databarTotal1.dataSource = DSFSparkline.StaticDataSource([8, 19, 20])\n\t\tself.databarTotal1.maximumTotalValue = 60\n\t\tself.databarTotal2.dataSource = DSFSparkline.StaticDataSource([20, 20, 20])\n\t\tself.databarTotal2.maximumTotalValue = 60\n\t\tself.databarTotal3.dataSource = DSFSparkline.StaticDataSource([30, 5, 12])\n\t\tself.databarTotal3.maximumTotalValue = 60\n\t\tself.databarTotal4.dataSource = DSFSparkline.StaticDataSource([10, 15, 20])\n\t\tself.databarTotal4.maximumTotalValue = 60\n\t\tself.databarTotal5.dataSource = DSFSparkline.StaticDataSource([25, 10, 12])\n\t\tself.databarTotal5.maximumTotalValue = 60\n\t\tself.databarTotal6.dataSource = DSFSparkline.StaticDataSource([9, 9, 4])\n\t\tself.databarTotal6.maximumTotalValue = 60\n\n\t\tlet gradient1 = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(r: 0, g: 0, b: 1, location: 0.0),\n\t\t\tDSFSparkline.GradientBucket.Post(r: 1, g: 1, b: 1, location: 0.5),\n\t\t\tDSFSparkline.GradientBucket.Post(r: 1, g: 0, b: 0, location: 1.0),\n\t\t])\n\n\t\tlet gradient2 = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: NSColor.systemYellow.cgColor, location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(r: 0.3, g: 0, b: 0.3, location: 1.0)\n\t\t])\n\n\t\tself.stripes1.gradient = gradient1\n\t\tself.stripes1.integral = false\n\t\tself.stripes1.dataSource = world\n\n\t\t//self.stripes1.dataSource = landOceanTempAnomolies\n\t\t//self.stripes1.dataSource = twiggle\n\n\t\t///\n\n\t\tself.stripes2.dataSource = australianAnomaly\n\t\taustralianAnomaly.range = -1.5 ... 1.5\n\n\t\tself.stripes2.gradient = gradient2\n\t\tself.stripes2.barSpacing = 1\n\t\tself.stripes2.integral = true\n\n\t\tdo {\n\t\t\tactivityGrid1.cellTooltipString = { index in \"\\(index)\" }\n\t\t\tactivityGrid1.cellFillScheme = DSFSparkline.ActivityGrid.CellStyle.DefaultLight\n\t\t\tactivityGrid1.setValues((0 ..< 1000).map { _ in CGFloat.random(in: 0 ... 1)}, range: 0 ... 1)\n\n\t\t\tlet palette2 = [\n\t\t\t\tDSFColor(red: 0.706, green: 0.020, blue: 0.151, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.845, green: 0.324, blue: 0.265, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.932, green: 0.520, blue: 0.408, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.970, green: 0.678, blue: 0.562, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.949, green: 0.795, blue: 0.720, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.867, green: 0.867, blue: 0.867, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.752, green: 0.832, blue: 0.960, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.621, green: 0.745, blue: 1.000, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.484, green: 0.621, blue: 0.978, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.352, green: 0.469, blue: 0.889, alpha: 1.0),\n\t\t\t\tDSFColor(red: 0.230, green: 0.299, blue: 0.751, alpha: 1.0),\n\t\t\t]\n\n\t\t\tactivityGrid2.cellFillScheme = .init(colors: palette2)\n\t\t\tactivityGrid2.cellDimension = 9\n\t\t\tactivityGrid2.verticalCellCount = 8\n\t\t\tactivityGrid2.cellSpacing = 3\n\t\t\tactivityGrid2.cellBorderColor = .black.withAlphaComponent(1)\n\t\t\tactivityGrid2.cellBorderWidth = 0.5\n\t\t\tactivityGrid2.setValues((0 ..< 1000).map { _ in CGFloat.random(in: 0 ... 1)}, range: 0 ... 1)\n\n\n\t\t\tlet surface = DSFSparklineSurface.Bitmap()\n\t\t\tlet grid = DSFSparklineOverlay.ActivityGrid()\n\t\t\tgrid.dataSource = DSFSparkline.StaticDataSource((0 ... 1000).map { _ in CGFloat.random(in: 0 ... 1) }, range: 0 ... 1)\n\t\t\tgrid.verticalCellCount = 1\n\t\t\tgrid.cellStyle = .init(fillScheme: DSFSparkline.ActivityGrid.CellStyle.DefaultLight, borderColor: .black, borderWidth: 0.5, cellDimension: 11, cellSpacing: 2.5)\n\t\t\tsurface.addOverlay(grid)\n\n\t\t\tlet img = surface.image(width: 200, height: 14, scale: 2)!\n\t\t\tlet pngdata = try! img.representation.png(dpi: 144)\n\t\t\tbitmapMap[\"activity-grid-mini.png\"] = pngdata\n\t\t}\n\t}\n\n\toverride var representedObject: Any? {\n\t\tdidSet {\n\t\t// Update the view, if already loaded.\n\t\t}\n\t}\n\n\t@IBAction func generate(_ sender: Any) {\n\n\t\tlet dialog = NSOpenPanel();\n\n\t\tdialog.title = \"Choose a folder\";\n\t\tdialog.showsResizeIndicator = true\n\t\tdialog.allowsMultipleSelection = false\n\t\tdialog.canChooseDirectories = true\n\t\tdialog.canChooseFiles = false\n\t\tdialog.canCreateDirectories = true\n\n\t\tdialog.beginSheetModal(for: self.view.window!, completionHandler: { response in\n\t\t\tguard response == NSApplication.ModalResponse.OK,\n\t\t\t\t\tlet url = dialog.url else {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tDispatchQueue.main.async { [weak self] in\n\t\t\t\tself?.generate(path: url)\n\t\t\t}\n\t\t})\n\t}\n\n\tfunc generate(path: URL) {\n\n\t\tself.nameMap.forEach { (name, view) in\n\t\t\tlet name = \"\\(name).png\"\n\n\t\t\tlet outputFile = path.appendingPathComponent(name)\n\n\t\t\tguard let image = view.snapshot(),\n\t\t\t\t\tlet tiff = image.tiffRepresentation,\n\t\t\t\t\tlet imageRep = NSBitmapImageRep(data: tiff),\n\t\t\t\t\tlet pngData = imageRep.representation(using: .png, properties: [:]) else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\ttry pngData.write(to: outputFile)\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\tSwift.print(\"\\(error)\")\n\t\t\t}\n\t\t}\n\n\t\tself.bitmapMap.forEach { (name: String, value: Data) in\n\t\t\tlet outputFile = path.appendingPathComponent(name)\n\t\t\tdo {\n\t\t\t\ttry value.write(to: outputFile)\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\tSwift.print(\"\\(error)\")\n\t\t\t}\n\t\t}\n\t}\n}\n\n/////\n\n// https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/download.html\n// https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/time_series/HadCRUT.4.6.0.0.annual_ns_avg.txt\n// Data format :- https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/series_format.html\n\nlet rawData: [CGFloat] = [\n\t-0.373,\n\t-0.218,\n\t-0.228,\n\t-0.269,\n\t-0.248,\n\t-0.272,\n\t-0.358,\n\t-0.461,\n\t-0.467,\n\t-0.284,\n\t-0.343,\n\t-0.407,\n\t-0.524,\n\t-0.278,\n\t-0.494,\n\t-0.279,\n\t-0.251,\n\t-0.321,\n\t-0.238,\n\t-0.262,\n\t-0.276,\n\t-0.335,\n\t-0.227,\n\t-0.304,\n\t-0.368,\n\t-0.395,\n\t-0.384,\n\t-0.075,\n\t 0.035,\n\t-0.230,\n\t-0.227,\n\t-0.200,\n\t-0.213,\n\t-0.296,\n\t-0.409,\n\t-0.389,\n\t-0.367,\n\t-0.418,\n\t-0.307,\n\t-0.171,\n\t-0.416,\n\t-0.330,\n\t-0.455,\n\t-0.473,\n\t-0.410,\n\t-0.390,\n\t-0.186,\n\t-0.206,\n\t-0.412,\n\t-0.289,\n\t-0.203,\n\t-0.259,\n\t-0.402,\n\t-0.479,\n\t-0.520,\n\t-0.377,\n\t-0.283,\n\t-0.465,\n\t-0.511,\n\t-0.522,\n\t-0.490,\n\t-0.544,\n\t-0.437,\n\t-0.424,\n\t-0.244,\n\t-0.141,\n\t-0.383,\n\t-0.468,\n\t-0.333,\n\t-0.275,\n\t-0.247,\n\t-0.187,\n\t-0.302,\n\t-0.276,\n\t-0.294,\n\t-0.215,\n\t-0.108,\n\t-0.210,\n\t-0.206,\n\t-0.350,\n\t-0.137,\n\t-0.087,\n\t-0.137,\n\t-0.273,\n\t-0.131,\n\t-0.178,\n\t-0.147,\n\t-0.026,\n\t-0.006,\n\t-0.052,\n\t 0.014,\n\t 0.020,\n\t-0.027,\n\t-0.004,\n\t 0.144,\n\t 0.025,\n\t-0.071,\n\t-0.038,\n\t-0.039,\n\t-0.074,\n\t-0.173,\n\t-0.052,\n\t 0.028,\n\t 0.097,\n\t-0.129,\n\t-0.190,\n\t-0.267,\n\t-0.007,\n\t 0.046,\n\t 0.017,\n\t-0.049,\n\t 0.038,\n\t 0.014,\n\t 0.048,\n\t-0.223,\n\t-0.140,\n\t-0.068,\n\t-0.074,\n\t-0.113,\n\t 0.032,\n\t-0.027,\n\t-0.186,\n\t-0.065,\n\t 0.062,\n\t-0.214,\n\t-0.149,\n\t-0.241,\n\t 0.047,\n\t-0.062,\n\t 0.057,\n\t 0.092,\n\t 0.140,\n\t 0.011,\n\t 0.194,\n\t-0.014,\n\t-0.030,\n\t 0.045,\n\t 0.192,\n\t 0.198,\n\t 0.118,\n\t 0.296,\n\t 0.254,\n\t 0.105,\n\t 0.148,\n\t 0.208,\n\t 0.325,\n\t 0.183,\n\t 0.390,\n\t 0.539,\n\t 0.306,\n\t 0.294,\n\t 0.441,\n\t 0.496,\n\t 0.505,\n\t 0.447,\n\t 0.545,\n\t 0.506,\n\t 0.491,\n\t 0.395,\n\t 0.506,\n\t 0.560,\n\t 0.425,\n\t 0.470,\n\t 0.514,\n\t 0.579,\n\t 0.763,\n\t 0.797,\n\t 0.677,\n\t 0.597,\n\t 0.736,\n\t 0.768\n]\n\n\n// Annual mean temperature anomaly\n// http://www.bom.gov.au/climate/change/#tabs=Tracker&tracker=timeseries&tQ=graph%3Dtmean%26area%3Daus%26season%3D0112\nlet temperature: [CGFloat] = [\n\t-0.50,\n\t-0.68,\n\t-0.20,\n\t-0.87,\n\t 0.12,\n\t 0.07,\n\t-0.57,\n\t-1.24,\n\t-0.54,\n\t-0.15,\n\t-0.53,\n\t-0.23,\n\t-0.47,\n\t-0.38,\n\t-0.69,\n\t-0.77,\n\t-0.17,\n\t-0.51,\n\t 0.16,\n\t-0.87,\n\t-0.24,\n\t-0.59,\n\t-0.42,\n\t-0.45,\n\t-0.36,\n\t-0.50,\n\t-0.14,\n\t-0.36,\n\t 0.19,\n\t-0.62,\n\t-0.24,\n\t-0.55,\n\t 0.08,\n\t-0.62,\n\t-0.40,\n\t-0.29,\n\t-0.73,\n\t-0.25,\n\t-0.45,\n\t-0.94,\n\t-0.61,\n\t-0.43,\n\t-0.43,\n\t-0.45,\n\t-0.36,\n\t-0.32,\n\t-0.92,\n\t 0.04,\n\t 0.14,\n\t 0.24,\n\t-0.66,\n\t 0.05,\n\t-0.11,\n\t-0.13,\n\t-0.22,\n\t 0.25,\n\t-0.50,\n\t-0.22,\n\t-0.39,\n\t-0.03,\n\t-0.10,\n\t-0.22,\n\t 0.15,\n\t 0.54,\n\t-0.70,\n\t-0.22,\n\t-0.75,\n\t-0.04,\n\t-0.31,\n\t 0.37,\n\t 0.74,\n\t 0.27,\n\t-0.04,\n\t 0.33,\n\t-0.38,\n\t 0.21,\n\t 0.22,\n\t 0.17,\n\t 0.73,\n\t-0.02,\n\t 0.47,\n\t 0.60,\n\t 0.12,\n\t 0.31,\n\t 0.18,\n\t 0.16,\n\t 0.60,\n\t 0.30,\n\t 0.97,\n\t 0.32,\n\t-0.04,\n\t 0.05,\n\t 0.71,\n\t 0.69,\n\t 0.54,\n\t 1.16,\n\t 0.50,\n\t 0.76,\n\t 0.45,\n\t 0.93,\n\t 0.33,\n\t-0.00,\n\t 0.24,\n\t 1.33,\n\t 1.04,\n\t 0.94,\n\t 0.99,\n\t 1.06,\n\t 1.12,\n\t 1.52,\n\t 1.15\n]\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t236A660C2626C0C0004B70C9 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236A660B2626C0C0004B70C9 /* Utilities.swift */; };\n\t\t239088F82B0D6A4C0059761E /* SwiftImageReadWrite in Frameworks */ = {isa = PBXBuildFile; productRef = 239088F72B0D6A4C0059761E /* SwiftImageReadWrite */; };\n\t\t23EE63DF25D875C7000C85E4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE63DE25D875C7000C85E4 /* AppDelegate.swift */; };\n\t\t23EE63E125D875C7000C85E4 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE63E025D875C7000C85E4 /* ViewController.swift */; };\n\t\t23EE63E325D875C8000C85E4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 23EE63E225D875C8000C85E4 /* Assets.xcassets */; };\n\t\t23EE63E625D875C8000C85E4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23EE63E425D875C8000C85E4 /* Main.storyboard */; };\n\t\t23EE640925D87663000C85E4 /* DSFSparkline in Frameworks */ = {isa = PBXBuildFile; productRef = 23EE640825D87663000C85E4 /* DSFSparkline */; };\n\t\t23EE640C25D877E7000C85E4 /* CenteringClipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE640B25D877E7000C85E4 /* CenteringClipView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t236A660B2626C0C0004B70C9 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = \"<group>\"; };\n\t\t23EE63DB25D875C7000C85E4 /* Documentation Project.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Documentation Project.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23EE63DE25D875C7000C85E4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t23EE63E025D875C7000C85E4 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t23EE63E225D875C8000C85E4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t23EE63E525D875C8000C85E4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t23EE63E725D875C8000C85E4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23EE63E825D875C8000C85E4 /* Documentation_Project.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Documentation_Project.entitlements; sourceTree = \"<group>\"; };\n\t\t23EE640525D8763F000C85E4 /* DSFSparkline */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DSFSparkline; path = ../..; sourceTree = \"<group>\"; };\n\t\t23EE640B25D877E7000C85E4 /* CenteringClipView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CenteringClipView.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t23EE63D825D875C7000C85E4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t239088F82B0D6A4C0059761E /* SwiftImageReadWrite in Frameworks */,\n\t\t\t\t23EE640925D87663000C85E4 /* DSFSparkline in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t23EE63D225D875C7000C85E4 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23EE640525D8763F000C85E4 /* DSFSparkline */,\n\t\t\t\t23EE63DD25D875C7000C85E4 /* Documentation Project */,\n\t\t\t\t23EE63DC25D875C7000C85E4 /* Products */,\n\t\t\t\t23EE640725D87663000C85E4 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23EE63DC25D875C7000C85E4 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23EE63DB25D875C7000C85E4 /* Documentation Project.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23EE63DD25D875C7000C85E4 /* Documentation Project */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23EE63DE25D875C7000C85E4 /* AppDelegate.swift */,\n\t\t\t\t23EE63E025D875C7000C85E4 /* ViewController.swift */,\n\t\t\t\t23EE63E225D875C8000C85E4 /* Assets.xcassets */,\n\t\t\t\t23EE63E425D875C8000C85E4 /* Main.storyboard */,\n\t\t\t\t23EE640B25D877E7000C85E4 /* CenteringClipView.swift */,\n\t\t\t\t23EE63E725D875C8000C85E4 /* Info.plist */,\n\t\t\t\t23EE63E825D875C8000C85E4 /* Documentation_Project.entitlements */,\n\t\t\t\t236A660B2626C0C0004B70C9 /* Utilities.swift */,\n\t\t\t);\n\t\t\tpath = \"Documentation Project\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23EE640725D87663000C85E4 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t23EE63DA25D875C7000C85E4 /* Documentation Project */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23EE63EB25D875C8000C85E4 /* Build configuration list for PBXNativeTarget \"Documentation Project\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t23EE63D725D875C7000C85E4 /* Sources */,\n\t\t\t\t23EE63D825D875C7000C85E4 /* Frameworks */,\n\t\t\t\t23EE63D925D875C7000C85E4 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Documentation Project\";\n\t\t\tpackageProductDependencies = (\n\t\t\t\t23EE640825D87663000C85E4 /* DSFSparkline */,\n\t\t\t\t239088F72B0D6A4C0059761E /* SwiftImageReadWrite */,\n\t\t\t);\n\t\t\tproductName = \"Documentation Project\";\n\t\t\tproductReference = 23EE63DB25D875C7000C85E4 /* Documentation Project.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t23EE63D325D875C7000C85E4 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1240;\n\t\t\t\tLastUpgradeCheck = 1240;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t23EE63DA25D875C7000C85E4 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.4;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 23EE63D625D875C7000C85E4 /* Build configuration list for PBXProject \"Documentation Project\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 23EE63D225D875C7000C85E4;\n\t\t\tpackageReferences = (\n\t\t\t\t239088F62B0D6A4C0059761E /* XCRemoteSwiftPackageReference \"SwiftImageReadWrite\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 23EE63DC25D875C7000C85E4 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t23EE63DA25D875C7000C85E4 /* Documentation Project */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t23EE63D925D875C7000C85E4 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23EE63E325D875C8000C85E4 /* Assets.xcassets in Resources */,\n\t\t\t\t23EE63E625D875C8000C85E4 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t23EE63D725D875C7000C85E4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23EE63E125D875C7000C85E4 /* ViewController.swift in Sources */,\n\t\t\t\t23EE63DF25D875C7000C85E4 /* AppDelegate.swift in Sources */,\n\t\t\t\t236A660C2626C0C0004B70C9 /* Utilities.swift in Sources */,\n\t\t\t\t23EE640C25D877E7000C85E4 /* CenteringClipView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t23EE63E425D875C8000C85E4 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23EE63E525D875C8000C85E4 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t23EE63E925D875C8000C85E4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23EE63EA25D875C8000C85E4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t23EE63EC25D875C8000C85E4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"Documentation Project/Documentation_Project.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tINFOPLIST_FILE = \"Documentation Project/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.DSFSparkline.Documentation-Project\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23EE63ED25D875C8000C85E4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"Documentation Project/Documentation_Project.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tINFOPLIST_FILE = \"Documentation Project/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.DSFSparkline.Documentation-Project\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t23EE63D625D875C7000C85E4 /* Build configuration list for PBXProject \"Documentation Project\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23EE63E925D875C8000C85E4 /* Debug */,\n\t\t\t\t23EE63EA25D875C8000C85E4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23EE63EB25D875C8000C85E4 /* Build configuration list for PBXNativeTarget \"Documentation Project\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23EE63EC25D875C8000C85E4 /* Debug */,\n\t\t\t\t23EE63ED25D875C8000C85E4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t239088F62B0D6A4C0059761E /* XCRemoteSwiftPackageReference \"SwiftImageReadWrite\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/dagronf/SwiftImageReadWrite\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 1.6.0;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t239088F72B0D6A4C0059761E /* SwiftImageReadWrite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 239088F62B0D6A4C0059761E /* XCRemoteSwiftPackageReference \"SwiftImageReadWrite\" */;\n\t\t\tproductName = SwiftImageReadWrite;\n\t\t};\n\t\t23EE640825D87663000C85E4 /* DSFSparkline */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = DSFSparkline;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 23EE63D325D875C7000C85E4 /* Project object */;\n}\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Demos/Documentation Project/Documentation Project.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"SwiftImageReadWrite\",\n        \"repositoryURL\": \"https://github.com/dagronf/SwiftImageReadWrite\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"42ace2412279f18bc264bc306e96b51c36e12a33\",\n          \"version\": \"1.9.2\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Demos/Playground/Sparklines Playground.playground/Contents.swift",
    "content": "import Cocoa\n\nimport DSFSparkline\n\nvar str = \"Playground demonstrating the generation of a sparkline bitmap\"\n\n// Set this to 'true' to save the generated bitmaps out to the /tmp folder\nlet shouldSaveImage = false\n\nfunc SaveImage(image: NSImage, path: URL) {\n\n\tguard shouldSaveImage else {\n\t\treturn\n\t}\n\n\tguard let tiff = image.tiffRepresentation,\n\t\t\tlet imageRep = NSBitmapImageRep(data: tiff),\n\t\t\tlet pngData = imageRep.representation(using: .png, properties: [:]) else {\n\t\treturn\n\t}\n\n\tdo {\n\t\ttry pngData.write(to: path)\n\t}\n\tcatch {\n\t\tSwift.print(\"\\(error)\")\n\t}\n}\n\n// - MARK: Simple definitions\n\nlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\nlet biggersource = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 7, 6, 7, 8, 3, 3, 5, 3, 4, 1, 2, 9, 1, 3, 3], range: 0 ... 10)\nlet winloss = DSFSparkline.DataSource(values: [1, 1, 0, -1, 1, 1, 1, 0, 1, -1])\n\n// Simple fill color\nlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033,  0.277, 0.650, 1.000])!\nlet primaryStroke = baseColor // (gray: 0.0, alpha: 0.3))\nlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\ndo {\n\t// A method to replace a value within a DataSource\n\tlet replaceSource = DSFSparkline.DataSource(values: [0,1,2,3,4,5,6,7])\n\tSwift.print(replaceSource)\n\n\tvar currentData = replaceSource.data\n\tcurrentData.replaceSubrange(3...3, with: [33])\n\treplaceSource.set(values: currentData)\n\tSwift.print(replaceSource)\n}\n\n// MARK: - Simple line graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\tline.strokeWidth = 1\n\tline.primaryStrokeColor = primaryStroke\n\tline.primaryFill = primaryFill\n\tline.dataSource = source                    // Assign the datasource to the overlay\n\tbitmap.addOverlay(line)                     // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/line-simple-small.png\"))\n\n\t// Generate an image with retina scale\n\tline.interpolated = true\n\tlet image2 = bitmap.image(width: 50, height: 25, scale: 2)!\n\tSaveImage(image: image2, path: URL(fileURLWithPath: \"/tmp/line-simple-small-interpolated.png\"))\n\n\tlet attr = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)!\n\tvar message = NSMutableAttributedString(string: \"Inlined \")\n\tmessage.append(attr)\n\tmessage.append(NSAttributedString(string: \" line graph\"))\n\n\tdo {\n\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\t\tline.strokeWidth = 1\n\t\tline.primaryStrokeColor = primaryStroke\n\t\tline.primaryFill = primaryFill\n\t\tline.markerSize = 3\n\t\tline.dataSource = source                    // Assign the datasource to the overlay\n\t\tbitmap.addOverlay(line)                     // And add the overlay to the surface.\n\n\t\t// Generate an image with retina scale\n\t\tlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\t}\n\n}\n\n// MARK: - Simple bar graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\tlet bar = DSFSparklineOverlay.Bar()         // Create a bar overlay\n\tbar.dataSource = source                     // Assign the datasource to the overlay\n\tbar.primaryStrokeColor = baseColor\n\tbar.primaryFill = primaryFill\n\tbitmap.addOverlay(bar)                      // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/bar-simple-small.png\"))\n}\n\n// MARK: - Simple stackline graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()        // Create a bitmap surface\n\tlet stackline = DSFSparklineOverlay.Stackline()  // Create a stackline overlay\n\tstackline.dataSource = source                    // Assign the datasource to the overlay\n\tstackline.strokeWidth = 1\n\tstackline.primaryStrokeColor = baseColor\n\tstackline.primaryFill = primaryFill\n\tbitmap.addOverlay(stackline)                     // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/stackline-simple-small.png\"))\n}\n\n// MARK: - Simple dot graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface\n\tlet dot = DSFSparklineOverlay.Dot()          // Create a dot graph overlay\n\tdot.dataSource = biggersource                // Assign the datasource to the overlay\n\tdot.onColor = primaryStroke\n\tbitmap.addOverlay(dot)                       // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 50, height: 32, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/dot-simple-small.png\"))\n}\n\n// MARK: - Simple win-loss graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()       // Create a bitmap surface\n\tlet winLoss = DSFSparklineOverlay.WinLossTie()  // Create a win-loss graph overlay\n\twinLoss.dataSource = winloss                    // Assign the datasource to the overlay\n\twinLoss.centerLine = .init(color: DSFColor.gray, lineWidth: 0.5, lineDashStyle: [0.5, 0.5])\n\twinLoss.winStroke = primaryStroke\n\twinLoss.winFill = primaryFill\n\twinLoss.lossStroke = primaryStroke\n\twinLoss.lossFill = primaryFill\n\tbitmap.addOverlay(winLoss)                      // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 75, height: 12, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/win-loss-small.png\"))\n}\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()          // Create a bitmap surface\n\tlet winlosstie = DSFSparklineOverlay.WinLossTie()  // Create a win-loss graph overlay\n\twinlosstie.dataSource = winloss                    // Assign the datasource to the overlay\n\twinlosstie.winStroke = primaryStroke\n\twinlosstie.winFill = primaryFill\n\twinlosstie.lossStroke = primaryStroke\n\twinlosstie.lossFill = primaryFill\n\twinlosstie.tieStroke = primaryStroke\n\twinlosstie.tieFill = primaryFill\n\tbitmap.addOverlay(winlosstie)                      // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 75, height: 16, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/win-loss-tie-small.png\"))\n}\n\n// MARK: - Simple tablet graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface\n\tlet tablet = DSFSparklineOverlay.Tablet()    // Create a tablet graph overlay\n\ttablet.dataSource = winloss                  // Assign the datasource to the overlay\n\ttablet.lineWidth = 1\n\ttablet.winStrokeColor = primaryStroke\n\ttablet.winFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.7)!)\n\ttablet.lossStrokeColor = primaryStroke\n\tbitmap.addOverlay(tablet)                    // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 90, height: 16, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/tablet-small.png\"))\n}\n\n// MARK: - Simple stripes\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface\n\tlet stripe = DSFSparklineOverlay.Stripes()   // Create a stripe graph overlay\n\tstripe.integral = true\n\tstripe.barSpacing = 1\n\tstripe.dataSource = .init(values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n\tbitmap.addOverlay(stripe)                    // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 90, height: 16, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/stripes-small.png\"))\n}\n\n// MARK: - Simple pie\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()\n\tlet pieGraph = DSFSparklineOverlay.Pie()\n\tpieGraph.dataSource = DSFSparkline.StaticDataSource([10, 55, 20])\n\tpieGraph.lineWidth = 0.5\n\tpieGraph.strokeColor = CGColor.black\n\n\tbitmap.addOverlay(pieGraph)\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 18, height: 18, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/pie-simple.png\"))\n}\n\n\n// MARK: - simple databar\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()\n\tlet databar = DSFSparklineOverlay.DataBar()\n\tdatabar.dataSource = DSFSparkline.StaticDataSource([10, 20, 30])\n\tdatabar.lineWidth = 0.5\n\tdatabar.strokeColor = CGColor.black\n\n\tbitmap.addOverlay(databar)\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 50, height: 18, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/databar-simple.png\"))\n\n\t// databar with a maximum value defined\n\n\tdatabar.maximumTotalValue = 100\n\tdatabar.unsetColor = DSFColor.black.cgColor\n\n\t// Generate an image with retina scale\n\tlet image2 = bitmap.image(width: 50, height: 18, scale: 2)!\n\tSaveImage(image: image2, path: URL(fileURLWithPath: \"/tmp/databar-simple-maxvalue.png\"))\n}\n\n\n// MARK: - simple percent bar\n\ndo {\n\tlet style = DSFSparkline.PercentBar.Style()\n\tstyle.underBarColor = CGColor(gray: 0.8, alpha: 1.0)\n\tstyle.font = DSFFont(name: \"Menlo\", size: 10)!\n\tstyle.barEdgeInsets = DSFEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)\n\n\tlet bitmap = DSFSparklineSurface.Bitmap()\n\tlet percentbar = DSFSparklineOverlay.PercentBar(style: style, value: 0.3)\n\n\tbitmap.addOverlay(percentbar)\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 50, height: 18, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/percentbar.png\"))\n\n\tpercentbar.value = 0.7\n\tstyle.showLabel = false\n\tpercentbar.displayStyle = style\n\t// Generate an image with retina scale\n\tlet image2 = bitmap.image(width: 50, height: 18, scale: 2)!\n\tSaveImage(image: image2, path: URL(fileURLWithPath: \"/tmp/percentbar2.png\"))\n}\n\n\n\n/// MARK: - A more complex sparkline\n\ndo {\n\n\n\t// Line DataSource\n\n\tvar LineSource1: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 20, /*range: 0 ... 1,*/ zeroLineValue: 0.3)\n\t\td.push(values: [\n\t\t\t0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,\n\t\t\t0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n\t\t])\n\t\treturn d\n\t}()\n\n\tvar bitmap = DSFSparklineSurface.Bitmap()\n\n\t// highlight overlay 1\n\n\tdo {\n\t\tlet h1 = DSFSparklineOverlay.RangeHighlight()\n\t\th1.dataSource = LineSource1\n\t\th1.fill = DSFSparkline.Fill.Color(NSColor.gray.withAlphaComponent(0.2).cgColor)\n\t\th1.highlightRange = 0.3 ..< 0.7\n\t\tbitmap.addOverlay(h1)\n\t}\n\n\t// highlight overlay 2\n\n\tdo {\n\t\tlet h2 = DSFSparklineOverlay.RangeHighlight()\n\t\th2.dataSource = LineSource1\n\t\th2.fill = DSFSparkline.Fill.Color(NSColor.systemRed.withAlphaComponent(0.1).cgColor)\n\t\th2.highlightRange = 0.0 ..< 0.3\n\t\tbitmap.addOverlay(h2)\n\t}\n\n\t// zero-line\n\n\tdo {\n\t\tlet zeroLine = DSFSparklineOverlay.ZeroLine()\n\t\tzeroLine.dataSource = LineSource1\n\t\tbitmap.addOverlay(zeroLine)\n\t}\n\n\t// Stack overlay\n\n\tdo {\n\t\tlet stack = DSFSparklineOverlay.Stackline()\n\t\tstack.dataSource = LineSource1\n\t\tstack.shadow = NSShadow(blurRadius: 1.0, offset: CGSize(width: 0.5, height: -0.5), color: DSFColor.black.withAlphaComponent(0.3))\n\t\tstack.centeredAtZeroLine = true\n\t\tstack.strokeWidth = 1\n\t\tstack.primaryStrokeColor = NSColor.systemPurple.cgColor\n\t\tstack.primaryFill = DSFSparkline.Fill.Color(NSColor.systemPurple.withAlphaComponent(0.7).cgColor)\n\t\tstack.secondaryStrokeColor = NSColor.systemPink.cgColor\n\t\tstack.secondaryFill = DSFSparkline.Fill.Color(NSColor.systemPink.withAlphaComponent(0.7).cgColor)\n\t\tbitmap.addOverlay(stack)\n\t}\n\n\t// Generate a bitmap\n\n\tlet r = CGSize(width: 200, height: 40)\n\tlet image = bitmap.image(size: r, scale: 2)\n\n}\n\n// MARK: - Simple wiper graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()      // Create a bitmap surface\n\tlet wiper = DSFSparklineOverlay.WiperGauge()   // Create a wiper graph overlay\n\twiper.value = 0.75\n\twiper.valueColor = DSFSparkline.ValueBasedFill(flatColor: baseColor)\n\tbitmap.addOverlay(wiper)                       // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 40, height: 20, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/wiper-small.png\"))\n}\n\n// MARK: - Activity Graph\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()          // Create a bitmap surface\n\tlet activity = DSFSparklineOverlay.ActivityGrid()\n\tlet data: [CGFloat] = (0 ... 100).map { _ in CGFloat.random(in: 0...100) }\n\tactivity.dataSource = .init(data)\n\n\tbitmap.addOverlay(activity)                       // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 300, height: 100, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/activity-basic-1.png\"))\n\n\tactivity.verticalCellCount = 10\n\tactivity.cellDimension = 6\n\tactivity.cellSpacing = 1\n\tactivity.cellFillScheme = DSFSparkline.ActivityGrid.CellStyle.DefaultLight\n\tlet image2 = bitmap.image(width: 300, height: 100, scale: 2)!\n\tSaveImage(image: image2, path: URL(fileURLWithPath: \"/tmp/activity-basic-2.png\"))\n}\n\n// MARK: Circular Gauge\n\ndo {\n\tlet bitmap = DSFSparklineSurface.Bitmap()         // Create a bitmap surface\n\tlet wiper = DSFSparklineOverlay.CircularGauge()   // Create a wiper graph overlay\n\twiper.value = 0.65\n\t//wiper.valueColor = DSFSparkline.ValueBasedFill(flatColor: baseColor)\n\tbitmap.addOverlay(wiper)                       // And add the overlay to the surface.\n\n\t// Generate an image with retina scale\n\tlet image = bitmap.image(width: 40, height: 40, scale: 2)!\n\tSaveImage(image: image, path: URL(fileURLWithPath: \"/tmp/circular-gauge-small.png\"))\n}\n"
  },
  {
    "path": "Demos/Playground/Sparklines Playground.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos' buildActiveScheme='true'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Demos/Playground/Sparklines Playground.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Demos/Playground/Sparklines Playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:../..\">\n   </FileRef>\n   <FileRef\n      location = \"group:./Sparklines Playground.playground\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 60;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t239716B923B554DD0034A4D4 /* All Demos */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 239716BC23B554DD0034A4D4 /* Build configuration list for PBXAggregateTarget \"All Demos\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t23369E8525D65B2D00A40023 /* PBXTargetDependency */,\n\t\t\t\t23369E8725D65B2D00A40023 /* PBXTargetDependency */,\n\t\t\t\t239716C023B554E70034A4D4 /* PBXTargetDependency */,\n\t\t\t\t239716BE23B554E50034A4D4 /* PBXTargetDependency */,\n\t\t\t\t239716C223B554E80034A4D4 /* PBXTargetDependency */,\n\t\t\t\t23E2279A23B5A6EF00E59122 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"All Demos\";\n\t\t\tproductName = \"Add Demos\";\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t23102B5423B0245A001A621D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102B5323B0245A001A621D /* AppDelegate.swift */; };\n\t\t23102B5623B0245A001A621D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102B5523B0245A001A621D /* ViewController.swift */; };\n\t\t23102B5823B0245B001A621D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 23102B5723B0245B001A621D /* Assets.xcassets */; };\n\t\t23102B5B23B0245B001A621D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23102B5923B0245B001A621D /* Main.storyboard */; };\n\t\t23102BC423B02AED001A621D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102BC323B02AED001A621D /* AppDelegate.swift */; };\n\t\t23102BC623B02AED001A621D /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102BC523B02AED001A621D /* SceneDelegate.swift */; };\n\t\t23102BC823B02AED001A621D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102BC723B02AED001A621D /* ViewController.swift */; };\n\t\t23102BCB23B02AED001A621D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23102BC923B02AED001A621D /* Main.storyboard */; };\n\t\t23102BCD23B02AEE001A621D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 23102BCC23B02AEE001A621D /* Assets.xcassets */; };\n\t\t23102BD023B02AEE001A621D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23102BCE23B02AEE001A621D /* LaunchScreen.storyboard */; };\n\t\t23102BDD23B02B0A001A621D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 23102BDC23B02B0A001A621D /* AppDelegate.m */; };\n\t\t23102BE023B02B0A001A621D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 23102BDF23B02B0A001A621D /* ViewController.m */; };\n\t\t23102BE223B02B0B001A621D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 23102BE123B02B0B001A621D /* Assets.xcassets */; };\n\t\t23102BE523B02B0B001A621D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23102BE323B02B0B001A621D /* Main.storyboard */; };\n\t\t23102BE823B02B0B001A621D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 23102BE723B02B0B001A621D /* main.m */; };\n\t\t23102BF423B02B32001A621D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102BF323B02B32001A621D /* AppDelegate.swift */; };\n\t\t23102BF623B02B32001A621D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102BF523B02B32001A621D /* ViewController.swift */; };\n\t\t23102BF923B02B32001A621D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23102BF723B02B32001A621D /* Main.storyboard */; };\n\t\t23102BFB23B02B33001A621D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 23102BFA23B02B33001A621D /* Assets.xcassets */; };\n\t\t23102BFE23B02B33001A621D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23102BFC23B02B33001A621D /* LaunchScreen.storyboard */; };\n\t\t23102C0423B03315001A621D /* cpuUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23102C0323B03315001A621D /* cpuUsage.swift */; };\n\t\t2322C06B262651D5007D8112 /* TestingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2322C06A262651D5007D8112 /* TestingView.swift */; };\n\t\t2322C06C262651D5007D8112 /* TestingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2322C06A262651D5007D8112 /* TestingView.swift */; };\n\t\t232BAF6D25EB16210090C447 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232BAF6C25EB16210090C447 /* SwiftUIView.swift */; };\n\t\t232BAF6E25EB16210090C447 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232BAF6C25EB16210090C447 /* SwiftUIView.swift */; };\n\t\t232D9ECE25EC7133004DFAFC /* SuperCoolLineSpark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232D9ECD25EC7133004DFAFC /* SuperCoolLineSpark.swift */; };\n\t\t232D9ECF25EC7133004DFAFC /* SuperCoolLineSpark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232D9ECD25EC7133004DFAFC /* SuperCoolLineSpark.swift */; };\n\t\t232F732323B5BE2A00FA3A3F /* GridViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232F732223B5BE2A00FA3A3F /* GridViewController.swift */; };\n\t\t2346EF3025E8D13A00050570 /* SwiftUIContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2346EF2F25E8D13A00050570 /* SwiftUIContentView.swift */; };\n\t\t2346EF3125E8D13A00050570 /* SwiftUIContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2346EF2F25E8D13A00050570 /* SwiftUIContentView.swift */; };\n\t\t23529A7425E84D2A00DFA52D /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23529A7325E84D2A00DFA52D /* Extensions.swift */; };\n\t\t23529A7525E84D2A00DFA52D /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23529A7325E84D2A00DFA52D /* Extensions.swift */; };\n\t\t235A585B2603181A00266642 /* PercentBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 235A585A2603181A00266642 /* PercentBarView.swift */; };\n\t\t235A585C2603181A00266642 /* PercentBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 235A585A2603181A00266642 /* PercentBarView.swift */; };\n\t\t236417E729628C0600C8A1D2 /* WiperGaugeDemoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236417E629628C0600C8A1D2 /* WiperGaugeDemoView.swift */; };\n\t\t236417E829628C0600C8A1D2 /* WiperGaugeDemoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236417E629628C0600C8A1D2 /* WiperGaugeDemoView.swift */; };\n\t\t236A57FB25C1392B00F2BACF /* SwiftUI_Sparkline_DemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236A57E925C1392A00F2BACF /* SwiftUI_Sparkline_DemoApp.swift */; };\n\t\t236A57FC25C1392B00F2BACF /* SwiftUI_Sparkline_DemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236A57E925C1392A00F2BACF /* SwiftUI_Sparkline_DemoApp.swift */; };\n\t\t236A57FD25C1392B00F2BACF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236A57EA25C1392A00F2BACF /* ContentView.swift */; };\n\t\t236A57FE25C1392B00F2BACF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236A57EA25C1392A00F2BACF /* ContentView.swift */; };\n\t\t236A57FF25C1392B00F2BACF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 236A57EB25C1392B00F2BACF /* Assets.xcassets */; };\n\t\t236A580025C1392B00F2BACF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 236A57EB25C1392B00F2BACF /* Assets.xcassets */; };\n\t\t237B824725E77B3800B3DE23 /* BarDemoContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 237B824625E77B3800B3DE23 /* BarDemoContentView.swift */; };\n\t\t237B824825E77B3800B3DE23 /* BarDemoContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 237B824625E77B3800B3DE23 /* BarDemoContentView.swift */; };\n\t\t237B827825E7891E00B3DE23 /* BitmapGenerationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 237B827725E7891D00B3DE23 /* BitmapGenerationView.swift */; };\n\t\t237B827925E7891E00B3DE23 /* BitmapGenerationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 237B827725E7891D00B3DE23 /* BitmapGenerationView.swift */; };\n\t\t238053C725DCC2B100B996B5 /* ActiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238053C625DCC2B100B996B5 /* ActiveView.swift */; };\n\t\t238053C825DCC2B100B996B5 /* ActiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238053C625DCC2B100B996B5 /* ActiveView.swift */; };\n\t\t238053E525DCD14600B996B5 /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238053E425DCD14600B996B5 /* OverlayView.swift */; };\n\t\t238053E625DCD14600B996B5 /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238053E425DCD14600B996B5 /* OverlayView.swift */; };\n\t\t238DB6DC25EB2141009197AB /* StripesOverlaidView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238DB6DB25EB2141009197AB /* StripesOverlaidView.swift */; };\n\t\t238DB6DD25EB2141009197AB /* StripesOverlaidView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238DB6DB25EB2141009197AB /* StripesOverlaidView.swift */; };\n\t\t238DB6EA25EB3A2E009197AB /* TabletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238DB6E925EB3A2E009197AB /* TabletView.swift */; };\n\t\t238DB6EB25EB3A2F009197AB /* TabletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238DB6E925EB3A2E009197AB /* TabletView.swift */; };\n\t\t23905CA12B5B5D00007B7769 /* CircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23905CA02B5B5D00007B7769 /* CircularProgress.swift */; };\n\t\t23905CA22B5B5D00007B7769 /* CircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23905CA02B5B5D00007B7769 /* CircularProgress.swift */; };\n\t\t239DE4042BA177D300E13208 /* CircularGaugeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239DE4032BA177D300E13208 /* CircularGaugeView.swift */; };\n\t\t239DE4052BA177D300E13208 /* CircularGaugeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239DE4032BA177D300E13208 /* CircularGaugeView.swift */; };\n\t\t23B006F72DDD61C700D074A0 /* DSFSparkline in Frameworks */ = {isa = PBXBuildFile; productRef = 23B006F62DDD61C700D074A0 /* DSFSparkline */; };\n\t\t23B006F92DDD61FB00D074A0 /* DSFSparkline-shared in Frameworks */ = {isa = PBXBuildFile; productRef = 23B006F82DDD61FB00D074A0 /* DSFSparkline-shared */; };\n\t\t23B006FA2DDD61FB00D074A0 /* DSFSparkline-shared in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 23B006F82DDD61FB00D074A0 /* DSFSparkline-shared */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\t23B006FD2DDD625E00D074A0 /* DSFSparkline in Frameworks */ = {isa = PBXBuildFile; productRef = 23B006FC2DDD625E00D074A0 /* DSFSparkline */; };\n\t\t23B006FF2DDD63E900D074A0 /* DSFSparkline-shared in Frameworks */ = {isa = PBXBuildFile; productRef = 23B006FE2DDD63E900D074A0 /* DSFSparkline-shared */; };\n\t\t23B007002DDD63E900D074A0 /* DSFSparkline-shared in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 23B006FE2DDD63E900D074A0 /* DSFSparkline-shared */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\t23B007032DDD652800D074A0 /* DSFSparkline in Frameworks */ = {isa = PBXBuildFile; productRef = 23B007022DDD652800D074A0 /* DSFSparkline */; };\n\t\t23B007052DDD65A800D074A0 /* DSFSparkline in Frameworks */ = {isa = PBXBuildFile; productRef = 23B007042DDD65A800D074A0 /* DSFSparkline */; };\n\t\t23B007072DDD65B800D074A0 /* DSFSparkline-shared in Frameworks */ = {isa = PBXBuildFile; productRef = 23B007062DDD65B800D074A0 /* DSFSparkline-shared */; };\n\t\t23B007082DDD65B800D074A0 /* DSFSparkline-shared in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 23B007062DDD65B800D074A0 /* DSFSparkline-shared */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\t23BC66862B0DD82A0064FF62 /* ActivityGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23BC66852B0DD82A0064FF62 /* ActivityGridView.swift */; };\n\t\t23BC66872B0DD82A0064FF62 /* ActivityGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23BC66852B0DD82A0064FF62 /* ActivityGridView.swift */; };\n\t\t23D10B1025ED9EB500BBE555 /* AttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D10B0F25ED9EB500BBE555 /* AttributedString.swift */; };\n\t\t23D10B1125ED9EB500BBE555 /* AttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D10B0F25ED9EB500BBE555 /* AttributedString.swift */; };\n\t\t23E2278C23B5846E00E59122 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E2278B23B5846E00E59122 /* AppDelegate.swift */; };\n\t\t23E2278E23B5846E00E59122 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E2278D23B5846E00E59122 /* ViewController.swift */; };\n\t\t23E2279023B5846E00E59122 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 23E2278F23B5846E00E59122 /* Assets.xcassets */; };\n\t\t23E2279323B5846E00E59122 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 23E2279123B5846E00E59122 /* Main.storyboard */; };\n\t\t23FC810025DB3FC50047A800 /* ReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC80FF25DB3FC40047A800 /* ReportView.swift */; };\n\t\t23FC810125DB3FC50047A800 /* ReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC80FF25DB3FC40047A800 /* ReportView.swift */; };\n\t\t23FC812025DB47A20047A800 /* WinLossGraphContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC811F25DB47A20047A800 /* WinLossGraphContentView.swift */; };\n\t\t23FC812125DB47A20047A800 /* WinLossGraphContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC811F25DB47A20047A800 /* WinLossGraphContentView.swift */; };\n\t\t23FC814025DB4E5D0047A800 /* LineDemoContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC813F25DB4E5D0047A800 /* LineDemoContentView.swift */; };\n\t\t23FC814125DB4E5D0047A800 /* LineDemoContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC813F25DB4E5D0047A800 /* LineDemoContentView.swift */; };\n\t\t23FC817525DB547E0047A800 /* StackLineDemoContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC817425DB547E0047A800 /* StackLineDemoContentView.swift */; };\n\t\t23FC817625DB547E0047A800 /* StackLineDemoContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC817425DB547E0047A800 /* StackLineDemoContentView.swift */; };\n\t\t23FC819325DB586B0047A800 /* PieGraphDemoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC819225DB586B0047A800 /* PieGraphDemoView.swift */; };\n\t\t23FC819425DB586B0047A800 /* PieGraphDemoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC819225DB586B0047A800 /* PieGraphDemoView.swift */; };\n\t\t23FC819F25DB59160047A800 /* DataBarGraphContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC819E25DB59160047A800 /* DataBarGraphContent.swift */; };\n\t\t23FC81A025DB59160047A800 /* DataBarGraphContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC819E25DB59160047A800 /* DataBarGraphContent.swift */; };\n\t\t23FC81B425DB59E70047A800 /* DotGraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC81B325DB59E70047A800 /* DotGraphView.swift */; };\n\t\t23FC81B525DB59E70047A800 /* DotGraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC81B325DB59E70047A800 /* DotGraphView.swift */; };\n\t\t23FC81DD25DB60760047A800 /* StripesDemoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC81DC25DB60760047A800 /* StripesDemoView.swift */; };\n\t\t23FC81DE25DB60760047A800 /* StripesDemoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FC81DC25DB60760047A800 /* StripesDemoView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t23369E8425D65B2D00A40023 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 23102B4523B0165B001A621D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 236A57EF25C1392B00F2BACF;\n\t\t\tremoteInfo = \"SwiftUI Sparkline Demo (iOS)\";\n\t\t};\n\t\t23369E8625D65B2D00A40023 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 23102B4523B0165B001A621D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 236A57F625C1392B00F2BACF;\n\t\t\tremoteInfo = \"SwiftUI Sparkline Demo (macOS)\";\n\t\t};\n\t\t239716BD23B554E50034A4D4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 23102B4523B0165B001A621D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 23102B4F23B0245A001A621D;\n\t\t\tremoteInfo = \"macOS Sparkline Demo\";\n\t\t};\n\t\t239716BF23B554E70034A4D4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 23102B4523B0165B001A621D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 23102BC023B02AED001A621D;\n\t\t\tremoteInfo = \"iOS Sparkline Demo\";\n\t\t};\n\t\t239716C123B554E80034A4D4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 23102B4523B0165B001A621D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 23102BD823B02B0A001A621D;\n\t\t\tremoteInfo = \"macOS Sparkline Demo Objc\";\n\t\t};\n\t\t23E2279923B5A6EF00E59122 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 23102B4523B0165B001A621D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 23E2278823B5846E00E59122;\n\t\t\tremoteInfo = \"macOS Table Demo\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t23B006FB2DDD61FB00D074A0 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t23B006FA2DDD61FB00D074A0 /* DSFSparkline-shared in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23B007012DDD63E900D074A0 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t23B007002DDD63E900D074A0 /* DSFSparkline-shared in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23B007092DDD65B800D074A0 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t23B007082DDD65B800D074A0 /* DSFSparkline-shared in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t23102B5023B0245A001A621D /* macOS Sparkline Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"macOS Sparkline Demo.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23102B5323B0245A001A621D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t23102B5523B0245A001A621D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t23102B5723B0245B001A621D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t23102B5A23B0245B001A621D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t23102B5C23B0245B001A621D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23102B5D23B0245B001A621D /* macOS_Sparkline_Demo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS_Sparkline_Demo.entitlements; sourceTree = \"<group>\"; };\n\t\t23102BC123B02AED001A621D /* iOS Sparkline Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"iOS Sparkline Demo.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23102BC323B02AED001A621D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t23102BC523B02AED001A621D /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = \"<group>\"; };\n\t\t23102BC723B02AED001A621D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t23102BCA23B02AED001A621D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t23102BCC23B02AEE001A621D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t23102BCF23B02AEE001A621D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t23102BD123B02AEE001A621D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23102BD923B02B0A001A621D /* macOS Sparkline Demo Objc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"macOS Sparkline Demo Objc.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23102BDB23B02B0A001A621D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t23102BDC23B02B0A001A621D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t23102BDE23B02B0A001A621D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = \"<group>\"; };\n\t\t23102BDF23B02B0A001A621D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = \"<group>\"; };\n\t\t23102BE123B02B0B001A621D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t23102BE423B02B0B001A621D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t23102BE623B02B0B001A621D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23102BE723B02B0B001A621D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t23102BE923B02B0B001A621D /* macOS_Sparkline_Demo_Objc.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS_Sparkline_Demo_Objc.entitlements; sourceTree = \"<group>\"; };\n\t\t23102BF123B02B32001A621D /* tvOS Sparkline Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"tvOS Sparkline Demo.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23102BF323B02B32001A621D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t23102BF523B02B32001A621D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t23102BF823B02B32001A621D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t23102BFA23B02B33001A621D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t23102BFD23B02B33001A621D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t23102BFF23B02B33001A621D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23102C0323B03315001A621D /* cpuUsage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = cpuUsage.swift; sourceTree = \"<group>\"; };\n\t\t2322C06A262651D5007D8112 /* TestingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestingView.swift; sourceTree = \"<group>\"; };\n\t\t232BAF6C25EB16210090C447 /* SwiftUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = \"<group>\"; };\n\t\t232D9ECD25EC7133004DFAFC /* SuperCoolLineSpark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuperCoolLineSpark.swift; sourceTree = \"<group>\"; };\n\t\t232F732223B5BE2A00FA3A3F /* GridViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridViewController.swift; sourceTree = \"<group>\"; };\n\t\t2346EF2F25E8D13A00050570 /* SwiftUIContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIContentView.swift; sourceTree = \"<group>\"; };\n\t\t23529A5825E847B900DFA52D /* iOS Sparkline Demo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = \"iOS Sparkline Demo.entitlements\"; sourceTree = \"<group>\"; };\n\t\t23529A7325E84D2A00DFA52D /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t235A585A2603181A00266642 /* PercentBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PercentBarView.swift; sourceTree = \"<group>\"; };\n\t\t236417E629628C0600C8A1D2 /* WiperGaugeDemoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WiperGaugeDemoView.swift; sourceTree = \"<group>\"; };\n\t\t236A57E925C1392A00F2BACF /* SwiftUI_Sparkline_DemoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI_Sparkline_DemoApp.swift; sourceTree = \"<group>\"; };\n\t\t236A57EA25C1392A00F2BACF /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t236A57EB25C1392B00F2BACF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t236A57F025C1392B00F2BACF /* SwiftUI Sparkline Demo (iOS).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"SwiftUI Sparkline Demo (iOS).app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t236A57F225C1392B00F2BACF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t236A57F725C1392B00F2BACF /* SwiftUI Sparkline Demo (macOS).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"SwiftUI Sparkline Demo (macOS).app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t236A57F925C1392B00F2BACF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t236A57FA25C1392B00F2BACF /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = \"<group>\"; };\n\t\t237B824625E77B3800B3DE23 /* BarDemoContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarDemoContentView.swift; sourceTree = \"<group>\"; };\n\t\t237B827725E7891D00B3DE23 /* BitmapGenerationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitmapGenerationView.swift; sourceTree = \"<group>\"; };\n\t\t238053C625DCC2B100B996B5 /* ActiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveView.swift; sourceTree = \"<group>\"; };\n\t\t238053E425DCD14600B996B5 /* OverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = \"<group>\"; };\n\t\t238DB6DB25EB2141009197AB /* StripesOverlaidView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripesOverlaidView.swift; sourceTree = \"<group>\"; };\n\t\t238DB6E925EB3A2E009197AB /* TabletView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabletView.swift; sourceTree = \"<group>\"; };\n\t\t23905CA02B5B5D00007B7769 /* CircularProgress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircularProgress.swift; sourceTree = \"<group>\"; };\n\t\t239DE4032BA177D300E13208 /* CircularGaugeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircularGaugeView.swift; sourceTree = \"<group>\"; };\n\t\t23BC66852B0DD82A0064FF62 /* ActivityGridView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityGridView.swift; sourceTree = \"<group>\"; };\n\t\t23D10B0F25ED9EB500BBE555 /* AttributedString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedString.swift; sourceTree = \"<group>\"; };\n\t\t23E2278923B5846E00E59122 /* macOS Table Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"macOS Table Demo.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23E2278B23B5846E00E59122 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t23E2278D23B5846E00E59122 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t23E2278F23B5846E00E59122 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t23E2279223B5846E00E59122 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t23E2279423B5846E00E59122 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23E2279523B5846E00E59122 /* macOS_Table_Demo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS_Table_Demo.entitlements; sourceTree = \"<group>\"; };\n\t\t23FC80FF25DB3FC40047A800 /* ReportView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportView.swift; sourceTree = \"<group>\"; };\n\t\t23FC811F25DB47A20047A800 /* WinLossGraphContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WinLossGraphContentView.swift; sourceTree = \"<group>\"; };\n\t\t23FC813F25DB4E5D0047A800 /* LineDemoContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineDemoContentView.swift; sourceTree = \"<group>\"; };\n\t\t23FC817425DB547E0047A800 /* StackLineDemoContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackLineDemoContentView.swift; sourceTree = \"<group>\"; };\n\t\t23FC819225DB586B0047A800 /* PieGraphDemoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PieGraphDemoView.swift; sourceTree = \"<group>\"; };\n\t\t23FC819E25DB59160047A800 /* DataBarGraphContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataBarGraphContent.swift; sourceTree = \"<group>\"; };\n\t\t23FC81B325DB59E70047A800 /* DotGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DotGraphView.swift; sourceTree = \"<group>\"; };\n\t\t23FC81DC25DB60760047A800 /* StripesDemoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripesDemoView.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t23102B4D23B0245A001A621D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B006F72DDD61C700D074A0 /* DSFSparkline in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BBE23B02AED001A621D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B006FF2DDD63E900D074A0 /* DSFSparkline-shared in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BD623B02B0A001A621D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B006F92DDD61FB00D074A0 /* DSFSparkline-shared in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BEE23B02B32001A621D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B007032DDD652800D074A0 /* DSFSparkline in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t236A57ED25C1392B00F2BACF /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B007072DDD65B800D074A0 /* DSFSparkline-shared in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t236A57F425C1392B00F2BACF /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B007052DDD65A800D074A0 /* DSFSparkline in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23E2278623B5846E00E59122 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23B006FD2DDD625E00D074A0 /* DSFSparkline in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t23102B4423B0165B001A621D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23E2278A23B5846E00E59122 /* macOS Table Demo */,\n\t\t\t\t23102B5223B0245A001A621D /* macOS Sparkline Demo */,\n\t\t\t\t23102BDA23B02B0A001A621D /* macOS Sparkline Demo Objc */,\n\t\t\t\t23102BC223B02AED001A621D /* iOS Sparkline Demo */,\n\t\t\t\t23102BF223B02B32001A621D /* tvOS Sparkline Demo */,\n\t\t\t\t238423FD25C74EE400A2A861 /* SwiftUI Sparkline Crossplatform */,\n\t\t\t\t23B006F52DDD61C700D074A0 /* Frameworks */,\n\t\t\t\t23102B5123B0245A001A621D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102B5123B0245A001A621D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23102B5023B0245A001A621D /* macOS Sparkline Demo.app */,\n\t\t\t\t23102BC123B02AED001A621D /* iOS Sparkline Demo.app */,\n\t\t\t\t23102BD923B02B0A001A621D /* macOS Sparkline Demo Objc.app */,\n\t\t\t\t23102BF123B02B32001A621D /* tvOS Sparkline Demo.app */,\n\t\t\t\t23E2278923B5846E00E59122 /* macOS Table Demo.app */,\n\t\t\t\t236A57F025C1392B00F2BACF /* SwiftUI Sparkline Demo (iOS).app */,\n\t\t\t\t236A57F725C1392B00F2BACF /* SwiftUI Sparkline Demo (macOS).app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102B5223B0245A001A621D /* macOS Sparkline Demo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23102B5323B0245A001A621D /* AppDelegate.swift */,\n\t\t\t\t23102B5523B0245A001A621D /* ViewController.swift */,\n\t\t\t\t23102C0323B03315001A621D /* cpuUsage.swift */,\n\t\t\t\t23102B5723B0245B001A621D /* Assets.xcassets */,\n\t\t\t\t23102B5923B0245B001A621D /* Main.storyboard */,\n\t\t\t\t23102B5C23B0245B001A621D /* Info.plist */,\n\t\t\t\t23102B5D23B0245B001A621D /* macOS_Sparkline_Demo.entitlements */,\n\t\t\t);\n\t\t\tpath = \"macOS Sparkline Demo\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BC223B02AED001A621D /* iOS Sparkline Demo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23529A5825E847B900DFA52D /* iOS Sparkline Demo.entitlements */,\n\t\t\t\t23102BC323B02AED001A621D /* AppDelegate.swift */,\n\t\t\t\t23102BC523B02AED001A621D /* SceneDelegate.swift */,\n\t\t\t\t23102BC723B02AED001A621D /* ViewController.swift */,\n\t\t\t\t23102BC923B02AED001A621D /* Main.storyboard */,\n\t\t\t\t23102BCC23B02AEE001A621D /* Assets.xcassets */,\n\t\t\t\t23102BCE23B02AEE001A621D /* LaunchScreen.storyboard */,\n\t\t\t\t23102BD123B02AEE001A621D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = \"iOS Sparkline Demo\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BDA23B02B0A001A621D /* macOS Sparkline Demo Objc */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BDB23B02B0A001A621D /* AppDelegate.h */,\n\t\t\t\t23102BDC23B02B0A001A621D /* AppDelegate.m */,\n\t\t\t\t23102BDE23B02B0A001A621D /* ViewController.h */,\n\t\t\t\t23102BDF23B02B0A001A621D /* ViewController.m */,\n\t\t\t\t23102BE123B02B0B001A621D /* Assets.xcassets */,\n\t\t\t\t23102BE323B02B0B001A621D /* Main.storyboard */,\n\t\t\t\t23102BE623B02B0B001A621D /* Info.plist */,\n\t\t\t\t23102BE723B02B0B001A621D /* main.m */,\n\t\t\t\t23102BE923B02B0B001A621D /* macOS_Sparkline_Demo_Objc.entitlements */,\n\t\t\t);\n\t\t\tpath = \"macOS Sparkline Demo Objc\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BF223B02B32001A621D /* tvOS Sparkline Demo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BF323B02B32001A621D /* AppDelegate.swift */,\n\t\t\t\t23102BF523B02B32001A621D /* ViewController.swift */,\n\t\t\t\t23102BF723B02B32001A621D /* Main.storyboard */,\n\t\t\t\t23102BFA23B02B33001A621D /* Assets.xcassets */,\n\t\t\t\t23102BFC23B02B33001A621D /* LaunchScreen.storyboard */,\n\t\t\t\t23102BFF23B02B33001A621D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = \"tvOS Sparkline Demo\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t232BAF6B25EB16000090C447 /* SwiftUI-Overlays */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2346EF2F25E8D13A00050570 /* SwiftUIContentView.swift */,\n\t\t\t\t238053E425DCD14600B996B5 /* OverlayView.swift */,\n\t\t\t\t232BAF6C25EB16210090C447 /* SwiftUIView.swift */,\n\t\t\t\t238DB6DB25EB2141009197AB /* StripesOverlaidView.swift */,\n\t\t\t\t232D9ECD25EC7133004DFAFC /* SuperCoolLineSpark.swift */,\n\t\t\t);\n\t\t\tpath = \"SwiftUI-Overlays\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t236A57E825C1392A00F2BACF /* Shared */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t238053C625DCC2B100B996B5 /* ActiveView.swift */,\n\t\t\t\t23BC66852B0DD82A0064FF62 /* ActivityGridView.swift */,\n\t\t\t\t236A57EB25C1392B00F2BACF /* Assets.xcassets */,\n\t\t\t\t23D10B0F25ED9EB500BBE555 /* AttributedString.swift */,\n\t\t\t\t239DE4032BA177D300E13208 /* CircularGaugeView.swift */,\n\t\t\t\t23905CA02B5B5D00007B7769 /* CircularProgress.swift */,\n\t\t\t\t237B824625E77B3800B3DE23 /* BarDemoContentView.swift */,\n\t\t\t\t237B827725E7891D00B3DE23 /* BitmapGenerationView.swift */,\n\t\t\t\t236A57EA25C1392A00F2BACF /* ContentView.swift */,\n\t\t\t\t23FC819E25DB59160047A800 /* DataBarGraphContent.swift */,\n\t\t\t\t23FC81B325DB59E70047A800 /* DotGraphView.swift */,\n\t\t\t\t23529A7325E84D2A00DFA52D /* Extensions.swift */,\n\t\t\t\t23FC813F25DB4E5D0047A800 /* LineDemoContentView.swift */,\n\t\t\t\t235A585A2603181A00266642 /* PercentBarView.swift */,\n\t\t\t\t23FC819225DB586B0047A800 /* PieGraphDemoView.swift */,\n\t\t\t\t23FC80FF25DB3FC40047A800 /* ReportView.swift */,\n\t\t\t\t23FC817425DB547E0047A800 /* StackLineDemoContentView.swift */,\n\t\t\t\t23FC81DC25DB60760047A800 /* StripesDemoView.swift */,\n\t\t\t\t236A57E925C1392A00F2BACF /* SwiftUI_Sparkline_DemoApp.swift */,\n\t\t\t\t232BAF6B25EB16000090C447 /* SwiftUI-Overlays */,\n\t\t\t\t238DB6E925EB3A2E009197AB /* TabletView.swift */,\n\t\t\t\t23FC811F25DB47A20047A800 /* WinLossGraphContentView.swift */,\n\t\t\t\t236417E629628C0600C8A1D2 /* WiperGaugeDemoView.swift */,\n\t\t\t\t2322C06A262651D5007D8112 /* TestingView.swift */,\n\t\t\t);\n\t\t\tpath = Shared;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t236A57F125C1392B00F2BACF /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t236A57F225C1392B00F2BACF /* Info.plist */,\n\t\t\t);\n\t\t\tpath = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t236A57F825C1392B00F2BACF /* macOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t236A57F925C1392B00F2BACF /* Info.plist */,\n\t\t\t\t236A57FA25C1392B00F2BACF /* macOS.entitlements */,\n\t\t\t);\n\t\t\tpath = macOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t238423FD25C74EE400A2A861 /* SwiftUI Sparkline Crossplatform */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t236A57E825C1392A00F2BACF /* Shared */,\n\t\t\t\t236A57F125C1392B00F2BACF /* iOS */,\n\t\t\t\t236A57F825C1392B00F2BACF /* macOS */,\n\t\t\t);\n\t\t\tpath = \"SwiftUI Sparkline Crossplatform\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23B006F52DDD61C700D074A0 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23E2278A23B5846E00E59122 /* macOS Table Demo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23E2278B23B5846E00E59122 /* AppDelegate.swift */,\n\t\t\t\t23E2278D23B5846E00E59122 /* ViewController.swift */,\n\t\t\t\t23E2278F23B5846E00E59122 /* Assets.xcassets */,\n\t\t\t\t23E2279123B5846E00E59122 /* Main.storyboard */,\n\t\t\t\t23E2279423B5846E00E59122 /* Info.plist */,\n\t\t\t\t23E2279523B5846E00E59122 /* macOS_Table_Demo.entitlements */,\n\t\t\t\t232F732223B5BE2A00FA3A3F /* GridViewController.swift */,\n\t\t\t);\n\t\t\tpath = \"macOS Table Demo\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t23102B4F23B0245A001A621D /* macOS Sparkline Demo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23102B5E23B0245B001A621D /* Build configuration list for PBXNativeTarget \"macOS Sparkline Demo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t23102B4C23B0245A001A621D /* Sources */,\n\t\t\t\t23102B4D23B0245A001A621D /* Frameworks */,\n\t\t\t\t23102B4E23B0245A001A621D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"macOS Sparkline Demo\";\n\t\t\tproductName = \"macOS Sparkline Demo\";\n\t\t\tproductReference = 23102B5023B0245A001A621D /* macOS Sparkline Demo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t23102BC023B02AED001A621D /* iOS Sparkline Demo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23102BD423B02AEE001A621D /* Build configuration list for PBXNativeTarget \"iOS Sparkline Demo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t23102BBD23B02AED001A621D /* Sources */,\n\t\t\t\t23102BBE23B02AED001A621D /* Frameworks */,\n\t\t\t\t23102BBF23B02AED001A621D /* Resources */,\n\t\t\t\t23B007012DDD63E900D074A0 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"iOS Sparkline Demo\";\n\t\t\tproductName = \"iOS Sparkline Demo\";\n\t\t\tproductReference = 23102BC123B02AED001A621D /* iOS Sparkline Demo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t23102BD823B02B0A001A621D /* macOS Sparkline Demo Objc */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23102BEA23B02B0B001A621D /* Build configuration list for PBXNativeTarget \"macOS Sparkline Demo Objc\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t23102BD523B02B0A001A621D /* Sources */,\n\t\t\t\t23102BD623B02B0A001A621D /* Frameworks */,\n\t\t\t\t23102BD723B02B0A001A621D /* Resources */,\n\t\t\t\t23B006FB2DDD61FB00D074A0 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"macOS Sparkline Demo Objc\";\n\t\t\tproductName = \"macOS Sparkline Demo Objc\";\n\t\t\tproductReference = 23102BD923B02B0A001A621D /* macOS Sparkline Demo Objc.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t23102BF023B02B32001A621D /* tvOS Sparkline Demo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23102C0023B02B33001A621D /* Build configuration list for PBXNativeTarget \"tvOS Sparkline Demo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t23102BED23B02B32001A621D /* Sources */,\n\t\t\t\t23102BEE23B02B32001A621D /* Frameworks */,\n\t\t\t\t23102BEF23B02B32001A621D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"tvOS Sparkline Demo\";\n\t\t\tproductName = \"tvOS Sparkline Demo\";\n\t\t\tproductReference = 23102BF123B02B32001A621D /* tvOS Sparkline Demo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t236A57EF25C1392B00F2BACF /* SwiftUI Sparkline Demo (iOS) */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 236A580525C1392B00F2BACF /* Build configuration list for PBXNativeTarget \"SwiftUI Sparkline Demo (iOS)\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t236A57EC25C1392B00F2BACF /* Sources */,\n\t\t\t\t236A57ED25C1392B00F2BACF /* Frameworks */,\n\t\t\t\t236A57EE25C1392B00F2BACF /* Resources */,\n\t\t\t\t23B007092DDD65B800D074A0 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"SwiftUI Sparkline Demo (iOS)\";\n\t\t\tproductName = \"SwiftUI Sparkline Demo (iOS)\";\n\t\t\tproductReference = 236A57F025C1392B00F2BACF /* SwiftUI Sparkline Demo (iOS).app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t236A57F625C1392B00F2BACF /* SwiftUI Sparkline Demo (macOS) */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 236A580625C1392B00F2BACF /* Build configuration list for PBXNativeTarget \"SwiftUI Sparkline Demo (macOS)\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t236A57F325C1392B00F2BACF /* Sources */,\n\t\t\t\t236A57F425C1392B00F2BACF /* Frameworks */,\n\t\t\t\t236A57F525C1392B00F2BACF /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"SwiftUI Sparkline Demo (macOS)\";\n\t\t\tproductName = \"SwiftUI Sparkline Demo (macOS)\";\n\t\t\tproductReference = 236A57F725C1392B00F2BACF /* SwiftUI Sparkline Demo (macOS).app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t23E2278823B5846E00E59122 /* macOS Table Demo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23E2279823B5846E00E59122 /* Build configuration list for PBXNativeTarget \"macOS Table Demo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t23E2278523B5846E00E59122 /* Sources */,\n\t\t\t\t23E2278623B5846E00E59122 /* Frameworks */,\n\t\t\t\t23E2278723B5846E00E59122 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"macOS Table Demo\";\n\t\t\tproductName = \"macOS Table Demo\";\n\t\t\tproductReference = 23E2278923B5846E00E59122 /* macOS Table Demo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t23102B4523B0165B001A621D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1240;\n\t\t\t\tLastUpgradeCheck = 1130;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t23102B4F23B0245A001A621D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t\t23102BC023B02AED001A621D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t\t23102BD823B02B0A001A621D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t\t23102BF023B02B32001A621D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t\t236A57EF25C1392B00F2BACF = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.4;\n\t\t\t\t\t};\n\t\t\t\t\t236A57F625C1392B00F2BACF = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.4;\n\t\t\t\t\t};\n\t\t\t\t\t239716B923B554DD0034A4D4 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t\t23E2278823B5846E00E59122 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 23102B4823B0165B001A621D /* Build configuration list for PBXProject \"Demos\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 23102B4423B0165B001A621D;\n\t\t\tpackageReferences = (\n\t\t\t\t23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 23102B5123B0245A001A621D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t239716B923B554DD0034A4D4 /* All Demos */,\n\t\t\t\t23102B4F23B0245A001A621D /* macOS Sparkline Demo */,\n\t\t\t\t23102BD823B02B0A001A621D /* macOS Sparkline Demo Objc */,\n\t\t\t\t23E2278823B5846E00E59122 /* macOS Table Demo */,\n\t\t\t\t23102BC023B02AED001A621D /* iOS Sparkline Demo */,\n\t\t\t\t23102BF023B02B32001A621D /* tvOS Sparkline Demo */,\n\t\t\t\t236A57EF25C1392B00F2BACF /* SwiftUI Sparkline Demo (iOS) */,\n\t\t\t\t236A57F625C1392B00F2BACF /* SwiftUI Sparkline Demo (macOS) */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t23102B4E23B0245A001A621D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102B5823B0245B001A621D /* Assets.xcassets in Resources */,\n\t\t\t\t23102B5B23B0245B001A621D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BBF23B02AED001A621D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102BD023B02AEE001A621D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t23102BCD23B02AEE001A621D /* Assets.xcassets in Resources */,\n\t\t\t\t23102BCB23B02AED001A621D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BD723B02B0A001A621D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102BE223B02B0B001A621D /* Assets.xcassets in Resources */,\n\t\t\t\t23102BE523B02B0B001A621D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BEF23B02B32001A621D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102BFE23B02B33001A621D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t23102BFB23B02B33001A621D /* Assets.xcassets in Resources */,\n\t\t\t\t23102BF923B02B32001A621D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t236A57EE25C1392B00F2BACF /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t236A57FF25C1392B00F2BACF /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t236A57F525C1392B00F2BACF /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t236A580025C1392B00F2BACF /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23E2278723B5846E00E59122 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23E2279023B5846E00E59122 /* Assets.xcassets in Resources */,\n\t\t\t\t23E2279323B5846E00E59122 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t23102B4C23B0245A001A621D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102B5623B0245A001A621D /* ViewController.swift in Sources */,\n\t\t\t\t23102C0423B03315001A621D /* cpuUsage.swift in Sources */,\n\t\t\t\t23102B5423B0245A001A621D /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BBD23B02AED001A621D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102BC823B02AED001A621D /* ViewController.swift in Sources */,\n\t\t\t\t23102BC423B02AED001A621D /* AppDelegate.swift in Sources */,\n\t\t\t\t23102BC623B02AED001A621D /* SceneDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BD523B02B0A001A621D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102BE023B02B0A001A621D /* ViewController.m in Sources */,\n\t\t\t\t23102BE823B02B0B001A621D /* main.m in Sources */,\n\t\t\t\t23102BDD23B02B0A001A621D /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23102BED23B02B32001A621D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23102BF623B02B32001A621D /* ViewController.swift in Sources */,\n\t\t\t\t23102BF423B02B32001A621D /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t236A57EC25C1392B00F2BACF /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t238053C725DCC2B100B996B5 /* ActiveView.swift in Sources */,\n\t\t\t\t238DB6EA25EB3A2E009197AB /* TabletView.swift in Sources */,\n\t\t\t\t237B827825E7891E00B3DE23 /* BitmapGenerationView.swift in Sources */,\n\t\t\t\t236417E729628C0600C8A1D2 /* WiperGaugeDemoView.swift in Sources */,\n\t\t\t\t235A585B2603181A00266642 /* PercentBarView.swift in Sources */,\n\t\t\t\t2322C06B262651D5007D8112 /* TestingView.swift in Sources */,\n\t\t\t\t232BAF6D25EB16210090C447 /* SwiftUIView.swift in Sources */,\n\t\t\t\t2346EF3025E8D13A00050570 /* SwiftUIContentView.swift in Sources */,\n\t\t\t\t23FC81DD25DB60760047A800 /* StripesDemoView.swift in Sources */,\n\t\t\t\t23FC819F25DB59160047A800 /* DataBarGraphContent.swift in Sources */,\n\t\t\t\t23FC817525DB547E0047A800 /* StackLineDemoContentView.swift in Sources */,\n\t\t\t\t238DB6DC25EB2141009197AB /* StripesOverlaidView.swift in Sources */,\n\t\t\t\t237B824725E77B3800B3DE23 /* BarDemoContentView.swift in Sources */,\n\t\t\t\t23905CA12B5B5D00007B7769 /* CircularProgress.swift in Sources */,\n\t\t\t\t236A57FD25C1392B00F2BACF /* ContentView.swift in Sources */,\n\t\t\t\t236A57FB25C1392B00F2BACF /* SwiftUI_Sparkline_DemoApp.swift in Sources */,\n\t\t\t\t23BC66862B0DD82A0064FF62 /* ActivityGridView.swift in Sources */,\n\t\t\t\t23D10B1025ED9EB500BBE555 /* AttributedString.swift in Sources */,\n\t\t\t\t232D9ECE25EC7133004DFAFC /* SuperCoolLineSpark.swift in Sources */,\n\t\t\t\t239DE4042BA177D300E13208 /* CircularGaugeView.swift in Sources */,\n\t\t\t\t23FC810025DB3FC50047A800 /* ReportView.swift in Sources */,\n\t\t\t\t23FC814025DB4E5D0047A800 /* LineDemoContentView.swift in Sources */,\n\t\t\t\t23529A7425E84D2A00DFA52D /* Extensions.swift in Sources */,\n\t\t\t\t23FC812025DB47A20047A800 /* WinLossGraphContentView.swift in Sources */,\n\t\t\t\t238053E525DCD14600B996B5 /* OverlayView.swift in Sources */,\n\t\t\t\t23FC81B425DB59E70047A800 /* DotGraphView.swift in Sources */,\n\t\t\t\t23FC819325DB586B0047A800 /* PieGraphDemoView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t236A57F325C1392B00F2BACF /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t238053C825DCC2B100B996B5 /* ActiveView.swift in Sources */,\n\t\t\t\t238DB6EB25EB3A2F009197AB /* TabletView.swift in Sources */,\n\t\t\t\t237B827925E7891E00B3DE23 /* BitmapGenerationView.swift in Sources */,\n\t\t\t\t236417E829628C0600C8A1D2 /* WiperGaugeDemoView.swift in Sources */,\n\t\t\t\t235A585C2603181A00266642 /* PercentBarView.swift in Sources */,\n\t\t\t\t2322C06C262651D5007D8112 /* TestingView.swift in Sources */,\n\t\t\t\t232BAF6E25EB16210090C447 /* SwiftUIView.swift in Sources */,\n\t\t\t\t2346EF3125E8D13A00050570 /* SwiftUIContentView.swift in Sources */,\n\t\t\t\t23FC81DE25DB60760047A800 /* StripesDemoView.swift in Sources */,\n\t\t\t\t23FC81A025DB59160047A800 /* DataBarGraphContent.swift in Sources */,\n\t\t\t\t23FC817625DB547E0047A800 /* StackLineDemoContentView.swift in Sources */,\n\t\t\t\t238DB6DD25EB2141009197AB /* StripesOverlaidView.swift in Sources */,\n\t\t\t\t237B824825E77B3800B3DE23 /* BarDemoContentView.swift in Sources */,\n\t\t\t\t23905CA22B5B5D00007B7769 /* CircularProgress.swift in Sources */,\n\t\t\t\t236A57FE25C1392B00F2BACF /* ContentView.swift in Sources */,\n\t\t\t\t236A57FC25C1392B00F2BACF /* SwiftUI_Sparkline_DemoApp.swift in Sources */,\n\t\t\t\t23BC66872B0DD82A0064FF62 /* ActivityGridView.swift in Sources */,\n\t\t\t\t23D10B1125ED9EB500BBE555 /* AttributedString.swift in Sources */,\n\t\t\t\t232D9ECF25EC7133004DFAFC /* SuperCoolLineSpark.swift in Sources */,\n\t\t\t\t239DE4052BA177D300E13208 /* CircularGaugeView.swift in Sources */,\n\t\t\t\t23FC810125DB3FC50047A800 /* ReportView.swift in Sources */,\n\t\t\t\t23FC814125DB4E5D0047A800 /* LineDemoContentView.swift in Sources */,\n\t\t\t\t23529A7525E84D2A00DFA52D /* Extensions.swift in Sources */,\n\t\t\t\t23FC812125DB47A20047A800 /* WinLossGraphContentView.swift in Sources */,\n\t\t\t\t238053E625DCD14600B996B5 /* OverlayView.swift in Sources */,\n\t\t\t\t23FC81B525DB59E70047A800 /* DotGraphView.swift in Sources */,\n\t\t\t\t23FC819425DB586B0047A800 /* PieGraphDemoView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23E2278523B5846E00E59122 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t23E2278E23B5846E00E59122 /* ViewController.swift in Sources */,\n\t\t\t\t23E2278C23B5846E00E59122 /* AppDelegate.swift in Sources */,\n\t\t\t\t232F732323B5BE2A00FA3A3F /* GridViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t23369E8525D65B2D00A40023 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 236A57EF25C1392B00F2BACF /* SwiftUI Sparkline Demo (iOS) */;\n\t\t\ttargetProxy = 23369E8425D65B2D00A40023 /* PBXContainerItemProxy */;\n\t\t};\n\t\t23369E8725D65B2D00A40023 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 236A57F625C1392B00F2BACF /* SwiftUI Sparkline Demo (macOS) */;\n\t\t\ttargetProxy = 23369E8625D65B2D00A40023 /* PBXContainerItemProxy */;\n\t\t};\n\t\t239716BE23B554E50034A4D4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 23102B4F23B0245A001A621D /* macOS Sparkline Demo */;\n\t\t\ttargetProxy = 239716BD23B554E50034A4D4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t239716C023B554E70034A4D4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 23102BC023B02AED001A621D /* iOS Sparkline Demo */;\n\t\t\ttargetProxy = 239716BF23B554E70034A4D4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t239716C223B554E80034A4D4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 23102BD823B02B0A001A621D /* macOS Sparkline Demo Objc */;\n\t\t\ttargetProxy = 239716C123B554E80034A4D4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t23E2279A23B5A6EF00E59122 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 23E2278823B5846E00E59122 /* macOS Table Demo */;\n\t\t\ttargetProxy = 23E2279923B5A6EF00E59122 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t23102B5923B0245B001A621D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23102B5A23B0245B001A621D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BC923B02AED001A621D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BCA23B02AED001A621D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BCE23B02AEE001A621D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BCF23B02AEE001A621D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BE323B02B0B001A621D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BE423B02B0B001A621D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BF723B02B32001A621D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BF823B02B32001A621D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23102BFC23B02B33001A621D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23102BFD23B02B33001A621D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23E2279123B5846E00E59122 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t23E2279223B5846E00E59122 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t23102B4923B0165B001A621D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23102B4A23B0165B001A621D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t23102B5F23B0245B001A621D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"macOS Sparkline Demo/macOS_Sparkline_Demo.entitlements\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"macOS Sparkline Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.macOS-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23102B6023B0245B001A621D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"macOS Sparkline Demo/macOS_Sparkline_Demo.entitlements\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"macOS Sparkline Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.macOS-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t23102BD223B02AEE001A621D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"iOS Sparkline Demo/iOS Sparkline Demo.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"iOS Sparkline Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\t\"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]\" = 14.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.iOS-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2,6\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23102BD323B02AEE001A621D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"iOS Sparkline Demo/iOS Sparkline Demo.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"iOS Sparkline Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\t\"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]\" = 14.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.iOS-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2,6\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t23102BEB23B02B0B001A621D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"macOS Sparkline Demo Objc/macOS_Sparkline_Demo_Objc.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"macOS Sparkline Demo Objc/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.macOS-Sparkline-Demo-Objc\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23102BEC23B02B0B001A621D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"macOS Sparkline Demo Objc/macOS_Sparkline_Demo_Objc.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"macOS Sparkline Demo Objc/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.macOS-Sparkline-Demo-Objc\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t23102C0123B02B33001A621D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"tvOS Sparkline Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.tvOS-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23102C0223B02B33001A621D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"tvOS Sparkline Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.tvOS-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t236A580125C1392B00F2BACF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"SwiftUI Sparkline Crossplatform/iOS/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 17.6;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.SwiftUI-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"SwiftUI Sparkline Demo (iOS)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphoneos iphonesimulator\";\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t236A580225C1392B00F2BACF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"SwiftUI Sparkline Crossplatform/iOS/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 17.6;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.SwiftUI-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"SwiftUI Sparkline Demo (iOS)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphoneos iphonesimulator\";\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t236A580325C1392B00F2BACF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"SwiftUI Sparkline Crossplatform/macOS/macOS.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"SwiftUI Sparkline Crossplatform/macOS/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.6;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.SwiftUI-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"SwiftUI Sparkline Demo (macOS)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t236A580425C1392B00F2BACF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"SwiftUI Sparkline Crossplatform/macOS/macOS.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"SwiftUI Sparkline Crossplatform/macOS/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.6;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.SwiftUI-Sparkline-Demo\";\n\t\t\t\tPRODUCT_NAME = \"SwiftUI Sparkline Demo (macOS)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t239716BA23B554DD0034A4D4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t239716BB23B554DD0034A4D4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t23E2279623B5846E00E59122 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"macOS Table Demo/macOS_Table_Demo.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"macOS Table Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.macOS-Table-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23E2279723B5846E00E59122 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"macOS Table Demo/macOS_Table_Demo.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"macOS Table Demo/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.darrenford.sparklines.macOS-Table-Demo\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t23102B4823B0165B001A621D /* Build configuration list for PBXProject \"Demos\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23102B4923B0165B001A621D /* Debug */,\n\t\t\t\t23102B4A23B0165B001A621D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23102B5E23B0245B001A621D /* Build configuration list for PBXNativeTarget \"macOS Sparkline Demo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23102B5F23B0245B001A621D /* Debug */,\n\t\t\t\t23102B6023B0245B001A621D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23102BD423B02AEE001A621D /* Build configuration list for PBXNativeTarget \"iOS Sparkline Demo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23102BD223B02AEE001A621D /* Debug */,\n\t\t\t\t23102BD323B02AEE001A621D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23102BEA23B02B0B001A621D /* Build configuration list for PBXNativeTarget \"macOS Sparkline Demo Objc\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23102BEB23B02B0B001A621D /* Debug */,\n\t\t\t\t23102BEC23B02B0B001A621D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23102C0023B02B33001A621D /* Build configuration list for PBXNativeTarget \"tvOS Sparkline Demo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23102C0123B02B33001A621D /* Debug */,\n\t\t\t\t23102C0223B02B33001A621D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t236A580525C1392B00F2BACF /* Build configuration list for PBXNativeTarget \"SwiftUI Sparkline Demo (iOS)\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t236A580125C1392B00F2BACF /* Debug */,\n\t\t\t\t236A580225C1392B00F2BACF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t236A580625C1392B00F2BACF /* Build configuration list for PBXNativeTarget \"SwiftUI Sparkline Demo (macOS)\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t236A580325C1392B00F2BACF /* Debug */,\n\t\t\t\t236A580425C1392B00F2BACF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t239716BC23B554DD0034A4D4 /* Build configuration list for PBXAggregateTarget \"All Demos\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t239716BA23B554DD0034A4D4 /* Debug */,\n\t\t\t\t239716BB23B554DD0034A4D4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23E2279823B5846E00E59122 /* Build configuration list for PBXNativeTarget \"macOS Table Demo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23E2279623B5846E00E59122 /* Debug */,\n\t\t\t\t23E2279723B5846E00E59122 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCLocalSwiftPackageReference section */\n\t\t23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */ = {\n\t\t\tisa = XCLocalSwiftPackageReference;\n\t\t\trelativePath = ../../../DSFSparkline;\n\t\t};\n/* End XCLocalSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t23B006F62DDD61C700D074A0 /* DSFSparkline */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = DSFSparkline;\n\t\t};\n\t\t23B006F82DDD61FB00D074A0 /* DSFSparkline-shared */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = \"DSFSparkline-shared\";\n\t\t};\n\t\t23B006FC2DDD625E00D074A0 /* DSFSparkline */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = DSFSparkline;\n\t\t};\n\t\t23B006FE2DDD63E900D074A0 /* DSFSparkline-shared */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = \"DSFSparkline-shared\";\n\t\t};\n\t\t23B007022DDD652800D074A0 /* DSFSparkline */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = DSFSparkline;\n\t\t};\n\t\t23B007042DDD65A800D074A0 /* DSFSparkline */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = DSFSparkline;\n\t\t};\n\t\t23B007062DDD65B800D074A0 /* DSFSparkline-shared */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 23B006F42DDD61A400D074A0 /* XCLocalSwiftPackageReference \"../../../DSFSparkline\" */;\n\t\t\tproductName = \"DSFSparkline-shared\";\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 23102B4523B0165B001A621D /* Project object */;\n}\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/All Demos.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"239716B923B554DD0034A4D4\"\n               BuildableName = \"All Demos\"\n               BlueprintName = \"All Demos\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"239716B923B554DD0034A4D4\"\n            BuildableName = \"All Demos\"\n            BlueprintName = \"All Demos\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/SwiftUI Sparkline Demo (iOS).xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"236A57EF25C1392B00F2BACF\"\n               BuildableName = \"SwiftUI Sparkline Demo (iOS).app\"\n               BlueprintName = \"SwiftUI Sparkline Demo (iOS)\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"236A57EF25C1392B00F2BACF\"\n            BuildableName = \"SwiftUI Sparkline Demo (iOS).app\"\n            BlueprintName = \"SwiftUI Sparkline Demo (iOS)\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"236A57EF25C1392B00F2BACF\"\n            BuildableName = \"SwiftUI Sparkline Demo (iOS).app\"\n            BlueprintName = \"SwiftUI Sparkline Demo (iOS)\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/SwiftUI Sparkline Demo (macOS).xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"236A57F625C1392B00F2BACF\"\n               BuildableName = \"SwiftUI Sparkline Demo (macOS).app\"\n               BlueprintName = \"SwiftUI Sparkline Demo (macOS)\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"236A57F625C1392B00F2BACF\"\n            BuildableName = \"SwiftUI Sparkline Demo (macOS).app\"\n            BlueprintName = \"SwiftUI Sparkline Demo (macOS)\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"CG_NUMERICS_SHOW_BACKTRACE\"\n            value = \"1\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n         <EnvironmentVariable\n            key = \"CG_CONTEXT_SHOW_BACKTRACE\"\n            value = \"1\"\n            isEnabled = \"NO\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"236A57F625C1392B00F2BACF\"\n            BuildableName = \"SwiftUI Sparkline Demo (macOS).app\"\n            BlueprintName = \"SwiftUI Sparkline Demo (macOS)\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/iOS Sparkline Demo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"23102BC023B02AED001A621D\"\n               BuildableName = \"iOS Sparkline Demo.app\"\n               BlueprintName = \"iOS Sparkline Demo\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102BC023B02AED001A621D\"\n            BuildableName = \"iOS Sparkline Demo.app\"\n            BlueprintName = \"iOS Sparkline Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n         <AdditionalOption\n            key = \"MallocStackLogging\"\n            value = \"\"\n            isEnabled = \"YES\">\n         </AdditionalOption>\n         <AdditionalOption\n            key = \"PrefersMallocStackLoggingLite\"\n            value = \"\"\n            isEnabled = \"YES\">\n         </AdditionalOption>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102BC023B02AED001A621D\"\n            BuildableName = \"iOS Sparkline Demo.app\"\n            BlueprintName = \"iOS Sparkline Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/macOS Sparkline Demo Objc.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"23102BD823B02B0A001A621D\"\n               BuildableName = \"macOS Sparkline Demo Objc.app\"\n               BlueprintName = \"macOS Sparkline Demo Objc\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102BD823B02B0A001A621D\"\n            BuildableName = \"macOS Sparkline Demo Objc.app\"\n            BlueprintName = \"macOS Sparkline Demo Objc\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102BD823B02B0A001A621D\"\n            BuildableName = \"macOS Sparkline Demo Objc.app\"\n            BlueprintName = \"macOS Sparkline Demo Objc\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/macOS Sparkline Demo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"23102B4F23B0245A001A621D\"\n               BuildableName = \"macOS Sparkline Demo.app\"\n               BlueprintName = \"macOS Sparkline Demo\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102B4F23B0245A001A621D\"\n            BuildableName = \"macOS Sparkline Demo.app\"\n            BlueprintName = \"macOS Sparkline Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102B4F23B0245A001A621D\"\n            BuildableName = \"macOS Sparkline Demo.app\"\n            BlueprintName = \"macOS Sparkline Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/macOS Table Demo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"23E2278823B5846E00E59122\"\n               BuildableName = \"macOS Table Demo.app\"\n               BlueprintName = \"macOS Table Demo\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23E2278823B5846E00E59122\"\n            BuildableName = \"macOS Table Demo.app\"\n            BlueprintName = \"macOS Table Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23E2278823B5846E00E59122\"\n            BuildableName = \"macOS Table Demo.app\"\n            BlueprintName = \"macOS Table Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcshareddata/xcschemes/tvOS Sparkline Demo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"23102BF023B02B32001A621D\"\n               BuildableName = \"tvOS Sparkline Demo.app\"\n               BlueprintName = \"tvOS Sparkline Demo\"\n               ReferencedContainer = \"container:Demos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102BF023B02B32001A621D\"\n            BuildableName = \"tvOS Sparkline Demo.app\"\n            BlueprintName = \"tvOS Sparkline Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"23102BF023B02B32001A621D\"\n            BuildableName = \"tvOS Sparkline Demo.app\"\n            BlueprintName = \"tvOS Sparkline Demo\"\n            ReferencedContainer = \"container:Demos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Demos/Samples/Demos.xcodeproj/xcuserdata/dford.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"B77D9BBA-FB72-4F0C-BF32-79A94F498935\"\n   type = \"1\"\n   version = \"2.0\">\n</Bucket>\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/ActiveView.swift",
    "content": "//\n//  ActiveView.swift\n//  Demos\n//\n//  Created by Darren Ford on 17/2/21.\n//\n\nimport SwiftUI\n\nimport DSFSparkline\n\nstruct UpperGraph: View {\n\tlet label: String\n\t\n\tlet dataSource: DSFSparkline.DataSource\n\tlet graphColor: DSFColor\n\t\n\tlet showZeroLine: Bool\n\tvar zeroLineDefinition: DSFSparkline.ZeroLineDefinition = .shared\n\t\n\tlet interpolated: Bool\n\tlet lineShading: Bool\n\t\n\tvar shadowed: Bool = false\n\t\n\tvar body: some View {\n\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: dataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: graphColor,\n\t\t\t\t\t\t\t\t\t\t\t\t\t interpolated: interpolated,\n\t\t\t\t\t\t\t\t\t\t\t\t\t lineShading: lineShading,\n\t\t\t\t\t\t\t\t\t\t\t\t\t shadowed: shadowed,\n\t\t\t\t\t\t\t\t\t\t\t\t\t showZeroLine: showZeroLine,\n\t\t\t\t\t\t\t\t\t\t\t\t\t zeroLineDefinition: self.zeroLineDefinition)\n\t\t\t.background(\n\t\t\t\tRectangle()\n\t\t\t\t\t.fill(Color(.displayP3, white: 1.0, opacity: 0.1))\n\t\t\t\t\t.shadow(color: .black, radius: 8, x: 4, y: -4)\n\t\t\t)\n\t\t\t.clipShape(RoundedRectangle(cornerRadius: 8))\n\t\t\t.padding(4)\n\t\t\t.background(\n\t\t\t\tRoundedRectangle(cornerRadius: 8)\n\t\t\t\t\t.fill(Color(.displayP3, white: 0.5, opacity: 0.1))\n\t\t\t\t\t.shadow(color: .black, radius: 8, x: 4, y: -4)\n\t\t\t)\n\t\t\t.overlay(\n\t\t\t\tVStack(alignment: .leading, spacing: nil, content: {\n\t\t\t\t\tText(self.label)\n\t\t\t\t\t\t.shadow(color: .black, radius: 1)\n\t\t\t\t\tColor.clear\n\t\t\t\t}).padding(6), alignment: .leading\n\t\t\t)\n\t}\n}\n\nvar PreviewUpperGraphDataSource: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 10, range: 0.0 ... 100.0, zeroLineValue: 25)\n\td.push(values: [20, 77, 90, 22, 4, 16, 66, 99, 88, 44])\n\treturn d\n}()\n\nstruct UpperGraph_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tUpperGraph(label: \"Testing\",\n\t\t\t\t\t  dataSource: PreviewUpperGraphDataSource,\n\t\t\t\t\t  graphColor: DSFColor.systemOrange,\n\t\t\t\t\t  showZeroLine: true,\n\t\t\t\t\t  zeroLineDefinition: DSFSparkline.ZeroLineDefinition(),\n\t\t\t\t\t  interpolated: true,\n\t\t\t\t\t  lineShading: true,\n\t\t\t\t\t  shadowed: true)\n\t}\n}\n\n/////////////\n\nvar PreviewGlobalDataSource1: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 10, range: 0 ... 1.0)\n\td.push(values: [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1])\n\treturn d\n}()\n\nvar PreviewGlobalDataSource2: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 10, range: -1.0 ... 1.0)\n\td.push(values: [-0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5])\n\treturn d\n}()\n\nvar PreviewGlobalDataSource3: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0.0 ... 100.0)\n\td.push(values: [50, 40, 30, 20, 10, 0, 100, 90, 80, 70])\n\treturn d\n}()\n\nvar PreviewGlobalDataSource4: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0.0 ... 100.0)\n\td.push(values: [20, 77, 90, 22, 4, 16, 66, 99, 88, 44])\n\treturn d\n}()\n\nvar PreviewGlobalDataSource5: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0.0 ... 100.0)\n\td.push(values: [20, 77, 90, 22, 4, 16, 66, 99, 88, 44])\n\treturn d\n}()\n\nstruct ActiveView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tActiveView(dataSource: DataSource(PreviewGlobalDataSource1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t PreviewGlobalDataSource2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t PreviewGlobalDataSource3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t PreviewGlobalDataSource4,\n\t\t\t\t\t\t\t\t\t\t\t\t\t PreviewGlobalDataSource5)\n\t\t)\n\t}\n}\n\nfunc MakeActiveView() -> ActiveView {\n\treturn ActiveView(dataSource: globalSource)\n}\n\nstruct ActiveView: View {\n\tlet dataSource: DataSource\n\t\n\tlet BigCyanZeroLine = DSFSparkline.ZeroLineDefinition(\n\t\tcolor: .cyan,\n\t\tlineWidth: 3,\n\t\tlineDashStyle: [4, 1, 2, 1]\n\t)\n\t\n\t@State var selectedType = 1\n\t\n\tlet gradient = DSFSparkline.GradientBucket(posts: [\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemRed.cgColor, location: 0),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemOrange.cgColor, location: 1 / 6),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemYellow.cgColor, location: 2 / 6),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemGreen.cgColor, location: 3 / 6),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemBlue.cgColor, location: 4 / 6),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemIndigo.cgColor, location: 5 / 6),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemPurple.cgColor, location: 6 / 6),\n\t])\n\t\n\tvar body: some View {\n\t\tVStack {\n\t\t\tHStack(alignment: .center, spacing: 8, content: {\n\t\t\t\tUpperGraph(label: \"Left\", dataSource: dataSource.PreviewGlobalDataSource4, graphColor: DSFColor.systemOrange, showZeroLine: false, interpolated: false, lineShading: true).frame(height: 60)\n\t\t\t\tUpperGraph(label: \"Middle\", dataSource: dataSource.PreviewGlobalDataSource4, graphColor: DSFColor.systemYellow, showZeroLine: true, interpolated: true, lineShading: true).frame(height: 60)\n\t\t\t\tUpperGraph(label: \"Right\", dataSource: dataSource.PreviewGlobalDataSource4, graphColor: DSFColor.systemPurple, showZeroLine: false, interpolated: false, lineShading: false).frame(height: 60)\n\t\t\t})\n\t\t\tHStack {\n\t\t\t\tVStack {\n\t\t\t\t\tDSFSparklineBarGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbarSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tshowHighlightRange: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thighlightDefinitions: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trange: 0 ..< 0.5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfillColor: DSFColor.gray.withAlphaComponent(0.3).cgColor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t.frame(height: 60)\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient)\n\t\t\t\t\t.frame(height: 60)\n\t\t\t\t\t.padding(2)\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tDSFSparklineBarGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlineWidth: 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbarSpacing: 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tzeroLineDefinition: BigCyanZeroLine,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcenteredAtZeroLine: true)\n\t\t\t\t.frame(height: 60)\n\t\t\t}\n\t\t\tHStack {\n\t\t\t\tDSFSparklineDotGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsetGraphColor: DSFColor.darkGray.withAlphaComponent(0.2))\n\t\t\t\t.frame(height: 60)\n\t\t\t\t.padding(2)\n\t\t\t\tDSFSparklineDotGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemRed,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsetGraphColor: DSFColor.darkGray.withAlphaComponent(0.2),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tupsideDown: true)\n\t\t\t\t.frame(height: 60)\n\t\t\t\t.padding(2)\n\t\t\t\tVStack(alignment: .center, spacing: nil, content: {\n\t\t\t\t\tDSFSparklineDotGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsetGraphColor: DSFColor.darkGray.withAlphaComponent(0.2),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tverticalDotCount: 10)\n\t\t\t\t\t.frame(height: 60)\n\t\t\t\t\tDSFSparklineDotGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemPink,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsetGraphColor: DSFColor.darkGray.withAlphaComponent(0.2),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tverticalDotCount: 10,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tupsideDown: true)\n\t\t\t\t\t.frame(height: 60)\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n#if os(macOS)\n\t\t\tHStack {\n\t\t\t\tPicker(selection: $selectedType, label: EmptyView()) {\n\t\t\t\t\tText(\"Line\").tag(1)\n\t\t\t\t\tText(\"Line (Smooth)\").tag(2)\n\t\t\t\t\tText(\"Bar\").tag(3)\n\t\t\t\t\tText(\"Dot\").tag(4)\n\t\t\t\t\tText(\"Stripes\").tag(5)\n\t\t\t\t}.pickerStyle(RadioGroupPickerStyle())\n\t\t\t\tGroup {\n\t\t\t\t\tif self.selectedType == 1 {\n\t\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemOrange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t showZeroLine: true)\n\t\t\t\t\t}\n\t\t\t\t\telse if self.selectedType == 2 {\n\t\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemOrange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t interpolated: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t showZeroLine: true)\n\t\t\t\t\t}\n\t\t\t\t\telse if self.selectedType == 3 {\n\t\t\t\t\t\tDSFSparklineBarGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemOrange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbarSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tshowZeroLine: true)\n\t\t\t\t\t}\n\t\t\t\t\telse if self.selectedType == 4 {\n\t\t\t\t\t\tDSFSparklineDotGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemOrange)\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1, gradient: self.gradient)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t.frame(height: 80)\n\t\t\t\t.padding(2)\n\t\t\t}\n#else\n\t\t\tVStack {\n\t\t\t\tPicker(selection: $selectedType, label: EmptyView()) {\n\t\t\t\t\tText(\"Line\").tag(1)\n\t\t\t\t\tText(\"Line (Smooth)\").tag(2)\n\t\t\t\t\tText(\"Bar\").tag(3)\n\t\t\t\t\tText(\"Dot\").tag(4)\n\t\t\t\t\tText(\"Stripes\").tag(5)\n\t\t\t\t}\n\t\t\t\tGroup {\n\t\t\t\t\tif self.selectedType == 1 {\n\t\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemOrange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t showZeroLine: true)\n\t\t\t\t\t}\n\t\t\t\t\telse if self.selectedType == 2 {\n\t\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemOrange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t interpolated: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t showZeroLine: true)\n\t\t\t\t\t}\n\t\t\t\t\telse if self.selectedType == 3 {\n\t\t\t\t\t\tDSFSparklineBarGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemOrange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbarSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tshowZeroLine: true)\n\t\t\t\t\t}\n\t\t\t\t\telse if self.selectedType == 4 {\n\t\t\t\t\t\tDSFSparklineDotGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor.systemOrange)\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: dataSource.PreviewGlobalDataSource5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1, gradient: self.gradient)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t.frame(height: 80)\n\t\t\t\t.padding(2)\n\t\t\t}\n#endif\n\t\t\t\n\t\t}.padding(20)\n\t\t\t.onAppear {\n\t\t\t\tself.dataSource.start()\n\t\t\t}\n\t\t\t.onDisappear {\n\t\t\t\tself.dataSource.stop()\n\t\t\t}\n\t}\n}\n\nlet globalSource = DataSource(\n\tDSFSparkline.DataSource(windowSize: 30),\n\tDSFSparkline.DataSource(range: -1.0 ... 1.0),\n\tDSFSparkline.DataSource(range: -100 ... 100),\n\tDSFSparkline.DataSource(range: 0 ... 100),\n\tDSFSparkline.DataSource(range: 0 ... 100, zeroLineValue: 80)\n)\n\nclass DataSource {\n\tlet PreviewGlobalDataSource1: DSFSparkline.DataSource\n\tlet PreviewGlobalDataSource2: DSFSparkline.DataSource\n\tlet PreviewGlobalDataSource3: DSFSparkline.DataSource\n\tlet PreviewGlobalDataSource4: DSFSparkline.DataSource\n\tlet PreviewGlobalDataSource5: DSFSparkline.DataSource\n\t\n\tvar shouldStop: Bool = false\n\t\n\tinit(_ d1: DSFSparkline.DataSource,\n\t\t  _ d2: DSFSparkline.DataSource,\n\t\t  _ d3: DSFSparkline.DataSource,\n\t\t  _ d4: DSFSparkline.DataSource,\n\t\t  _ d5: DSFSparkline.DataSource)\n\t{\n\t\tself.PreviewGlobalDataSource1 = d1\n\t\tself.PreviewGlobalDataSource2 = d2\n\t\tself.PreviewGlobalDataSource3 = d3\n\t\tself.PreviewGlobalDataSource4 = d4\n\t\tself.PreviewGlobalDataSource5 = d5\n\t}\n\t\n\tfunc start() {\n\t\tself.shouldStop = false\n\t\t\n\t\tself.PreviewGlobalDataSource3.windowSize = 100\n\t\tself.PreviewGlobalDataSource4.windowSize = 40\n\t\t_ = self.PreviewGlobalDataSource4.push(value: 50)\n\t\t\n\t\tself.PreviewGlobalDataSource5.windowSize = 50\n\t\t\n\t\tself.updateWithNewValues()\n\t}\n\t\n\tfunc stop() {\n\t\tself.shouldStop = true\n\t}\n\t\n\tvar sinusoid = 0.00\n\tvar lastSource4: CGFloat = 50.0\n\t\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\tif self.shouldStop {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\tlet val = sin(self.sinusoid)\n\t\t\tself.sinusoid += 0.12\n\t\t\t\n\t\t\tlet cr = CGFloat(val)\n\t\t\t_ = self.PreviewGlobalDataSource1.push(value: cr)\n\t\t\t\n\t\t\tlet cr2 = CGFloat.random(in: self.PreviewGlobalDataSource2.range!) // -1 ... 1)\n\t\t\t_ = self.PreviewGlobalDataSource2.push(value: cr2)\n\t\t\t\n\t\t\tlet cr3 = CGFloat.random(in: self.PreviewGlobalDataSource3.range!) // -100 ... 100)\n\t\t\t_ = self.PreviewGlobalDataSource3.push(value: cr3)\n\t\t\t\n\t\t\tlet cr4 = CGFloat.random(in: -20 ... 20)\n\t\t\tlet newVal = min(100, max(0, self.lastSource4 + cr4))\n\t\t\t_ = self.PreviewGlobalDataSource4.push(value: newVal)\n\t\t\tself.lastSource4 = newVal\n\t\t\t\n\t\t\tlet cr5 = CGFloat.random(in: self.PreviewGlobalDataSource5.range!)\n\t\t\t_ = self.PreviewGlobalDataSource5.push(value: cr5)\n\t\t\t\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/ActivityGridView.swift",
    "content": "//\n//  TestingView.swift\n//  Demos\n//\n//  Created by Darren Ford on 14/4/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nstruct ActivityGridView: View {\n\n\t@State var currentDate = Date()\n\tlet timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()\n\n\t@State var inputData: [Double] = []\n\n\tlet cellStyleLight = DSFSparkline.ActivityGrid.CellStyle(fillScheme: DSFSparkline.ActivityGrid.CellStyle.DefaultLight)\n\tlet cellStyleDark = DSFSparkline.ActivityGrid.CellStyle(fillScheme: DSFSparkline.ActivityGrid.CellStyle.DefaultDark)\n\n\tlet gradient = DSFSparkline.GradientBucket(\n\t\tcolors: [\n\t\t\tCGColor(srgbRed: 0, green: 0, blue: 1, alpha: 1),\n\t\t\tCGColor(srgbRed: 1, green: 1, blue: 0, alpha: 1),\n\t\t\tCGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1),\n\t\t]\n\t)\n\n\tlet fiveColorGradient = DSFSparkline.GradientBucket(\n\t\tcolors: [\n\t\t\tCGColor(red: 0.806, green: 0.164, blue: 0.287, alpha: 1.0),\n\t\t\tCGColor(red: 0.978, green: 0.620, blue: 0.303, alpha: 1.0),\n\t\t\tCGColor(red: 0.954, green: 0.431, blue: 0.221, alpha: 1.0),\n\t\t\tCGColor(red: 0.935, green: 0.280, blue: 0.286, alpha: 1.0),\n\t\t\tCGColor(red: 0.345, green: 0.155, blue: 0.259, alpha: 1.0),\n\t\t]\n\t)\n\n\n\tlet SmallerFullRange: [Double] = (0 ... 1000).map { _ in Double.random(in: 0 ... 1) }\n\n\t@State var isLightMode: Bool = false\n\n\tvar body: some View {\n\t\tVStack(spacing: 4) {\n\t\t\tToggle(\"Use Alternate Palette\", isOn: $isLightMode)\n\n\t\t\tText(\"Github style\").font(.title3)\n\n\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\tvalues: inputData,\n\t\t\t\trange: 0 ... 1,\n\t\t\t\tcellStyle: isLightMode ? cellStyleLight : cellStyleDark\n\t\t\t)\n\t\t\t.tooltipStringForCell { index in\n\t\t\t\t\"Index[\\(index)]\"\n\t\t\t}\n\t\t\t.onReceive(timer) { input in\n\t\t\t\tself.inputData.insert(Double.random(in: 0 ... 1), at: 0)\n\t\t\t}\n\t\t\t.border(.red)\n\n\t\t\tText(\"Defrag style\").font(.title3)\n\n\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\tvalues: inputData,\n\t\t\t\trange: 0 ... 1,\n\t\t\t\tcellStyle: isLightMode ? cellStyleLight : cellStyleDark,\n\t\t\t\tlayoutStyle: .defrag\n\t\t\t)\n\t\t\t.border(.red)\n\n\t\t\tDivider()\n\t\t\t\t.frame(maxWidth: .infinity)\n\n\t\t\tVStack {\n\t\t\t\tText(\"Fixed row/column\").font(.title3)\n\t\t\t\tHStack {\n\n\t\t\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\t\t\tvalues: inputData,\n\t\t\t\t\t\trange: 0 ... 1,\n\t\t\t\t\t\tverticalCellCount: 10,\n\t\t\t\t\t\thorizontalCellCount: 7,\n\t\t\t\t\t\tlayoutStyle: .defrag,\n\t\t\t\t\t\tfillScheme: isLightMode ? cellStyleLight.fillScheme : cellStyleDark.fillScheme,\n\t\t\t\t\t\tborderColor: isLightMode ? .init(gray: 0, alpha: 0.2) : .init(gray: 1, alpha: 0.2),\n\t\t\t\t\t\tborderWidth: 0.5\n\t\t\t\t\t)\n\t\t\t\t\t.border(.red)\n\t\t\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\t\t\tvalues: inputData,\n\t\t\t\t\t\trange: 0 ... 1,\n\t\t\t\t\t\tverticalCellCount: 10,\n\t\t\t\t\t\thorizontalCellCount: 7,\n\t\t\t\t\t\tlayoutStyle: .github,\n\t\t\t\t\t\tfillScheme: isLightMode ? cellStyleLight.fillScheme : cellStyleDark.fillScheme,\n\t\t\t\t\t\tborderColor: isLightMode ? .init(gray: 0, alpha: 0.2) : .init(gray: 1, alpha: 0.2),\n\t\t\t\t\t\tborderWidth: 0.5\n\t\t\t\t\t)\n\t\t\t\t\t.border(.green)\n\n\t\t\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\t\t\tvalues: SmallerFullRange,\n\t\t\t\t\t\trange: 0 ... 1,\n\t\t\t\t\t\tverticalCellCount: 7,\n\t\t\t\t\t\thorizontalCellCount: 10,\n\t\t\t\t\t\tcellStyle: .init(fillScheme: .init(gradient: gradient), cellDimension: 6, cellSpacing: 3),\n\t\t\t\t\t\tlayoutStyle: .defrag\n\t\t\t\t\t)\n\t\t\t\t\t.border(.blue)\n\t\t\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\t\t\tvalues: SmallerFullRange,\n\t\t\t\t\t\trange: 0 ... 1,\n\t\t\t\t\t\tverticalCellCount: 7,\n\t\t\t\t\t\thorizontalCellCount: 10,\n\t\t\t\t\t\tcellStyle: .init(fillScheme: .init(gradient: gradient), cellDimension: 15, cellSpacing: 1),\n\t\t\t\t\t\tlayoutStyle: .github\n\t\t\t\t\t)\n\t\t\t\t\t.border(.yellow)\n\n\t\t\t\t\tVStack(spacing: 0) {\n\t\t\t\t\t\tHStack(spacing: 6) {\n\t\t\t\t\t\t\tText(\"S\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t\tText(\"M\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t\tText(\"T\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t\tText(\"W\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t\tText(\"T\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t\tText(\"F\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t\tText(\"S\").font(.system(.caption, design: .monospaced))\n\t\t\t\t\t\t}\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\tDSFSparklineActivityGridView.SwiftUI(\n\t\t\t\t\t\t\tvalues: SmallerFullRange,\n\t\t\t\t\t\t\trange: 0 ... 1,\n\t\t\t\t\t\t\tverticalCellCount: 30,\n\t\t\t\t\t\t\thorizontalCellCount: 7,\n\t\t\t\t\t\t\tcellStyle: .init(fillScheme: .init(gradient: fiveColorGradient)),\n\t\t\t\t\t\t\tlayoutStyle: .github\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.tooltipStringForCell { index in\n\t\t\t\t\t\t\t\"Tooltip[\\(SmallerFullRange[index])]\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.padding()\n\t}\n}\n\nstruct ActivityGridView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tActivityGridView()\n\t\t\t.frame(height: 1000)\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/AttributedString.swift",
    "content": "//\n//  AttributedString.swift\n//  Demos\n//\n//  Appropriated from https://swiftui-lab.com/attributed-strings-with-swiftui/\n//  An NSTextView wrapped for SwiftUI containing an attributed string.\n\nimport SwiftUI\n\n#if os(macOS)\n\nimport AppKit\n\nstruct AttributedText: View  {\n\t@State var size: CGSize = .zero\n\tlet attributedString: NSAttributedString\n\n\tinit(_ attributedString: NSAttributedString) {\n\t\tself.attributedString = attributedString\n\t}\n\n\tvar body: some View {\n\t\tAttributedTextRepresentable(attributedString: attributedString, size: $size)\n\t\t\t.frame(width: size.width, height: size.height)\n\t}\n\n\tstruct AttributedTextRepresentable: NSViewRepresentable {\n\n\t\tlet attributedString: NSAttributedString\n\t\t@Binding var size: CGSize\n\n\t\tfunc makeNSView(context: Context) -> NSTextView {\n\t\t\tlet textView = NSTextView()\n\n\t\t\tguard let textContainer = textView.textContainer else {\n\t\t\t\tfatalError()\n\t\t\t}\n\n\t\t\ttextContainer.widthTracksTextView = false\n\t\t\ttextContainer.containerSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)\n\t\t\ttextView.drawsBackground = false\n\n\t\t\treturn textView\n\t\t}\n\n\t\tfunc updateNSView(_ nsView: NSTextView, context: Context) {\n\n\t\t\tnsView.textStorage?.setAttributedString(attributedString)\n\n\t\t\tDispatchQueue.main.async {\n\t\t\t\tif let textContainer = nsView.textContainer,\n\t\t\t\t\tlet layoutManager = textContainer.layoutManager {\n\t\t\t\t\tlayoutManager.ensureLayout(for: textContainer)\n\t\t\t\t\tsize = layoutManager.usedRect(for: textContainer).size\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsize = .zero\n\t\t\t\t}\n\n\t\t\t\t// This doesn't work accurately.\n\t\t\t\t//size = nsView.textStorage!.size()\n\t\t\t}\n\t\t}\n\t}\n}\n\n#else\n\nimport UIKit\n\nstruct AttributedText: View {\n\t@State private var size: CGSize = .zero\n\tlet attributedString: NSAttributedString\n\n\tinit(_ attributedString: NSAttributedString) {\n\t\tself.attributedString = attributedString\n\t}\n\n\tvar body: some View {\n\t\tAttributedTextRepresentable(attributedString: attributedString, size: $size)\n\t\t\t.frame(width: size.width, height: size.height)\n\t}\n\n\tstruct AttributedTextRepresentable: UIViewRepresentable {\n\n\t\tlet attributedString: NSAttributedString\n\t\t@Binding var size: CGSize\n\n\t\tfunc makeUIView(context: Context) -> UILabel {\n\t\t\tlet label = UILabel()\n\n\t\t\tlabel.lineBreakMode = .byClipping\n\t\t\tlabel.numberOfLines = 0\n\n\t\t\treturn label\n\t\t}\n\n\t\tfunc updateUIView(_ uiView: UILabel, context: Context) {\n\t\t\tuiView.attributedText = attributedString\n\n\t\t\tDispatchQueue.main.async {\n\t\t\t\tsize = uiView.sizeThatFits(uiView.superview?.bounds.size ?? .zero)\n\t\t\t}\n\t\t}\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/BarDemoContentView.swift",
    "content": "//\n//  StackLineDemoContentView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nstruct BarBasic: View {\n\tvar body: some View {\n\t\tText(\"Bar\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource1,\n\t\t\tgraphColor: DSFColor.systemGray,\n\t\t\tlineWidth: 2,\n\t\t\tbarSpacing: 2\n\t\t)\n\t\t.frame(height: 40.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarZeroLine: View {\n\tvar body: some View {\n\t\tText(\"Bar with zero-line\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource1,\n\t\t\tgraphColor: DSFColor.systemPink,\n\t\t\tlineWidth: 1,\n\t\t\tbarSpacing: 0,\n\t\t\tshowZeroLine: true\n\t\t)\n\t\t.frame(height: 40.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarCenteredZeroLine: View {\n\tvar body: some View {\n\t\tText(\"Bar centered around zero-line\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource1,\n\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\tlineWidth: 2,\n\t\t\tbarSpacing: 4,\n\t\t\tshowZeroLine: true,\n\t\t\tcenteredAtZeroLine: true\n\t\t)\n\t\t.frame(height: 40.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\n\nstruct BarCenteredZeroLineColored: View {\n\tvar body: some View {\n\t\tText(\"Bar centered around zero-line, lower color\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource1,\n\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\tlineWidth: 1,\n\t\t\t//showZeroLine: true,\n\t\t\tcenteredAtZeroLine: true,\n\t\t\tlowerGraphColor: DSFColor.systemRed\n\t\t)\n\t\t.frame(height: 60.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\n\nprivate let primaryFill = DSFSparkline.Fill.Gradient(colors: [\n\tCGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1),\n\tCGColor(srgbRed: 0, green: 0, blue: 1, alpha: 1),\n])\n\nprivate let secondaryFill = DSFSparkline.Fill.Gradient(colors: [\n\tCGColor(srgbRed: 1, green: 1, blue: 0, alpha: 1),\n\tCGColor(srgbRed: 0, green: 1, blue: 0, alpha: 1),\n])\n\nstruct BarCenteredZeroLineCustomFill: View {\n\tvar body: some View {\n\t\tText(\"Bar centered around zero-line, custom fill\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource1,\n\t\t\tgraphColor: DSFColor.black,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\tcenteredAtZeroLine: true,\n\t\t\tprimaryFill: primaryFill,\n\t\t\tsecondaryFill: secondaryFill\n\t\t)\n\t\t.frame(height: 60.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarWithCustomFill: View {\n\tvar body: some View {\n\t\tText(\"Bar, custom fill\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource1,\n\t\t\tgraphColor: DSFColor.black,\n\t\t\tlineWidth: 1,\n\t\t\tprimaryFill: primaryFill,\n\t\t\tsecondaryFill: secondaryFill\n\t\t)\n\t\t.frame(height: 60.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarRange: View {\n\tvar body: some View {\n\t\tText(\"Bar with range\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource2,\n\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\thighlightDefinitions: [\n\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\trange: 20 ..< 80,\n\t\t\t\t\tfillColor: DSFColor.systemGray.withAlphaComponent(0.2).cgColor\n\t\t\t\t)\n\t\t\t],\n\t\t\tgridLines: .init(values: [0, 25, 50, 75, 100])\n\t\t)\n\t\t.frame(width: 250.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarNofill: View {\n\tvar body: some View {\n\t\tText(\"Bar no fill\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource3,\n\t\t\tgraphColor: DSFColor.systemYellow,\n\t\t\tlineWidth: 3\n\t\t)\n\t\t.frame(width: 330.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarRange2: View {\n\tvar body: some View {\n\t\tText(\"Bar with range\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource4,\n\t\t\tgraphColor: DSFColor.systemRed,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\thighlightDefinitions: [\n\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\trange: 0.3 ..< 0.7,\n\t\t\t\t\tfillColor: DSFColor.systemPink.withAlphaComponent(0.1).cgColor\n\t\t\t\t)\n\t\t\t]\n\t\t)\n\t\t.frame(width: 330.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct BarCenteredZeroLine2: View {\n\tvar body: some View {\n\t\tText(\"Bar centered around zero-line\")\n\t\tDSFSparklineBarGraphView.SwiftUI(\n\t\t\tdataSource: BarDataSource4,\n\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition(\n\t\t\t\tcolor: DSFColor.systemGray,\n\t\t\t\tlineWidth: 1,\n\t\t\t\tlineDashStyle: []),\n\t\t\tcenteredAtZeroLine: true,\n\t\t\tlowerGraphColor: DSFColor.systemPink\n\t\t)\n\t\t.frame(width: 100.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\n\nstruct BarDemoContentView: View {\n\tvar body: some View {\n\t\tScrollView {\n\t\t\tVStack {\n\t\t\t\tBarBasic()\n\t\t\t\tBarZeroLine()\n\t\t\t\tBarWithCustomFill()\n\t\t\t\tBarCenteredZeroLine()\n\t\t\t\tBarCenteredZeroLineColored()\n\t\t\t\tBarCenteredZeroLineCustomFill()\n\t\t\t\tBarRange()\n\t\t\t\tBarNofill()\n\t\t\t\tBarRange2()\n\t\t\t\tBarCenteredZeroLine2()\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct BarDemoContentView_Previews: PreviewProvider {\n    static var previews: some View {\n\t\tBarDemoContentView()\n    }\n}\n\n\n\n\n\nfileprivate var BarDataSource1: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.4)\n\td.push(values: [\n\t\t0.85, 0.04, 0.24, 0.13, 0.51, 0.93, 0.26, 0.69, 0.16, 0.39,\n\t\t0.19, 0.12, 0.28, 0.42, 0.42, 0.48, 0.29, 0.05, 0.87, 0.28\n\t])\n\n\treturn d\n}()\n\nfileprivate var BarDataSource2: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 8, range: 0 ... 100)\n\td.push(values: [100, 0, 25, 50, 75, 10, 10, 88])\n\treturn d\n}()\n\nfileprivate var BarDataSource3: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 21, range: -1 ... 1)\n\n\tvar sins: CGFloat = 0.0\n\tlet r: Range<Int> = 0 ..< 21\n\tlet vars: [CGFloat] = r.map { sin(CGFloat($0)) }\n\td.push(values: vars)\n\treturn d\n}()\n\nfileprivate var BarDataSource4: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 21, range: 0 ... 1)\n\td.zeroLineValue = 0.5\n\td.push(values: [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0])\n\treturn d\n}()\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/BitmapGenerationView.swift",
    "content": "//\n//  BitmapGenerationView.swift\n//  Demos\n//\n//  Created by Darren Ford on 25/2/21.\n//\n\nimport SwiftUI\n\nimport DSFSparkline\n\nfileprivate let b1: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [1, 5, 3, 4], range: 0 ... 6)\n\n\tlet li = DSFSparklineOverlay.GridLines()\n\tli.dataSource = dataSource\n\tli.floatValues = [1, 3, 5]\n\tli.strokeWidth = 0.5\n\tli.dashStyle = [0.5, 0.5]\n\tli.strokeColor = DSFColor.gray.withAlphaComponent(0.3).cgColor\n\tb.addOverlay(li)\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.primaryTextColor.cgColor\n\tl.primaryFill = DSFSparkline.Fill.Gradient(colors: [\n\t\tDSFColor.systemRed.cgColor,\n\t\tDSFColor.systemBlue.cgColor,\n\t])\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let b200: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [1, 5, 3, 4], range: 0 ... 6)\n\n\tlet li = DSFSparklineOverlay.GridLines()\n\tli.dataSource = dataSource\n\tli.floatValues = [1, 3, 5]\n\tli.strokeWidth = 0.5\n\tli.dashStyle = [0.5, 0.5]\n\tli.strokeColor = DSFColor.gray.withAlphaComponent(0.3).cgColor\n\tb.addOverlay(li)\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.primaryTextColor.cgColor\n\tl.primaryFill = DSFSparkline.Fill.Gradient(colors: [\n\t\tDSFColor.systemRed.cgColor,\n\t\tDSFColor.systemBlue.cgColor,\n\t], isHorizontal: true)\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let b2: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [1, 5, 3, 4], range: 0 ... 6)\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.black.cgColor\n\tl.strokeWidth = 1.0\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let b3: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [1, 5, 3, 4])\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.systemPink.cgColor\n\tl.strokeWidth = 1.0\n\tl.shadow = NSShadow(blurRadius: 2.0, offset: CGSize(width: 1, height: -1), color: DSFColor.gray.withAlphaComponent(0.5))\n\tl.markerSize = 6\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let b4: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [1, 5, 3, 4])\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.systemPink.cgColor\n\tl.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemPink.withAlphaComponent(0.3).cgColor)\n\tl.strokeWidth = 3.0\n\tl.interpolated = true\n\tl.markerSize = 6\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let b5: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [4, 2, 9, 9, 0, 9, 0, 4])\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.systemIndigo.cgColor\n\tl.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemIndigo.withAlphaComponent(0.3).cgColor)\n\tl.strokeWidth = 3.0\n\tl.interpolated = true\n\tl.markerSize = 6\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let b6: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet dataSource = DSFSparkline.DataSource(values: [4, 2, 9, 9, 0, 9, 0, 4])\n\n\tlet l = DSFSparklineOverlay.Line()\n\tl.primaryStrokeColor = DSFColor.systemIndigo.cgColor\n\tl.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemIndigo.withAlphaComponent(0.3).cgColor)\n\tl.strokeWidth = 3.0\n\tl.interpolated = true\n\tl.centeredAtZeroLine = true\n\n\tl.markerSize = 6\n\n\tdataSource.zeroLineValue = 5\n\tl.dataSource = dataSource\n\n\tl.secondaryStrokeColor = DSFColor.systemTeal.cgColor\n\tl.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemTeal.withAlphaComponent(0.3).cgColor)\n\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\nfileprivate let tablet1: DSFSparklineSurface.Bitmap = {\n\tlet b = DSFSparklineSurface.Bitmap()\n\n\tlet l = DSFSparklineOverlay.Tablet()\n\n\tl.winStrokeColor = DSFColor.systemGreen.withAlphaComponent(0.5).cgColor\n\tl.winFill = DSFSparkline.Fill.Gradient(colors: [\n\t\tDSFColor.systemGreen.withAlphaComponent(0.8).cgColor,\n\t\tDSFColor.systemGreen.withAlphaComponent(0.2).cgColor\n\t])\n\n\tl.lossStrokeColor = DSFColor.systemRed.withAlphaComponent(0.5).cgColor\n\tl.lossFill = DSFSparkline.Fill.Gradient(colors: [\n\t\tDSFColor.systemRed.withAlphaComponent(0.2).cgColor,\n\t\tDSFColor.systemRed.withAlphaComponent(0.6).cgColor\n\t])\n\n\tlet dataSource = DSFSparkline.DataSource(\n\t\tvalues: [-1, 5, 3, -7, -2, 2, 5, -1, 5, 3, -7, -2, 2, 5, -1, 5, 3, -7, -2, 2, 5])\n\tl.dataSource = dataSource\n\tb.addOverlay(l)\n\n\treturn b\n}()\n\n\nfileprivate let percentBar: DSFSparklineSurface.Bitmap = {\n\tlet bitmap = DSFSparklineSurface.Bitmap()\n\tlet percentbar = DSFSparklineOverlay.PercentBar(value: 0.42)\n\tbitmap.addOverlay(percentbar)\n\n\t// Generate an image with retina scale\n\treturn bitmap\n}()\n\nfileprivate let wiperGauge: DSFSparklineSurface.Bitmap = {\n\tlet bitmap = DSFSparklineSurface.Bitmap()\n\tlet wiperGauge = DSFSparklineOverlay.WiperGauge()\n\twiperGauge.value = 0.35\n\tbitmap.addOverlay(wiperGauge)\n\n\t// Generate an image with retina scale\n\treturn bitmap\n}()\n\nfileprivate let wiperGauge2: DSFSparklineSurface.Bitmap = {\n\tlet bitmap = DSFSparklineSurface.Bitmap()\n\tlet wiperGauge = DSFSparklineOverlay.WiperGauge()\n\twiperGauge.value = 0.8\n\twiperGauge.valueColor = .init(flatColor: CGColor(srgbRed: 0.3, green: 1, blue: 0.3, alpha: 1))\n\twiperGauge.valueBackgroundColor = CGColor(srgbRed: 1, green: 0.3, blue: 0.3, alpha: 1)\n\twiperGauge.gaugeUpperArcColor = CGColor(gray: 0, alpha: 1)\n\twiperGauge.gaugePointerColor = CGColor(gray: 0.3, alpha: 1)\n\twiperGauge.gaugeBackgroundColor = CGColor(srgbRed: 1, green: 1, blue: 0.4, alpha: 1)\n\tbitmap.addOverlay(wiperGauge)\n\n\t// Generate an image with retina scale\n\treturn bitmap\n}()\n\nstruct BitmapGenerationView: View {\n\n\t#if os(macOS)\n\tfunc makeImage(_ nsImage: NSImage) -> Image {\n\t\treturn Image(nsImage: nsImage)\n\t}\n\tfunc generate(_ bitmap: DSFSparklineSurface.Bitmap, size: CGSize) -> NSImage {\n\t\tguard let image = bitmap.image(size: size, scale: 2) else {\n\t\t\treturn NSImage(systemSymbolName: \"exclamationmark.triangle.fill\", accessibilityDescription: nil)!\n\t\t}\n\t\treturn image\n\t}\n\t#else\n\tfunc makeImage(_ uiImage: UIImage) -> Image {\n\t\treturn Image(uiImage: uiImage)\n\t}\n\n\tfunc generate(_ bitmap: DSFSparklineSurface.Bitmap, size: CGSize) -> UIImage {\n\t\tguard let image = bitmap.image(size: size, scale: 2) else {\n\t\t\treturn UIImage(systemName: \"exclamationmark.triangle.fill\")!\n\t\t}\n\t\treturn image\n\t}\n\t#endif\n\n\tvar body: some View {\n\t\tVStack {\n\n\t\t\tText(\"Sparkline images created using DSFSparklineSurface.Bitmap\")\n\n\t\t\tVStack {\n\t\t\t\tmakeImage(self.generate(b1, size: CGSize(width: 200, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\n\t\t\t\tmakeImage(self.generate(b200, size: CGSize(width: 200, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\n\t\t\t\tmakeImage(self.generate(b2, size: CGSize(width: 200, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\t\t\t}\n\n\t\t\tDivider()\n\n\t\t\tVStack {\n\t\t\t\tmakeImage(self.generate(b3, size: CGSize(width: 200, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\n\t\t\t\tmakeImage(self.generate(b4, size: CGSize(width: 200, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\t\t\t}\n\n\t\t\tDivider()\n\n\t\t\tHStack {\n\t\t\t\tmakeImage(self.generate(b5, size: CGSize(width: 100, height: 30)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\t\t\t\tmakeImage(self.generate(b6, size: CGSize(width: 100, height: 30)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\t\t\t}\n\n\t\t\tDivider()\n\n\t\t\tmakeImage(self.generate(tablet1, size: CGSize(width: 400, height: 20)))\n\t\t\t\t.padding(4)\n\t\t\t\t.border(Color.gray)\n\n\t\t\tDivider()\n\n\t\t\tHStack {\n\t\t\t\tmakeImage(self.generate(percentBar, size: CGSize(width: 200, height: 20)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\n\t\t\t\tmakeImage(self.generate(wiperGauge, size: CGSize(width: 80, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\n\t\t\t\tmakeImage(self.generate(wiperGauge2, size: CGSize(width: 80, height: 40)))\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.border(Color.gray)\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct BitmapGenerationView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tBitmapGenerationView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/CircularGaugeView.swift",
    "content": "//\n//  TestingView.swift\n//  Demos\n//\n//  Created by Darren Ford on 14/4/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nstruct TrackStyle {\n\tvar color: Color = .black\n\tvar width: Double = 10\n\n\tvar hasShadow: Bool = false\n\tvar shadowInner: Bool = false\n\tvar shadowColor: Color = Color(white: 0, opacity: 0.8)\n\tvar shadowOffset: CGSize = CGSize(width: 2, height: 2)\n\tvar shadowBlur: Double = 2\n\n\tvar hasStroke: Bool = false\n\tvar strokeColor: Color = .black\n\tvar strokeWidth: Double = 0.5\n\n\tvar shadow: DSFSparkline.Shadow? {\n\t\tif hasShadow {\n\t\t\treturn DSFSparkline.Shadow(\n\t\t\t\tblurRadius: shadowBlur,\n\t\t\t\toffset: shadowOffset,\n\t\t\t\tcolor: shadowColor.cgColor ?? CGColor.black,\n\t\t\t\tisInner: shadowInner\n\t\t\t)\n\t\t}\n\t\treturn nil\n\t}\n\n\tvar track: DSFSparklineOverlay.CircularGauge.TrackStyle {\n\t\tDSFSparklineOverlay.CircularGauge.TrackStyle(\n\t\t\twidth: width,\n\t\t\tfillColor: DSFSparkline.Fill.Color(color.cgColor ?? .black),\n\t\t\tstrokeWidth: strokeWidth,\n\t\t\tstrokeColor: hasStroke ? strokeColor.cgColor : nil,\n\t\t\tshadow: shadow\n\t\t)\n\t}\n}\n\nstruct CircularGaugeView: View {\n\n\t@State var value: Double = 0.25\n\n\t@State var trackStyle = TrackStyle(color: Color(red: 1, green: 0, blue: 0, opacity: 0.1), width: 40)\n\t@State var lineStyle = TrackStyle(color: Color(red: 1, green: 0, blue: 0, opacity: 1), width: 20)\n\n\tvar body: some View {\n\n\t\t//Self._printChanges()\n\n\t\treturn VStack {\n\t\t\tDSFSparklineCircularGaugeView.SwiftUI(\n\t\t\t\tvalue: value,\n\t\t\t\ttrackStyle: trackStyle.track,\n\t\t\t\tlineStyle: lineStyle.track\n\t\t\t)\n\t\t\t.frame(width: 200, height: 200)\n\n\t\t\tSlider(value: $value, in: 0 ... 1) {\n\t\t\t\tText(\"Value\")\n\t\t\t}\n\n\t\t\t#if os(macOS)\n\t\t\tHStack(spacing: 16) {\n\t\t\t\tGroupBox(\"Track Settings\") {\n\t\t\t\t\tTrackSettingsView(style: $trackStyle)\n\t\t\t\t\t\t.padding(8)\n\t\t\t\t}\n\t\t\t\tGroupBox(\"Value Settings\") {\n\t\t\t\t\tTrackSettingsView(style: $lineStyle)\n\t\t\t\t\t\t.padding(8)\n\t\t\t\t}\n\t\t\t}\n\t\t\t#else\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tTrackSettingsView(style: $trackStyle)\n\t\t\t\tTrackSettingsView(style: $lineStyle)\n\t\t\t}\n\t\t\t.frame(maxHeight: .infinity)\n\t\t\t#endif\n\n\t\t\tDivider()\n\n\t\t\tAnimatedGaugeView()\n\t\t}\n\t\t.padding()\n\t}\n}\n\nstruct TrackSettingsView: View {\n\n\t@Binding var style: TrackStyle\n\n\tvar body: some View {\n\n\t\t//Self._printChanges()\n\n\t\treturn Form {\n\t\t\tColorPicker(\"Color\", selection: $style.color)\n\t\t\tSlider(value: $style.width, in: 0.1 ... 50) {\n\t\t\t\tText(\"Width\")\n\t\t\t}\n\t\t\tDivider()\n\t\t\tToggle(\"Shadow\", isOn: $style.hasShadow)\n\t\t\tToggle(\"Inner Shadow\", isOn: $style.shadowInner)\n\t\t\t\t.disabled(!style.hasShadow)\n\t\t\tColorPicker(\"Shadow Color\", selection: $style.shadowColor)\n\t\t\t\t.disabled(!style.hasShadow)\n\n\t\t\tSlider(value: $style.shadowOffset.width, in: -10 ... 10) {\n\t\t\t\tText(\"X Offset\")\n\t\t\t}\n\t\t\t.disabled(!style.hasShadow)\n\t\t\tSlider(value: $style.shadowOffset.height, in: -10 ... 10) {\n\t\t\t\tText(\"Y Offset\")\n\t\t\t}\n\t\t\t.disabled(!style.hasShadow)\n\t\t\tSlider(value: $style.shadowBlur, in: 0.1 ... 10) {\n\t\t\t\tText(\"Blur\")\n\t\t\t}\n\t\t\t.disabled(!style.hasShadow)\n\n\t\t\tDivider()\n\n\t\t\tToggle(\"Stroke\", isOn: $style.hasStroke)\n\t\t\tColorPicker(\"Stroke Color\", selection: $style.strokeColor)\n\t\t\t\t.disabled(!style.hasStroke)\n\t\t\tSlider(value: $style.strokeWidth, in: 0.1 ... 5) {\n\t\t\t\tText(\"Stroke Width\")\n\t\t\t}\n\t\t\t.disabled(!style.hasStroke)\n\t\t}\n\t}\n}\n\nstruct AnimatedGaugeView: View {\n\n\t@State var r1: Double = 0.25\n\t@State var r1tStyle = TrackStyle(color: Color(red: 0, green: 1, blue: 0, opacity: 0.1), width: 15)\n\t@State var r1lStyle = TrackStyle(color: Color(red: 0, green: 1, blue: 0, opacity: 1), width: 7)\n\n\t@State var r2: Double = 0.5\n\t@State var r2tStyle = TrackStyle(color: Color(red: 0, green: 0, blue: 1, opacity: 0.1), width: 15)\n\t@State var r2lStyle = TrackStyle(color: Color(red: 0, green: 0, blue: 1, opacity: 1), width: 7)\n\n\t@State var duration: Double = 0.25\n\n\tvar body: some View {\n\t\t\n\t\t//Self._printChanges()\n\n\t\treturn HStack {\n\t\t\tSlider(value: $duration, in: 0.01 ... 2) {\n\t\t\t\tText(\"Duration\")\n\t\t\t}\n\t\t\t\n\t\t\tButton(\"Animate!\") {\n\t\t\t\tr1 = Double.random(in: 0 ... 1)\n\t\t\t\tr2 = Double.random(in: 0 ... 1)\n\t\t\t}\n\n\t\t\tDSFSparklineCircularGaugeView.SwiftUI(\n\t\t\t\tvalue: r1,\n\t\t\t\tanimationStyle: .init(duration: duration, function: .linear),\n\t\t\t\ttrackStyle: r1tStyle.track,\n\t\t\t\tlineStyle: r1lStyle.track\n\t\t\t)\n\t\t\t.frame(width: 50, height: 50)\n\n\t\t\tDSFSparklineCircularGaugeView.SwiftUI(\n\t\t\t\tvalue: r2,\n\t\t\t\tanimationStyle: .init(duration: duration, function: .easeInEaseOut),\n\t\t\t\ttrackStyle: r2tStyle.track,\n\t\t\t\tlineStyle: r2lStyle.track\n\t\t\t)\n\t\t\t.frame(width: 50, height: 50)\n\t\t}\n\t}\n}\n\n#Preview(\"All\") {\n\tCircularGaugeView()\n\t\t.padding()\n}\n\n#Preview(\"Settings\") {\n\tTrackSettingsView(style: .constant(TrackStyle()))\n\t\t.padding()\n}\n\n#Preview(\"Animated\") {\n\tAnimatedGaugeView()\n\t\t.padding()\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/CircularProgress.swift",
    "content": "//\n//  CircularProgressView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/24.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfunc namedImage(_ name: String) -> CGImage? {\n#if os(macOS)\n\tif #available(macOS 11.0, *) {\n\t\treturn NSImage(systemSymbolName: name, accessibilityDescription: nil)?.cgImage(forProposedRect: nil, context: nil, hints: nil)\n\t}\n\treturn nil\n#else\n\treturn UIImage(systemName: name)?.cgImage\n#endif\n}\n\nstruct CircularProgressView: View {\n\n\tlet g = DSFSparkline.Fill.Gradient(\n\t\tcolors: [\n\t\t\tCGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 1.0),\n\t\t\tCGColor(srgbRed: 0.891, green: 0.000, blue: 0.090, alpha: 1.0),\n\t\t]\n\t)\n\tlet g1 = DSFSparkline.Fill.Gradient(\n\t\tcolors: [\n\t\t\tCGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 1.0),\n\t\t\tCGColor(srgbRed: 0.601, green: 1.000, blue: 0.009, alpha: 1.0),\n\t\t]\n\t)\n\tlet g2 = DSFSparkline.Fill.Gradient(\n\t\tcolors: [\n\t\t\tCGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 1.0),\n\t\t\tCGColor(srgbRed: 0.015, green: 0.847, blue: 1.000, alpha: 1.0),\n\t\t]\n\t)\n\tlet g3 = DSFSparkline.Fill.Gradient(\n\t\tcolors: [\n\t\t\tCGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 1.0),\n\t\t\tCGColor(srgbRed: 0.996, green: 0.459, blue: 0.000, alpha: 1.0),\n\t\t]\n\t)\n\n\tlet i1: CGImage? = namedImage(\"arrow.right\")\n\tlet i2: CGImage? = namedImage(\"arrow.up\")\n\tlet i3: CGImage? = namedImage(\"arrow.triangle.swap\")\n\n\t@State var value: Double = 0.25\n\t@State var padding: Double = 2\n\t@State var trackWidth: Double = 20\n\t@State var showIcons: Bool = false\n\n\t@State var trackColor: CGColor?\n\n\tvar body: some View {\n\t\tVStack(spacing: 8) {\n\t\t\tHStack(spacing: 16) {\n\t\t\t\tZStack {\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tfillStyle: g,\n\t\t\t\t\t\ttrackWidth: trackWidth,\n\t\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1),\n\t\t\t\t\t\ttrackIcon: showIcons ? i1 : nil\n\t\t\t\t\t)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\t\tvalue: value * 0.8,\n\t\t\t\t\t\tfillStyle: g1,\n\t\t\t\t\t\ttrackWidth: trackWidth,\n\t\t\t\t\t\tpadding: 1 * (trackWidth + padding),\n\t\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1),\n\t\t\t\t\t\ttrackIcon: showIcons ? i2 : nil\n\t\t\t\t\t)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\t\tvalue: value * 0.6,\n\t\t\t\t\t\tfillStyle: g2,\n\t\t\t\t\t\ttrackWidth: trackWidth,\n\t\t\t\t\t\tpadding: 2 * (trackWidth + padding),\n\t\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1),\n\t\t\t\t\t\ttrackIcon: showIcons ? i3 : nil\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\t.frame(width: 200, height: 200)\n\n\t\t\t\tZStack {\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(CGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1)),\n\t\t\t\t\t\ttrackWidth: trackWidth,\n\t\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1),\n\t\t\t\t\t\ttrackIcon: showIcons ? i1 : nil\n\t\t\t\t\t)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\t\tvalue: value * 0.8,\n\t\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(CGColor(srgbRed: 0, green: 1, blue: 0, alpha: 1)),\n\t\t\t\t\t\ttrackWidth: trackWidth,\n\t\t\t\t\t\tpadding: 1 * (trackWidth + padding),\n\t\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1),\n\t\t\t\t\t\ttrackIcon: showIcons ? i2 : nil\n\t\t\t\t\t)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\t\tvalue: value * 0.6,\n\t\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(CGColor(srgbRed: 0, green: 0, blue: 1, alpha: 1)),\n\t\t\t\t\t\ttrackWidth: trackWidth,\n\t\t\t\t\t\tpadding: 2 * (trackWidth + padding),\n\t\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1),\n\t\t\t\t\t\ttrackIcon: showIcons ? i3 : nil\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\t.frame(width: 200, height: 200)\n\t\t\t}\n\n\t\t\tForm {\n\t\t\t\tSlider(value: $value, in: 0 ... 2.5) { Text(\"Value\") }\n\t\t\tminimumValueLabel: { Text(\"0\") }\n\t\t\tmaximumValueLabel: { Text(\"2.5\") }\n\t\t\t\tSlider(value: $trackWidth, in: 5 ... 25) { Text(\"Track Width\") }\n\t\t\tminimumValueLabel: { Text(\"5\") }\n\t\t\tmaximumValueLabel: { Text(\"25\") }\n\t\t\t\tSlider(value: $padding, in: 0 ... 10) { Text(\"Track padding\") }\n\t\t\tminimumValueLabel: { Text(\"0\") }\n\t\t\tmaximumValueLabel: { Text(\"10\") }\n\t\t\t\tToggle(isOn: $showIcons) {\n\t\t\t\t\tText(\"Show icons\")\n\t\t\t\t}\n\t\t\t}\n\t\t\t#if os(iOS)\n\t\t\t.frame(height: 250)\n\t\t\t#endif\n\n\t\t\tDivider()\n\n\t\t\tHStack {\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 0.2,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 1),\n\t\t\t\t\ttrackWidth: 5,\n\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)\n\t\t\t\t)\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 0.80,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0, alpha: 1),\n\t\t\t\t\ttrackWidth: 5,\n\t\t\t\t\ttrackColor: CGColor(srgbRed: 1.000, green: 1.000, blue: 0, alpha: 0.1)\n\t\t\t\t)\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 0.35,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(srgbRed: 0, green: 1, blue: 0, alpha: 1),\n\t\t\t\t\ttrackWidth: 5,\n\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1)\n\t\t\t\t)\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 0.80,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1, alpha: 1),\n\t\t\t\t\ttrackWidth: 5,\n\t\t\t\t\ttrackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1)\n\t\t\t\t)\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 1.3,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(gray: 1, alpha: 1),\n\t\t\t\t\ttrackWidth: 5\n\t\t\t\t)\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 0.65,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(gray: 0, alpha: 1),\n\t\t\t\t\ttrackWidth: 5,\n\t\t\t\t\ttrackColor: CGColor(gray: 0, alpha: 0.3)\n\t\t\t\t)\n\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(\n\t\t\t\t\tvalue: 0.65,\n\t\t\t\t\tfillStyle: DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 1),\n\t\t\t\t\ttrackWidth: 5,\n\t\t\t\t\ttrackColor: CGColor(red: 1, green: 1, blue: 0, alpha: 1)\n\t\t\t\t)\n\t\t\t}\n\t\t\t.frame(height: 32)\n\t\t}\n\t\t.padding()\n\t}\n}\n\nstruct CircularProgressView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tCircularProgressView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/ContentView.swift",
    "content": "//\n//  ContentView.swift\n//  Shared\n//\n//  Created by Darren Ford on 27/1/21.\n//\n\nimport DSFSparkline\nimport SwiftUI\n\n\nstruct Item: Identifiable {\n\tlet id: Int\n\tlet name: String\n}\n\n\nstruct ContentView: View {\n\n\tlet items: [Item] = [\n\t\tItem(id: 0, name: \"ReportView\"),\n\t\tItem(id: 1, name: \"WinLossTie\"),\n\t\tItem(id: 2, name: \"Tablet\"),\n\t\tItem(id: 3, name: \"Line\"),\n\t\tItem(id: 4, name: \"Stackline\"),\n\t\tItem(id: 5, name: \"Pie Chart\"),\n\t\tItem(id: 6, name: \"Databar\"),\n\t\tItem(id: 7, name: \"Dot\"),\n\t\tItem(id: 8, name: \"Stripes\"),\n\t\tItem(id: 9, name: \"Active\"),\n\t\tItem(id: 10, name: \"Bar\"),\n\t\tItem(id: 11, name: \"Bitmap Testing\"),\n\t\tItem(id: 12, name: \"SwiftUI Overlays\"),\n\t\tItem(id: 13, name: \"Percent Bar\"),\n\t\tItem(id: 14, name: \"Wiper Gauge\"),\n\t\tItem(id: 15, name: \"Activity Grid\"),\n\t\tItem(id: 16, name: \"Circular Progress\"),\n\t\tItem(id: 17, name: \"Circular Gauge\"),\n\n\t\tItem(id: 99, name: \"Testing Harness\")\n\t]\n\n\tvar body: some View {\n\t\tNavigationView {\n\t\t\tList(items) { item in\n\t\t\t\tNavigationLink(destination: DetailView(item: item))  {\n\t\t\t\t\tText(\"\\(item.name)\")\n\t\t\t\t}\n\t\t\t} //.navigationBarTitle(\"Dynamic List\")\n\t\t}\n\t}\n}\n\nstruct ContentView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tContentView()\n\t}\n}\n\n\nstruct DetailView: View {\n\tlet item: Item\n\tvar body: some View {\n\t\t//Self._printChanges()\n\t\treturn ScrollView([.vertical]) {\n\t\t\tswitch item.id {\n\t\t\tcase 0: ReportView()\n\t\t\tcase 1: WinLossCreate()\n\t\t\tcase 2: TabletView(shouldAnimate: true)\n\t\t\tcase 3: LineDemoContentView()\n\t\t\tcase 4: StackLineDemoContentView()\n\t\t\tcase 5: PieGraphDemoView()\n\t\t\tcase 6: DataBarGraphContent()\n\t\t\tcase 7: DotGraphView()\n\t\t\tcase 8: StripesDemoView()\n\t\t\tcase 9: MakeActiveView()\n\t\t\tcase 10: BarDemoContentView()\n\t\t\tcase 11: BitmapGenerationView()\n\t\t\tcase 12: SwiftUIView(shouldAnimate: true)\n\t\t\tcase 13: PercentBarView()\n\t\t\tcase 14: WiperGraphDemoView()\n\t\t\tcase 15: ActivityGridView()\n\t\t\tcase 16: CircularProgressView()\n\t\t\tcase 17: CircularGaugeView()\n\n\t\t\tcase 99: TestingView()\n\n\t\t\tdefault: fatalError()\n\t\t\t}\n\t\t}\n//\t\t.padding()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/DataBarGraphContent.swift",
    "content": "//\n//  DataBarGraphContent.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfileprivate let firstDataSourceDataBar = DSFSparkline.StaticDataSource([10, 40, 25])\nfileprivate let secondDataSourceDataBar = DSFSparkline.StaticDataSource([33, 33, 33])\nfileprivate let thirdDataSourceDataBar = DSFSparkline.StaticDataSource([85, 10, 19])\nfileprivate let fourthDataSourceDataBar = DSFSparkline.StaticDataSource([3, 4, 5])\n\nfileprivate let palette1 = DSFSparkline.Palette([.systemRed, .systemOrange, .systemYellow])\nfileprivate let grays = DSFSparkline.Palette([\n\tDSFColor.init(white: 0.80, alpha: 1),\n\tDSFColor.init(white: 0.60, alpha: 1),\n\tDSFColor.init(white: 0.40, alpha: 1)\n])\n\nstruct DataBarGraphContent: View {\n\tvar body: some View {\n\t\tVStack(spacing: 8) {\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tText(\"No stroke\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: firstDataSourceDataBar,\n\t\t\t\t\tpalette: palette1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 24)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: secondDataSourceDataBar,\n\t\t\t\t\tpalette: palette1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 24)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: thirdDataSourceDataBar,\n\t\t\t\t\tpalette: palette1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 24)\n\t\t\t}\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tText(\"Stroke\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: firstDataSourceDataBar,\n\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 24)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: secondDataSourceDataBar,\n\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 24)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: thirdDataSourceDataBar,\n\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 24)\n\t\t\t}\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: fourthDataSourceDataBar,\n\t\t\t\t\tpalette: grays\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.shared.colors.count)),\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.sharedGrays.colors.count)),\n\t\t\t\t\tpalette: .sharedGrays,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([5, 2, 4, 8]),\n\t\t\t\t\tstrokeColor: DSFColor.gray,\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\t\t\t}\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: fourthDataSourceDataBar,\n\t\t\t\t\tpalette: grays,\n\t\t\t\t\tanimationStyle: DSFSparkline.AnimationStyle(duration: 1, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.shared.colors.count)),\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tanimationStyle: .init(duration: 1, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.sharedGrays.colors.count)),\n\t\t\t\t\tpalette: .sharedGrays,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tanimationStyle: .init(duration: 1, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\n\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([5, 2, 4, 8]),\n\t\t\t\t\tstrokeColor: DSFColor.gray,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tanimationStyle: .init(duration: 1, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 96, height: 36)\n\t\t\t}\n\n\t\t\tText(\"Data Bar with maximum value defined\")\n\n\t\t\tVStack{\n\t\t\t\tHStack(spacing: 20) {\n\t\t\t\t\tVStack(spacing: 8) {\n\t\t\t\t\t\tText(\"No Background Color\")\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([2, 4, 8]),\n\t\t\t\t\t\t\tmaximumTotalValue: 20,\n\t\t\t\t\t\t\tpalette: palette1,\n\t\t\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\t\t\tanimationStyle: .init(duration: 0.5, function: .linear)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(height: 24)\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3), width: 0.5)\n\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([5, 10, 5]),\n\t\t\t\t\t\t\tmaximumTotalValue: 20,\n\t\t\t\t\t\t\tpalette: palette1,\n\t\t\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\t\t\tanimationStyle: .init(duration: 0.5, function: .linear)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(height: 24)\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3), width: 0.5)\n\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([1, 3, 5]),\n\t\t\t\t\t\t\tmaximumTotalValue: 20,\n\t\t\t\t\t\t\tpalette: palette1,\n\t\t\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\t\t\tanimationStyle: .init(duration: 0.5, function: .linear)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(height: 24)\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3), width: 0.5)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 192)\n\n\t\t\t\t\tVStack(spacing: 8) {\n\t\t\t\t\t\tText(\"Background color defined\")\n\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([3, 3, 5]),\n\t\t\t\t\t\t\tmaximumTotalValue: 14,\n\t\t\t\t\t\t\tpalette: palette1,\n\t\t\t\t\t\t\tunsetColor: DSFColor.black,\n\t\t\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\t\t\tanimationStyle: .init(duration: 0.5, function: .easeInEaseOut)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(height: 24)\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3), width: 0.5)\n\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([12, 2, 5]),\n\t\t\t\t\t\t\tmaximumTotalValue: 20,\n\t\t\t\t\t\t\tpalette: palette1,\n\t\t\t\t\t\t\tunsetColor: DSFColor.black,\n\t\t\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\t\t\tanimationStyle: .init(duration: 0.5, function: .easeInEaseOut)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(height: 24)\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3), width: 0.5)\n\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([1, 10, 5]),\n\t\t\t\t\t\t\tmaximumTotalValue: 20,\n\t\t\t\t\t\t\tpalette: palette1,\n\t\t\t\t\t\t\tunsetColor: DSFColor.black,\n\t\t\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\t\t\tanimationStyle: .init(duration: 0.5, function: .easeInEaseOut)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(height: 24)\n\t\t\t\t\t\t.padding(3)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3), width: 0.5)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 192)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.padding()\n\n\t}\n}\n\n\n\nstruct DataBarGraphContent_Previews: PreviewProvider {\n    static var previews: some View {\n        DataBarGraphContent()\n    }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/DotGraphView.swift",
    "content": "//\n//  DotGraphView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfileprivate var data1: DSFSparkline.DataSource = {\n\tlet e = DSFSparkline.DataSource(windowSize: 100, range: 0 ... 100)\n\tlet values: [CGFloat] = (0 ..< 100).map { _ in\n\t\tCGFloat.random(in: 0 ... 100)\n\t}\n\te.set(values: values)\n\treturn e\n}()\n\nfileprivate var animData1: DSFSparkline.DataSource = {\n\tlet e = DSFSparkline.DataSource(windowSize: 100, range: 0 ... 100)\n\treturn e\n}()\n\n\nstruct DotStandard: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Basic Dot\")\n\t\t\tDSFSparklineDotGraphView.SwiftUI(\n\t\t\t\tdataSource: data1,\n\t\t\t\tgraphColor: DSFColor.systemGreen\n\t\t\t)\n\t\t\t.frame(height: 40)\n\t\t\t.padding(4)\n\n\t\t\tText(\"Basic Dot Upside Down with unset color\")\n\t\t\tDSFSparklineDotGraphView.SwiftUI(\n\t\t\t\tdataSource: data1,\n\t\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\t\tunsetGraphColor: DSFColor.gray.withAlphaComponent(0.1),\n\t\t\t\tupsideDown: true\n\t\t\t)\n\t\t\t.frame(height: 40)\n\t\t\t.padding(4)\n\t\t}\n\t\t.frame(width: 400)\n\t}\n}\n\nstruct DotStandardAnim: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Animated Dot\")\n\t\t\tDSFSparklineDotGraphView.SwiftUI(\n\t\t\t\tdataSource: animData1,\n\t\t\t\tgraphColor: DSFColor.systemRed,\n\t\t\t\tunsetGraphColor: DSFColor.gray.withAlphaComponent(0.1))\n\t\t\t\t.frame(width: 300, height: 40)\n\t\t\t\t.padding(4)\n\t\t\t\t.onAppear(perform: {\n\t\t\t\t\tstartAnim()\n\t\t\t\t})\n\t\t}\n\t}\n\n\tfunc startAnim() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n\t\t\tanimData1.push(value: CGFloat.random(in: 0 ... 100))\n\t\t\tself.startAnim()\n\t\t}\n\t}\n}\n\n\n\n\nstruct DotGraphView: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tDotStandard()\n\t\t\tDotStandardAnim()\n\t\t}\n    }\n}\n\n\n\n\n\n\n\nstruct DotGraphView_Previews: PreviewProvider {\n    static var previews: some View {\n        DotGraphView()\n    }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/Extensions.swift",
    "content": "//\n//  Extensions.swift\n//  Demos\n//\n//  Created by Darren Ford on 26/2/21.\n//\n\nimport CoreGraphics\n\n#if !os(macOS)\ninternal extension CGColor {\n\tstatic var black: CGColor {\n\t\treturn CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 0, 0, 1])!\n\t}\n\tstatic var clear: CGColor {\n\t\treturn CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 0, 0, 0])!\n\t}\n}\n#endif\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/LineDemoContentView.swift",
    "content": "//\n//  LineDemoContentView.swift\n//  SwiftUI Demo\n//\n//  Created by Darren Ford on 27/1/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nvar LineSource1: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.5)\n\td.push(values: [\n\t\t0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.95, 0.44, 0.02, 0.27,\n\t\t0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n\t])\n\treturn d\n}()\n\nlet GraphColor = DSFColor.gray\n\nstruct LineDemoBasic: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tshadowed: true\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: false\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoBasic_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoBasic()\n//\t}\n//}\n\nstruct LineDemoBasicMarkers: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line with markers\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoBasicMarkers_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoBasicMarkers()\n//\t}\n//}\n\nstruct LineDemoMarkersAndShadow: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line with markers and shadow\")\n\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\tdataSource: LineSource1,\n\t\t\t\tgraphColor: GraphColor,\n\t\t\t\tlineWidth: 1,\n\t\t\t\tlineShading: false,\n\t\t\t\tshadowed: true,\n\t\t\t\tmarkerSize: 4\n\t\t\t)\n\t\t\t.frame(height: 40.0)\n\t\t\t.padding(5)\n\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t}\n\t}\n}\n\n//struct LineDemoMarkersAndShadow_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoMarkersAndShadow()\n//\t}\n//}\n\nstruct LineDemoBasicZeroLine: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line with zero-line added\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tshowZeroLine: true\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tshowZeroLine: true\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoBasicZeroLine_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoBasicZeroLine()\n//\t}\n//}\n\nstruct LineDemoArea: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Area\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tshowZeroLine: true\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoArea_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoArea()\n//\t}\n//}\n\n\nstruct LineDemoAreaCentered: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line centered\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor(red: 0.7, green: 0, blue: 0, alpha: 1.0)\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor(red: 0.7, green: 0, blue: 0, alpha: 1.0)\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoAreaCentered_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoAreaCentered()\n//\t}\n//}\n\nstruct LineDemoAreaCenteredMarkers: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line centered with markers\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor(red: 0.7, green: 0, blue: 0, alpha: 1.0),\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor(red: 0.7, green: 0, blue: 0, alpha: 1.0),\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoAreaCenteredMarkers_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoAreaCenteredMarkers()\n//\t}\n//}\n\nstruct LineDemoAreaCenteredMarkersNoLowerColor: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line centered with markers, single color\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tmarkerSize: 4\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoAreaCenteredMarkersNoLowerColor_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoAreaCenteredMarkersNoLowerColor()\n//\t}\n//}\n\nprivate let primaryFill = DSFSparkline.Fill.Gradient(colors: [\n\tCGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1),\n\tCGColor(srgbRed: 0, green: 0, blue: 1, alpha: 1),\n])\n\nprivate let secondaryFill = DSFSparkline.Fill.Gradient(colors: [\n\tCGColor(srgbRed: 1, green: 1, blue: 1, alpha: 1),\n\tCGColor(srgbRed: 0.3, green: 0.5, blue: 0.5, alpha: 1),\n])\n\nstruct LineDemoLineRanges: View {\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Line with gradient fill\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tprimaryFill: primaryFill,\n\t\t\t\t\tsecondaryFill: secondaryFill\n\t\t\t\t)\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tprimaryFill: primaryFill,\n\t\t\t\t\tsecondaryFill: secondaryFill\n\t\t\t\t)\n\t\t\t}\n\t\t\t.frame(height: 80.0)\n\t\t\tText(\"Line with ranges\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\thighlightDefinitions: [\n\t\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\t\trange: 0.7 ..< 1.0,\n\t\t\t\t\t\t\tfillColor: DSFColor.red.withAlphaComponent(0.15).cgColor\n\t\t\t\t\t\t),\n\t\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\t\trange: 0.3 ..< 0.7,\n\t\t\t\t\t\t\tfillColor: DSFColor.yellow.withAlphaComponent(0.15).cgColor\n\t\t\t\t\t\t),\n\t\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\t\trange: 0.0 ..< 0.3,\n\t\t\t\t\t\t\tfillColor: DSFColor.green.withAlphaComponent(0.15).cgColor\n\t\t\t\t\t\t)\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\thighlightDefinitions: [\n\t\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\t\trange: 0.4 ..< 0.6,\n\t\t\t\t\t\t\tfillColor: DSFColor.systemGray.withAlphaComponent(0.3).cgColor\n\t\t\t\t\t\t)\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\n\t\t\tText(\"Line with grid lines\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tgridLines: .init(values: [0, 0.25, 0.5, 0.75, 1.0])\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: LineSource1,\n\t\t\t\t\tgraphColor: GraphColor,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: false,\n\t\t\t\t\tgridLines: .init(values: [0, 0.4, 0.7, 0.9, 1.0])\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\n//struct LineDemoLineRanges2_Previews: PreviewProvider {\n//\tstatic var previews: some View {\n//\t\tLineDemoLineRanges2()\n//\t}\n//}\n\nstruct LineDemoLineRanges2: View {\n\n\tlet c0 = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.736,  0.169, 0.264, 1.000])!\n\tlet c1 = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.927,  0.393, 0.265, 1.000])!\n\tlet c2 = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.945,  0.593, 0.257, 1.000])!\n\tlet c3 = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.950,  0.856, 0.373, 1.000])!\n\tlet c4 = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.605,  0.815, 0.249, 1.000])!\n\tlet c5 = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.674,  0.938, 0.561, 1.000])!\n\n\tlet source: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 12, range: 0 ... 50)\n\t\td.push(values: [\n\t\t\t12, 12, 3, 16, 18, 22, 11, 26, 22, 45, 13, 10\n\t\t])\n\t\treturn d\n\t}()\n\n\tvar body: some View {\n\t\tHStack {\n\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\tdataSource: source,\n\t\t\t\tgraphColor: DSFColor.white,\n\t\t\t\tlineWidth: 4,\n\t\t\t\tinterpolated: true,\n\t\t\t\tlineShading: false,\n\t\t\t\tshadowed: true,\n\t\t\t\thighlightDefinitions: [\n\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\trange: 0 ..< 5,\n\t\t\t\t\t\tfillColor: c0\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\trange: 5 ..< 10,\n\t\t\t\t\t\tfillColor: c1\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\trange: 10 ..< 15,\n\t\t\t\t\t\tfillColor: c2\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\trange: 15 ..< 20,\n\t\t\t\t\t\tfillColor: c3\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\trange: 20 ..< 25,\n\t\t\t\t\t\tfillColor: c4\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\t\trange: 25 ..< 50,\n\t\t\t\t\t\tfillColor: c5\n\t\t\t\t\t),\n\t\t\t\t]\n\t\t\t)\n\t\t\t.frame(height: 120.0)\n\t\t\t.padding(5)\n\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t}\n\t}\n}\n\nstruct LineDemoCustomMarkers: View {\n\n\tlet source: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.5)\n\t\td.push(values: [\n\t\t\t0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,\n\t\t\t0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n\t\t])\n\t\treturn d\n\t}()\n\n\tvar drawCurrentValueMarker: DSFSparklineOverlay.Line.MarkerDrawingBlock = { context, markerFrames in\n\t\tlet l = markerFrames.last!\n\t\tcontext.setFillColor(l.isPositiveValue ? DSFColor.systemGreen.cgColor : DSFColor.systemRed.cgColor)\n\t\tcontext.fill(l.rect)\n\t}\n\n\tvar customMarkerDrawing: DSFSparklineOverlay.Line.MarkerDrawingBlock = { context, markerFrames in\n\n\t\t// Get the frames containing the minimum and maximum values\n\t\tif let minMarker = markerFrames.min(by: { (a, b) -> Bool in a.value < b.value }),\n\t\t\tlet maxMarker = markerFrames.min(by: { (a, b) -> Bool in a.value > b.value }) {\n\n\t\t\t// Draw minimum marker\n\n\t\t\tcontext.setFillColor(DSFColor.systemRed.cgColor)\n\t\t\tcontext.fill(minMarker.rect)\n\t\t\tcontext.setLineWidth(0.5)\n\t\t\tcontext.setStrokeColor(DSFColor.white.cgColor)\n\t\t\tcontext.stroke(minMarker.rect)\n\n\t\t\t// Draw maximum marker\n\n\t\t\tcontext.setFillColor(DSFColor.systemGreen.cgColor)\n\t\t\tcontext.fill(maxMarker.rect)\n\n\t\t\tcontext.setLineWidth(0.5)\n\t\t\tcontext.setStrokeColor(DSFColor.white.cgColor)\n\t\t\tcontext.stroke(maxMarker.rect)\n\t\t}\n\t}\n\n\tvar body: some View {\n\t\tHStack {\n\t\t\tVStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: source,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor(red: 0.7, green: 0, blue: 0, alpha: 1.0),\n\t\t\t\t\tmarkerSize: 4,\n\t\t\t\t\tmarkerDrawingBlock: self.drawCurrentValueMarker\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\tText(\"Current value marker\").font(.footnote)\n\t\t\t}\n\n\t\t\tVStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: source,\n\t\t\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor(red: 0.7, green: 0, blue: 0, alpha: 1.0),\n\t\t\t\t\tmarkerSize: 6,\n\t\t\t\t\tmarkerDrawingBlock: self.customMarkerDrawing\n\t\t\t\t)\n\t\t\t\t.frame(height: 40.0)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\tText(\"Min/Max marker\").font(.footnote)\n\t\t\t}\n\t\t}\n\t\t.onAppear(perform: {\n\t\t\tstartSomething()\n\t\t})\n\t}\n\n\tfunc startSomething() {\n\t\tif !IsRunningInPreviewPane {\n\t\t\tupdateWithNewValues()\n\t\t}\n\t}\n\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n\t\t\tsource.push(value: CGFloat.random(in: 0.0 ... 1.0))\n\t\t\tupdateWithNewValues()\n\t\t}\n\t}\n}\n\nstruct LineGraphShowingBug13: View {\n\tlet source: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 20, /*range: 0 ... 1,*/ zeroLineValue: 0)\n\t\td.push(values: [\n\t\t\t0, 5, 4.5, 10, 8, 0, 60, 60, -60, -60, 60, 60, -60, -60, 60, 55\n\t\t])\n\t\treturn d\n\t}()\n\n\tlet source2: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.25)\n\t\td.push(values: [\n\t\t\t0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.99, 0.99, 0.02, 0.07,\n\t\t\t0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n\t\t])\n\t\treturn d\n\t}()\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Demonstrating interpolated line clipping\")\n\t\t\tHStack {\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: self.source,\n\t\t\t\t\tgraphColor: DSFColor.systemIndigo,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tlineShading: true,\n\t\t\t\t\tshadowed: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor.systemRed,\n\t\t\t\t\tmarkerSize: 6,\n\t\t\t\t\tgridLines: .init(values: [-60, -30, 0, 30, 60])\n\t\t\t\t)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t.frame(width: 200, height: 100)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: self.source,\n\t\t\t\t\tgraphColor: DSFColor.systemIndigo,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: true,\n\t\t\t\t\tshadowed: true,\n\t\t\t\t\tmarkerSize: 6,\n\t\t\t\t\tgridLines: .init(values: [-60, -30, 0, 30, 60])\n\t\t\t\t)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t.frame(width: 200, height: 100)\n\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\tdataSource: self.source,\n\t\t\t\t\tgraphColor: DSFColor.systemIndigo,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tinterpolated: true,\n\t\t\t\t\tlineShading: true,\n\t\t\t\t\tshadowed: true,\n\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\tlowerGraphColor: DSFColor.systemRed,\n\t\t\t\t\tmarkerSize: 6\n\t\t\t\t)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t.frame(width: 200, height: 100)\n\t\t\t}\n\n\t\t\tHStack {\n\t\t\t\tDSFSparklineSurface.SwiftUI([\n\t\t\t\t\tDSFSparklineOverlay.GridLines(\n\t\t\t\t\t\tdataSource: self.source2,\n\t\t\t\t\t\tfloatValues: [0, 0.25, 0.5, 0.75, 1.0],\n\t\t\t\t\t\tstrokeColor: CGColor(gray: 0.5, alpha: 0.3),\n\t\t\t\t\t\tstrokeWidth: 0.5,\n\t\t\t\t\t\tdashStyle: [0.5, 0.5]\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparklineOverlay.RangeHighlight(\n\t\t\t\t\t\tdataSource: self.source2,\n\t\t\t\t\t\trange: 0.75 ..< 1.0,\n\t\t\t\t\t\tfill: DSFSparkline.Fill.Color(CGColor(red: 1, green: 0, blue: 0, alpha: 0.1))\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparklineOverlay.RangeHighlight(\n\t\t\t\t\t\tdataSource: self.source2,\n\t\t\t\t\t\trange: 0.5 ..< 0.75,\n\t\t\t\t\t\tfill: DSFSparkline.Fill.Color(CGColor(red: 1, green: 1, blue: 0, alpha: 0.1))\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparklineOverlay.RangeHighlight(\n\t\t\t\t\t\tdataSource: self.source2,\n\t\t\t\t\t\trange: 0.0 ..< 0.5,\n\t\t\t\t\t\tfill: DSFSparkline.Fill.Color(CGColor(red: 0, green: 1, blue: 0, alpha: 0.1))\n\t\t\t\t\t),\n\t\t\t\t\tDSFSparklineOverlay.ZeroLine(\n\t\t\t\t\t\tdataSource: self.source2,\n\t\t\t\t\t\tstrokeColor: CGColor(red: 1, green: 0, blue: 1, alpha: 1),\n\t\t\t\t\t\tstrokeWidth: 1\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tlet d = DSFSparklineOverlay.Line()\n\t\t\t\t\t\td.dataSource = self.source2\n\t\t\t\t\t\td.interpolated = true\n\t\t\t\t\t\td.primaryStrokeColor = CGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1)\n\t\t\t\t\t\td.markerSize = 3\n\t\t\t\t\t\td.strokeWidth = 1.0\n\t\t\t\t\t\treturn d\n\t\t\t\t\t}()\n\t\t\t\t])\n\t\t\t\t.frame(width: 200, height: 50)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct LineGraphShowingBug13_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tLineGraphShowingBug13()\n\t}\n}\n\nstruct LineDemoContentView: View {\n\tvar body: some View {\n\t\tScrollView([.vertical, .horizontal]) {\n\t\t\tVStack(spacing: 8) {\n\t\t\t\tVStack {\n\t\t\t\t\tLineDemoBasic()\n\t\t\t\t\tLineDemoBasicMarkers()\n\t\t\t\t\tLineDemoMarkersAndShadow()\n\t\t\t\t\tLineDemoBasicZeroLine()\n\t\t\t\t\tLineDemoArea()\n\t\t\t\t}\n\t\t\t\tVStack {\n\t\t\t\t\tLineDemoAreaCentered()\n\t\t\t\t\tLineDemoAreaCenteredMarkers()\n\t\t\t\t\tLineDemoAreaCenteredMarkersNoLowerColor()\n\t\t\t\t\tLineDemoLineRanges()\n\t\t\t\t\tLineDemoLineRanges2()\n\t\t\t\t}\n\t\t\t\tVStack {\n\t\t\t\t\tText(\"Custom markers\").font(.headline)\n\t\t\t\t\tLineDemoCustomMarkers()\n\t\t\t\t}\n\t\t\t\tVStack {\n\t\t\t\t\tLineGraphShowingBug13()\n\t\t\t\t}\n\t\t\t}\n\t\t\t.frame(width: 400.0)\n\t\t}\n\t}\n}\n\n\nstruct LineDemoContentView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tLineDemoContentView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/PercentBarView.swift",
    "content": "//\n//  PercentBar.swift\n//  Demos\n//\n//  Created by Darren Ford on 18/3/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nstruct PercentBarView: View {\n\n\t// The actual line graph\n\tvar percentBarOverlay: DSFSparklineOverlay.PercentBar = {\n\t\tlet lineOverlay = DSFSparklineOverlay.PercentBar(value: 0)\n\t\treturn lineOverlay\n\t}()\n\n\tvar percentBarOverlay2: DSFSparklineOverlay.PercentBar = {\n\t\tlet lineOverlay = DSFSparklineOverlay.PercentBar(value: 0)\n\t\treturn lineOverlay\n\t}()\n\n\tvar percentBarOverlay3: DSFSparklineOverlay.PercentBar = {\n\t\tlet lineOverlay = DSFSparklineOverlay.PercentBar(value: 0)\n\t\treturn lineOverlay\n\t}()\n\n\tfunc style() -> DSFSparkline.PercentBar.Style {\n\t\tlet s = DSFSparkline.PercentBar.Style()\n\t\ts.barColor = DSFColor.systemYellow.cgColor\n\t\ts.barTextColor = .black\n\t\ts.underBarColor = DSFColor.systemBlue.cgColor\n\t\ts.underBarTextColor = CGColor(gray: 1.0, alpha: 1.0)\n\t\ts.font = DSFFont(name: \"Menlo\", size: 13)!\n\t\treturn s\n\t}\n\n\tfunc style2() -> DSFSparkline.PercentBar.Style {\n\t\tlet s = DSFSparkline.PercentBar.Style()\n\t\ts.barColor = DSFColor.systemIndigo.cgColor\n\t\ts.underBarColor = CGColor(gray: 0.0, alpha: 0.1)\n\t\ts.showLabel = false\n\t\treturn s\n\t}\n\n\tfunc style3() -> DSFSparkline.PercentBar.Style {\n\t\tlet s = DSFSparkline.PercentBar.Style()\n\t\ts.barEdgeInsets = DSFEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\t\ts.barColor = CGColor(gray: 0.0, alpha: 0.2)\n\t\ts.barTextColor = .black\n\t\ts.underBarColor = CGColor(gray: 0.0, alpha: 0.1)\n\t\ts.underBarTextColor = .black\n\t\ts.font = DSFFont(name: \"Menlo\", size: 13)!\n\t\treturn s\n\t}\n\n\tfunc style4(value: CGFloat) -> DSFSparkline.PercentBar.Style {\n\t\tlet s = DSFSparkline.PercentBar.Style()\n\t\ts.barEdgeInsets = DSFEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)\n\n\t\tif value > 0.8 {\n\t\t\ts.barColor = DSFColor.systemRed.cgColor\n\t\t\ts.barTextColor = CGColor(gray: 1.0, alpha: 1.0)\n\t\t}\n\t\telse if value > 0.5 {\n\t\t\ts.barColor = DSFColor.systemYellow.cgColor\n\t\t\ts.barTextColor = CGColor(gray: 0.0, alpha: 1.0)\n\t\t}\n\t\telse {\n\t\t\ts.barColor = DSFColor.systemGreen.cgColor\n\t\t\ts.barTextColor = CGColor(gray: 0.0, alpha: 1.0)\n\t\t}\n\n\t\ts.underBarColor = CGColor(gray: 0.8, alpha: 1.0)\n\t\ts.underBarTextColor = .black\n\t\ts.font = DSFFont(name: \"Menlo Bold\", size: 16)!\n\t\treturn s\n\t}\n\n\tlet fixedFormatter: NumberFormatter = {\n\t\tlet formatter = NumberFormatter()\n\t\tformatter.numberStyle = .percent\n\t\tformatter.minimumFractionDigits = 2\n\t\tformatter.maximumFractionDigits = 2\n\t\treturn formatter\n\t}()\n\tfunc fixedFormatted(_ value: CGFloat) -> String {\n\t\treturn self.fixedFormatter.string(for: value) ?? \"\"\n\t}\n\n\tfunc style10() -> DSFSparkline.PercentBar.Style {\n\t\tlet s = DSFSparkline.PercentBar.Style()\n\t\ts.barEdgeInsets = DSFEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)\n\t\ts.barColor = CGColor(gray: 0.0, alpha: 1.0)\n\t\ts.barTextColor = CGColor(gray: 1.0, alpha: 1.0)\n\t\ts.underBarColor = CGColor(gray: 0.8, alpha: 1.0)\n\t\ts.underBarTextColor = .black\n\t\ts.font = DSFFont(name: \"Menlo\", size: 11)!\n\t\treturn s\n\t}\n\n\tfunc style11() -> DSFSparkline.PercentBar.Style {\n\t\tlet s = DSFSparkline.PercentBar.Style()\n\t\ts.showLabel = false\n\t\ts.barEdgeInsets = DSFEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)\n\t\ts.barColor = CGColor(gray: 0.0, alpha: 1.0)\n\t\ts.barTextColor = CGColor(gray: 1.0, alpha: 1.0)\n\t\ts.underBarColor = CGColor(gray: 0.8, alpha: 1.0)\n\t\ts.underBarTextColor = .black\n\t\ts.font = DSFFont(name: \"Menlo\", size: 11)!\n\t\treturn s\n\t}\n\n\n\t@State var v1: CGFloat = 0.0\n\t@State var v2: CGFloat = 1.0\n\t@State var v3: CGFloat = 0.85\n\t@State var v4: CGFloat = 0.05\n\t@State var v5: CGFloat = 0.66\n\t@State var v6: CGFloat = 0.5\n\n\t@State var v10: CGFloat = 0.0\n\t@State var v11: CGFloat = 0.2\n\t@State var v12: CGFloat = 0.4\n\t@State var v13: CGFloat = 0.6\n\t@State var v14: CGFloat = 0.8\n\t@State var v15: CGFloat = 1.0\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tVStack {\n\t\t\t\tText(\"Fixed\")\n\t\t\t\t\t.font(.subheadline)\n\n\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style(), value: Double(v1))\n\t\t\t\t\t.frame(height: 20)\n\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style(), value: Double(0.5))\n\t\t\t\t\t.frame(height: 20)\n\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style(), value: Double(v2))\n\t\t\t\t\t.frame(height: 20)\n\n\t\t\t\tDivider()\n\n\t\t\t\tVStack {\n\t\t\t\t\tlet animationStyle = DSFSparkline.AnimationStyle(duration: 0.25)\n\t\t\t\t\tHStack {\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style10(), value: Double(v10), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style10(), value: Double(v11), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style10(), value: Double(v12), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style10(), value: Double(v13), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style10(), value: Double(v14), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style10(), value: Double(v15), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t}\n\n\t\t\t\t\tHStack {\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style11(), value: Double(v10), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style11(), value: Double(v11), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style11(), value: Double(v12), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style11(), value: Double(v13), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style11(), value: Double(v14), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style11(), value: Double(v15), animationStyle: animationStyle)\n\t\t\t\t\t\t\t.frame(width: 50, height: 18, alignment: .center)\n\t\t\t\t\t}\n\t\t\t\t\tButton(\"Random\") {\n\t\t\t\t\t\tself.v10 = CGFloat(drand48())\n\t\t\t\t\t\tself.v11 = CGFloat(drand48())\n\t\t\t\t\t\tself.v12 = CGFloat(drand48())\n\t\t\t\t\t\tself.v13 = CGFloat(drand48())\n\t\t\t\t\t\tself.v14 = CGFloat(drand48())\n\t\t\t\t\t\tself.v15 = CGFloat(drand48())\n\t\t\t\t\t}\n\t\t\t\t\t.frame(height: 18, alignment: .center)\n\t\t\t\t}\n\n\t\t\t\tDivider()\n\n\t\t\t\tHStack {\n\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style2(), value: Double(v1))\n\t\t\t\t\t\t.frame(height: 20)\n\t\t\t\t\tText(fixedFormatted(self.v1))\n\t\t\t\t\t\t.frame(width: 75, alignment: .trailing)\n\t\t\t\t}\n\t\t\t\tHStack {\n\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style2(), value: Double(0.5))\n\t\t\t\t\t\t.frame(height: 20)\n\t\t\t\t\tText(fixedFormatted(0.5))\n\t\t\t\t\t\t.frame(width: 75, alignment: .trailing)\n\t\t\t\t}\n\t\t\t\tHStack {\n\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style2(), value: Double(v2))\n\t\t\t\t\t\t.frame(height: 20)\n\t\t\t\t\tText(fixedFormatted(self.v2))\n\t\t\t\t\t\t.frame(width: 75, alignment: .trailing)\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t.frame(width: 320)\n\n\t\t\tDivider()\n\n\t\t\tVStack {\n\t\t\t\tText(\"Interactive\")\n\t\t\t\t\t.font(.subheadline)\n\n\t\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style3(), value: Double(v6))\n\t\t\t\t\t\t.frame(height: 26)\n\t\t\t\tHStack(spacing: 8) {\n\t\t\t\t\tSlider(value: $v6, in: 0 ... 1)\n\t\t\t\t\tText(fixedFormatted(self.v6))\n\t\t\t\t\t\t.frame(width: 75, alignment: .trailing)\n\t\t\t\t}\n\t\t\t}\n\t\t\t.padding(8)\n\t\t\tDivider()\n\t\t\tVStack {\n\t\t\t\tText(\"Animation\")\n\t\t\t\t\t.font(.subheadline)\n\n\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style4(value: v3), value: Double(v3), animationStyle: .init(duration: 0.5))\n\t\t\t\t\t.frame(height: 30)\n\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style4(value: v4), value: Double(v4), animationStyle: .init(duration: 0.5))\n\t\t\t\t\t.frame(height: 30)\n\t\t\t\tDSFSparklinePercentBarGraphView.SwiftUI(style: style4(value: v5), value: Double(v5), animationStyle: .init(duration: 0.5))\n\t\t\t\t\t.frame(height: 30)\n\t\t\t\tButton(\"Random\") {\n\t\t\t\t\tself.v3 = CGFloat(drand48())\n\t\t\t\t\tself.v4 = CGFloat(drand48())\n\t\t\t\t\tself.v5 = CGFloat(drand48())\n\t\t\t\t}\n\t\t\t}\n\t\t\t.frame(width: 250)\n\t\t}\n\t}\n}\n\nstruct PercentBar_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tPercentBarView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/PieGraphDemoView.swift",
    "content": "//\n//  PieGraphDemoView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfileprivate let palette1 = DSFSparkline.Palette([.systemRed, .systemOrange, .systemYellow])\nfileprivate let grays = DSFSparkline.Palette([\n\tDSFColor.init(white: 1.00, alpha: 1),\n\tDSFColor.init(white: 0.66, alpha: 1),\n\tDSFColor.init(white: 0.33, alpha: 1)\n])\n\nfileprivate let firstDataSource = DSFSparkline.StaticDataSource([10, 40, 25])\nfileprivate let secondDataSource = DSFSparkline.StaticDataSource([33, 33, 33])\nfileprivate let thirdDataSource = DSFSparkline.StaticDataSource( [85, 10, 19])\nfileprivate let fourthDataSource = DSFSparkline.StaticDataSource([3, 4, 5])\n\nstruct PieGraphDemoView: View {\n    var body: some View {\n\n\t\tVStack(spacing: 8) {\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tText(\"No stroke\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: firstDataSource,\n\t\t\t\t\tpalette: palette1\n\t\t\t\t)\n\t\t\t\t.frame(width: 24, height: 24)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: secondDataSource,\n\t\t\t\t\tpalette: palette1\n\t\t\t\t)\n\t\t\t\t.frame(width: 24, height: 24)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: thirdDataSource,\n\t\t\t\t\tpalette: palette1\n\t\t\t\t)\n\t\t\t\t.frame(width: 24, height: 24)\n\t\t\t}\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tText(\"Stroke\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: firstDataSource,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 24, height: 24)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: secondDataSource,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 24, height: 24)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: thirdDataSource,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 24, height: 24)\n\t\t\t}\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: fourthDataSource,\n\t\t\t\t\tpalette: grays\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.shared.colors.count)),\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.sharedGrays.colors.count)),\n\t\t\t\t\tpalette: .sharedGrays,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([5, 2, 4, 8]),\n\t\t\t\t\tstrokeColor: DSFColor.gray,\n\t\t\t\t\tlineWidth: 1\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\t\t\t}\n\n\t\t\tHStack(spacing: 8) {\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: fourthDataSource,\n\t\t\t\t\tpalette: grays,\n\t\t\t\t\tanimationStyle: .init(duration: 1.0, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.shared.colors.count)),\n\t\t\t\t\tstrokeColor: DSFColor.black,\n\t\t\t\t\tlineWidth: 2,\n\t\t\t\t\tanimationStyle: .init(duration: 1.0, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([CGFloat](repeating: 10.0, count: DSFSparkline.Palette.sharedGrays.colors.count)),\n\t\t\t\t\tpalette: .sharedGrays,\n\t\t\t\t\tstrokeColor: DSFColor.black.withAlphaComponent(0.5),\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tanimationStyle: .init(duration: 1.0, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\n\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource([5, 2, 4, 8]),\n\t\t\t\t\tstrokeColor: DSFColor.gray,\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tanimationStyle: .init(duration: 1.0, function: .easeInEaseOut)\n\t\t\t\t)\n\t\t\t\t.frame(width: 36, height: 36)\n\t\t\t}\n\t\t}\n\n\t\t.padding()\n\n\n\n    }\n}\n\nstruct PieGraphDemoView_Previews: PreviewProvider {\n    static var previews: some View {\n        PieGraphDemoView()\n    }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/ReportView.swift",
    "content": "//\n//  ContentView.swift\n//  Shared\n//\n//  Created by Darren Ford on 27/1/21.\n//\n\nimport DSFSparkline\nimport SwiftUI\n\nstruct UserResults {\n\tlet name: String\n\tvar values: [Int]\n\n\tlet dataSource = DSFSparkline.DataSource(windowSize: 5)\n\n\tinit(name: String, values: [Int]) {\n\t\tself.name = name\n\t\tself.values = values\n\t\tself.dataSource.set(values: self.values.map { CGFloat($0) })\n\t}\n}\n\nstruct SalesResult {\n\tlet name: String\n\tvar values: [CGFloat]\n\tvar maximumTotal: CGFloat\n\n\tinit(name: String, values: [CGFloat], maximumTotal: CGFloat) {\n\t\tself.name = name\n\t\tself.values = values\n\t\tself.maximumTotal = maximumTotal\n\t}\n}\n\nstruct ReportView: View {\n\tstatic func Make() -> ReportView {\n\t\treturn ReportView()\n\t}\n\n\tvar gridItems1: [GridItem] = [\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t]\n\n\tlet userItems1: [UserResults] = [\n\t\tUserResults(name: \"Aiden\", values: [90, 120, 110, 130, 115]),\n\t\tUserResults(name: \"Ethan\", values: [100, 95, 115, 120, 118]),\n\t\tUserResults(name: \"Jackson\", values: [120, 125, 140, 130, 135]),\n\t\tUserResults(name: \"Lucas\", values: [118, 120, 125, 128, 135]),\n\t\tUserResults(name: \"Noah\", values: [130, 130, 125, 120, 90]),\n\t]\n\n\tvar gridItems2: [GridItem] = [\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t\tGridItem(.fixed(35), spacing: 2),\n\t]\n\n\tlet userItems2: [UserResults] = [\n\t\tUserResults(name: \"Aiden\", values: [1, 1, -1, 1, -1, 1, 1, 1]),\n\t\tUserResults(name: \"Ethan\", values: [1, 1, -1, 1, 1, -1, 1, -1]),\n\t\tUserResults(name: \"Jackson\", values: [-1, 1, 1, -1, -1, 1, 1, 1]),\n\t\tUserResults(name: \"Lucas\", values: [1, -1, -1, 1, 1, -1, -1, 1]),\n\t\tUserResults(name: \"Noah\", values: [-1, 1, 1, 1, -1, 1, 1, 1]),\n\t]\n\n\tlet salesItems: [SalesResult] = [\n\t\tSalesResult(name: \"Aiden\", values: [120, 200, 0, 270], maximumTotal: 1000),\n\t\tSalesResult(name: \"Ethan\", values: [300, 400, 100, 90], maximumTotal: 1000),\n\t\tSalesResult(name: \"Jackson\", values: [100, 140, 90, 110], maximumTotal: 1000),\n\t\tSalesResult(name: \"Lucas\", values: [250, 250, 100, 100], maximumTotal: 1000),\n\t\tSalesResult(name: \"Noah\", values: [300, 100, 200, 270], maximumTotal: 1000),\n\t]\n\n\tfunc sparklineAttributedString() -> NSAttributedString {\n\t\tlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\n\n\t\tlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033, 0.277, 0.650, 1.000])!\n\t\tlet primaryStroke = baseColor // (gray: 0.0, alpha: 0.3))\n\t\tlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\n\t\tlet bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface\n\t\tlet line = DSFSparklineOverlay.Line() // Create a line overlay\n\t\tline.strokeWidth = 1\n\t\tline.primaryStrokeColor = primaryStroke\n\t\tline.primaryFill = primaryFill\n\t\tline.dataSource = source // Assign the datasource to the overlay\n\t\tbitmap.addOverlay(line) // And add the overlay to the surface.\n\n\t\tlet attr = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)!\n\t\tlet message = NSMutableAttributedString(string: \"Inlined - \")\n\t\tmessage.append(attr)\n\t\tmessage.append(NSAttributedString(string: \" - line graph\"))\n\n\t\tmessage.addAttributes([.foregroundColor: DSFColor.primaryTextColor], range: NSRange(location: 0, length: message.length))\n\n\t\treturn message\n\t}\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tReportHeaderView(attrString: self.sparklineAttributedString())\n\t\t\t\t.padding(EdgeInsets(top: 16, leading: 0, bottom: 25, trailing: 0))\n\t\t\t\n\t\t\tReportExamResults(gridItems1: self.gridItems1, userItems1: self.userItems1)\n\t\t\t\t.frame(maxWidth: .infinity)\n\t\t\t\n\t\t\tReportTeamWinLosses(gridItems2: self.gridItems2, userItems2: self.userItems2)\n\t\t\t\t.frame(maxWidth: .infinity)\n\t\t\t\n\t\t\tReportTeamSales(gridItems2: self.gridItems2, salesItems: self.salesItems)\n\t\t\t\t.frame(maxWidth: .infinity)\n\t\t}\n\t}\n}\n\nstruct ReportHeaderView: View {\n\tlet attrString: NSAttributedString\n\tvar body: some View {\n\t\tVStack {\n\t\t\tAttributedText(attrString)\n\t\t\t\t.frame(maxWidth: .infinity, maxHeight: .infinity)\n\t\t\t\t.padding(20)\n\n\t\t\tHStack {\n\t\t\t\tText(\"NASDAQ Feb 2020 -> Feb 2021\").frame(width: 300)\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: NasdaqFeb2020Feb2021DataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemRed,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineWidth: 0.5)\n\t\t\t\t\t.frame(width: 75, height: 20)\n\t\t\t}\n\t\t\tHStack {\n\t\t\t\tText(\"Gold Feb 2020 -> Feb 2021\").frame(width: 300)\n\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: GoldFeb2020Feb2021DataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemGreen,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineWidth: 0.5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t centeredAtZeroLine: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lowerGraphColor: DSFColor.systemRed)\n\t\t\t\t\t.frame(width: 75, height: 20)\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct ReportExamResults: View {\n\n\tlet gridItems1: [GridItem]\n\tlet userItems1: [UserResults]\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Exam Results\")\n\n\t\t\tLazyHGrid(rows: gridItems1) {\n\t\t\t\tForEach(0 ..< 5, id: \\.self) { number in\n\t\t\t\t\tHStack {\n\t\t\t\t\t\tText(userItems1[number].name)\n\t\t\t\t\t\t\t.frame(width: 80, alignment: .leading)\n\t\t\t\t\t\tForEach(0 ..< 5, id: \\.self) { count in\n\t\t\t\t\t\t\tText(\"\\(userItems1[number].values[count])\")\n\t\t\t\t\t\t\t\t.frame(width: 30, alignment: .center)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: userItems1[number].dataSource,\n\t\t\t\t\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\t\t\t\t\tlineShading: false\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 120)\n\t\t\t\t\t}\n\t\t\t\t\t.padding(8)\n\t\t\t\t\t.background(number % 2 == 0 ? Color(Color.RGBColorSpace.sRGB, red: 0, green: 0, blue: 0, opacity: 0.1) : Color.clear)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct ReportTeamWinLosses: View {\n\n\tlet gridItems2: [GridItem]\n\tlet userItems2: [UserResults]\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Team Wins/Losses\")\n\n\t\t\tLazyHGrid(rows: gridItems2) {\n\t\t\t\tForEach(0 ..< 5, id: \\.self) { number in\n\t\t\t\t\tHStack {\n\t\t\t\t\t\tText(userItems2[number].name)\n\t\t\t\t\t\t\t.frame(width: 80, alignment: .leading)\n\t\t\t\t\t\tForEach(0 ..< 8, id: \\.self) { count in\n\t\t\t\t\t\t\tText(\"\\(userItems2[number].values[count])\")\n\t\t\t\t\t\t\t\t.frame(width: 25, alignment: .center)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDSFSparklineWinLossGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: userItems2[number].dataSource,\n\t\t\t\t\t\t\tbarSpacing: 3,\n\t\t\t\t\t\t\tshowZeroLine: true,\n\t\t\t\t\t\t\tzeroLineDefinition: .init(color: .systemGray,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  lineWidth: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  lineDashStyle: [1, 1])\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 120)\n\t\t\t\t\t\tDSFSparklineTabletGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: userItems2[number].dataSource,\n\t\t\t\t\t\t\tbarSpacing: 2\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 200, height: 12)\n\t\t\t\t\t}\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.background(number % 2 == 0 ? Color(Color.RGBColorSpace.sRGB, red: 0, green: 0, blue: 0, opacity: 0.1) : Color.clear)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct ReportTeamSales: View {\n\n\tlet gridItems2: [GridItem]\n\tlet salesItems: [SalesResult]\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Team Sales\")\n\n\t\t\tLazyHGrid(rows: gridItems2) {\n\t\t\t\tForEach(0 ..< 5, id: \\.self) { number in\n\t\t\t\t\tHStack(spacing: 10) {\n\t\t\t\t\t\tText(salesItems[number].name)\n\t\t\t\t\t\t\t.frame(width: 80, alignment: .leading)\n\t\t\t\t\t\tForEach(0 ..< 4, id: \\.self) { count in\n\t\t\t\t\t\t\tText(\"\\(salesItems[number].values[count], specifier: \"%.2f\")\")\n\t\t\t\t\t\t\t\t.frame(width: 60, alignment: .trailing)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.DataSource(values: salesItems[number].values),\n\t\t\t\t\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\t\t\t\t\tlineShading: false,\n\t\t\t\t\t\t\tmarkerSize: 6\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 120)\n\n\t\t\t\t\t\tDSFSparklinePieGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource(salesItems[number].values)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 28, height: 28)\n\n\t\t\t\t\t\tDSFSparklineDataBarGraphView.SwiftUI(\n\t\t\t\t\t\t\tdataSource: DSFSparkline.StaticDataSource(salesItems[number].values),\n\t\t\t\t\t\t\tmaximumTotalValue: salesItems[number].maximumTotal,\n\t\t\t\t\t\t\tunsetColor: DSFColor.black.withAlphaComponent(0.2)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 120)\n\t\t\t\t\t}\n\t\t\t\t\t.padding(4)\n\t\t\t\t\t.background(number % 2 == 0 ? Color(Color.RGBColorSpace.sRGB, red: 0, green: 0, blue: 0, opacity: 0.1) : Color.clear)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nstruct ReportView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tReportView()\n\t}\n}\n\nlet NasdaqFeb2020Feb2021DataSource = DSFSparkline.DataSource(values: NasdaqFeb2020Feb2021)\nlet NasdaqFeb2020Feb2021: [CGFloat] = [\n\t8965.61,\n\t8980.78,\n\t8566.48,\n\t8567.37,\n\t8952.16,\n\t8684.08,\n\t9018.08,\n\t8738.58,\n\t8575.62,\n\t7950.68,\n\t8344.25,\n\t7952.04,\n\t7201.79,\n\t7874.87,\n\t6904.58,\n\t7334.77,\n\t6989.83,\n\t7150.58,\n\t6879.52,\n\t6860.66,\n\t7417.85,\n\t7384.29,\n\t7797.54,\n\t7502.37,\n\t7774.14,\n\t7700.10,\n\t7360.58,\n\t7487.31,\n\t7373.08,\n\t7913.24,\n\t7887.25,\n\t8090.89,\n\t8153.58,\n\t8192.41,\n\t8515.74,\n\t8393.17,\n\t8532.36,\n\t8650.13,\n\t8560.73,\n\t8263.23,\n\t8495.37,\n\t8494.75,\n\t8634.51,\n\t8730.16,\n\t8607.73,\n\t8914.70,\n\t8889.54,\n\t8604.95,\n\t8710.70,\n\t8809.12,\n\t8854.38,\n\t8979.66,\n\t9121.32,\n\t9192.33,\n\t9002.54,\n\t8863.16,\n\t8943.71,\n\t9014.55,\n\t9234.83,\n\t9185.09,\n\t9375.78,\n\t9284.87,\n\t9324.58,\n\t9340.21,\n\t9412.36,\n\t9368.99,\n\t9489.87,\n\t9552.04,\n\t9608.37,\n\t9682.91,\n\t9615.80,\n\t9814.08,\n\t9924.75,\n\t9953.75,\n\t10020.34,\n\t9492.73,\n\t9588.80,\n\t9726.01,\n\t9895.87,\n\t9910.53,\n\t9943.04,\n\t9946.12,\n\t10056.48,\n\t10131.37,\n\t9909.16,\n\t10017.00,\n\t9757.21,\n\t9874.15,\n\t10058.76,\n\t10154.62,\n\t10207.62,\n\t10433.65,\n\t10343.88,\n\t10492.50,\n\t10547.75,\n\t10617.44,\n\t10390.83,\n\t10488.58,\n\t10550.49,\n\t10473.83,\n\t10503.19,\n\t10767.08,\n\t10680.36,\n\t10706.12,\n\t10461.41,\n\t10363.17,\n\t10536.26,\n\t10402.08,\n\t10542.94,\n\t10587.80,\n\t10745.26,\n\t10902.79,\n\t10941.16,\n\t10998.40,\n\t11108.07,\n\t11010.98,\n\t10968.36,\n\t10782.82,\n\t11012.24,\n\t11042.50,\n\t11019.29,\n\t11129.73,\n\t11210.83,\n\t11146.45,\n\t11264.95,\n\t11311.79,\n\t11379.71,\n\t11466.46,\n\t11665.05,\n\t11625.33,\n\t11695.62,\n\t11775.45,\n\t11939.66,\n\t12056.44,\n\t11458.09,\n\t11313.12,\n\t10847.69,\n\t11141.55,\n\t10919.58,\n\t10853.54,\n\t11056.65,\n\t11190.32,\n\t11050.46,\n\t10910.28,\n\t10793.28,\n\t10778.79,\n\t10963.63,\n\t10632.99,\n\t10672.26,\n\t10913.55,\n\t11117.53,\n\t11085.25,\n\t11167.50,\n\t11326.50,\n\t11075.01,\n\t11332.49,\n\t11154.59,\n\t11364.59,\n\t11420.98,\n\t11579.94,\n\t11876.25,\n\t11863.90,\n\t11768.73,\n\t11713.87,\n\t11671.55,\n\t11478.87,\n\t11516.49,\n\t11484.69,\n\t11506.00,\n\t11548.28,\n\t11358.94,\n\t11431.34,\n\t11004.87,\n\t11185.58,\n\t10911.58,\n\t10957.61,\n\t11160.57,\n\t11590.78,\n\t11890.92,\n\t11895.23,\n\t11713.78,\n\t11553.86,\n\t11786.42,\n\t11709.58,\n\t11829.29,\n\t11924.12,\n\t11899.33,\n\t11801.59,\n\t11904.70,\n\t11854.96,\n\t11880.62,\n\t12036.79,\n\t12094.40,\n\t12205.84,\n\t12198.74,\n\t12355.11,\n\t12349.37,\n\t12377.17,\n\t12464.23,\n\t12519.95,\n\t12582.76,\n\t12338.95,\n\t12405.80,\n\t12377.87,\n\t12440.04,\n\t12595.05,\n\t12658.19,\n\t12764.75,\n\t12755.63,\n\t12742.51,\n\t12807.91,\n\t12771.11,\n\t12804.73,\n\t12899.41,\n\t12850.21,\n\t12870.00,\n\t12888.28,\n\t12698.45,\n\t12818.95,\n\t12740.79,\n\t13067.48,\n\t13201.98,\n\t13036.42,\n\t13072.42,\n\t13128.95,\n\t13112.63,\n\t12998.50,\n\t13197.17,\n\t13457.25,\n\t13530.91,\n\t13543.05,\n\t13635.99,\n\t13626.05,\n\t13270.59,\n\t13337.16,\n\t13070.69,\n\t13403.38,\n\t13612.78,\n\t13610.54,\n\t13777.74,\n\t13856.29,\n\t13987.63,\n\t14007.70,\n\t13972.53,\n\t14025.76,\n\t14095.46,\n\t14047.50,\n\t13965.49,\n\t13865.36,\n\t13874.45,\n\t13533.04,\n\t13465.20,\n\t13597.96,\n\t13119.43,\n]\n\nlet GoldFeb2020Feb2021DataSource: DSFSparkline.DataSource = {\n\tlet s = DSFSparkline.DataSource(zeroLineValue: 1775.4)\n\ts.push(values: GoldFeb2020Feb2021)\n\treturn s\n}()\n\nlet GoldFeb2020Feb2021: [CGFloat] = [\n\t1646.90,\n\t1640.00,\n\t1640.00,\n\t1564.09,\n\t1592.30,\n\t1642.09,\n\t1641.09,\n\t1666.40,\n\t1670.80,\n\t1674.50,\n\t1659.09,\n\t1641.40,\n\t1589.30,\n\t1515.69,\n\t1485.90,\n\t1524.90,\n\t1477.30,\n\t1478.59,\n\t1484.00,\n\t1567.00,\n\t1660.19,\n\t1632.30,\n\t1650.09,\n\t1623.90,\n\t1622.00,\n\t1583.40,\n\t1578.19,\n\t1625.69,\n\t1633.69,\n\t1677.00,\n\t1664.80,\n\t1665.40,\n\t1736.19,\n\t1744.80,\n\t1756.69,\n\t1727.19,\n\t1720.40,\n\t1689.19,\n\t1701.59,\n\t1678.19,\n\t1728.69,\n\t1733.30,\n\t1723.50,\n\t1711.90,\n\t1710.50,\n\t1703.40,\n\t1684.19,\n\t1694.50,\n\t1706.90,\n\t1704.40,\n\t1684.19,\n\t1721.80,\n\t1709.90,\n\t1695.30,\n\t1704.40,\n\t1713.90,\n\t1738.09,\n\t1753.40,\n\t1731.80,\n\t1744.19,\n\t1750.59,\n\t1720.50,\n\t1734.59,\n\t1704.80,\n\t1710.30,\n\t1713.30,\n\t1736.90,\n\t1737.80,\n\t1725.19,\n\t1697.80,\n\t1718.90,\n\t1676.19,\n\t1698.30,\n\t1714.69,\n\t1713.30,\n\t1732.00,\n\t1729.30,\n\t1720.30,\n\t1729.59,\n\t1729.19,\n\t1724.80,\n\t1745.90,\n\t1756.69,\n\t1772.09,\n\t1765.80,\n\t1762.09,\n\t1772.50,\n\t1774.80,\n\t1793.00,\n\t1773.19,\n\t1784.00,\n\t1788.50,\n\t1804.19,\n\t1815.50,\n\t1799.19,\n\t1798.19,\n\t1811.00,\n\t1810.59,\n\t1811.40,\n\t1798.69,\n\t1808.30,\n\t1815.90,\n\t1842.40,\n\t1864.09,\n\t1889.09,\n\t1897.30,\n\t1931.00,\n\t1944.69,\n\t1953.50,\n\t1942.30,\n\t1962.80,\n\t1966.00,\n\t2001.19,\n\t2031.09,\n\t2051.50,\n\t2010.09,\n\t2024.40,\n\t1932.59,\n\t1934.90,\n\t1956.69,\n\t1937.00,\n\t1985.00,\n\t1999.40,\n\t1958.69,\n\t1933.80,\n\t1934.59,\n\t1927.69,\n\t1911.80,\n\t1940.69,\n\t1921.59,\n\t1964.59,\n\t1967.59,\n\t1968.19,\n\t1934.40,\n\t1927.59,\n\t1923.90,\n\t1933.00,\n\t1944.69,\n\t1954.19,\n\t1937.80,\n\t1953.09,\n\t1956.30,\n\t1960.19,\n\t1940.00,\n\t1952.09,\n\t1901.19,\n\t1898.59,\n\t1859.90,\n\t1868.30,\n\t1857.69,\n\t1872.80,\n\t1894.30,\n\t1887.50,\n\t1908.40,\n\t1900.19,\n\t1912.50,\n\t1901.09,\n\t1883.59,\n\t1888.59,\n\t1919.50,\n\t1922.50,\n\t1888.50,\n\t1901.30,\n\t1903.19,\n\t1900.80,\n\t1906.40,\n\t1910.40,\n\t1924.59,\n\t1901.09,\n\t1902.00,\n\t1902.69,\n\t1908.80,\n\t1876.19,\n\t1865.59,\n\t1877.40,\n\t1890.40,\n\t1908.50,\n\t1894.59,\n\t1945.30,\n\t1950.30,\n\t1853.19,\n\t1875.40,\n\t1860.69,\n\t1872.59,\n\t1885.69,\n\t1887.30,\n\t1884.50,\n\t1873.50,\n\t1861.09,\n\t1872.59,\n\t1837.80,\n\t1804.80,\n\t1805.69,\n\t1775.69,\n\t1814.09,\n\t1825.69,\n\t1836.80,\n\t1835.90,\n\t1861.80,\n\t1870.80,\n\t1834.59,\n\t1833.59,\n\t1839.80,\n\t1828.69,\n\t1852.30,\n\t1856.09,\n\t1887.19,\n\t1885.69,\n\t1879.19,\n\t1866.59,\n\t1874.69,\n\t1877.19,\n\t1879.69,\n\t1891.00,\n\t1893.09,\n\t1944.69,\n\t1952.69,\n\t1906.90,\n\t1912.30,\n\t1834.09,\n\t1849.59,\n\t1842.90,\n\t1853.59,\n\t1850.30,\n\t1829.30,\n\t1839.50,\n\t1865.90,\n\t1865.30,\n\t1855.69,\n\t1854.90,\n\t1850.69,\n\t1844.90,\n\t1837.90,\n\t1847.30,\n\t1860.80,\n\t1830.50,\n\t1832.19,\n\t1788.90,\n\t1810.90,\n\t1831.90,\n\t1835.30,\n\t1840.59,\n\t1824.90,\n\t1821.59,\n\t1797.19,\n\t1771.09,\n\t1773.40,\n\t1775.80,\n\t1806.69,\n\t1804.40,\n\t1796.40,\n\t1770.30,\n]\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/StackLineDemoContentView.swift",
    "content": "//\n//  StackLineDemoContentView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport DSFSparkline\nimport SwiftUI\n\nprivate let primaryFill = DSFSparkline.Fill.Gradient(colors: [\n\tCGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1),\n\tCGColor(srgbRed: 0, green: 0, blue: 1, alpha: 1),\n])\n\nprivate let secondaryFill = DSFSparkline.Fill.Gradient(colors: [\n\tCGColor(srgbRed: 1, green: 1, blue: 0, alpha: 1),\n\tCGColor(srgbRed: 0, green: 1, blue: 0, alpha: 1),\n])\n\nstruct StackLineBasic: View {\n\tvar body: some View {\n\t\tText(\"Stackline\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource1,\n\t\t\tgraphColor: DSFColor.systemGray,\n\t\t\tlineWidth: 1,\n\t\t\tshadowed: true\n\t\t)\n\t\t.frame(height: 40.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineZeroLine: View {\n\tvar body: some View {\n\t\tText(\"Stackline with zero-line\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource1,\n\t\t\tgraphColor: DSFColor.systemPink,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true\n\t\t)\n\t\t.frame(height: 40.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineCenteredZeroLine: View {\n\tvar body: some View {\n\t\tText(\"Stackline centered around zero-line\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource1,\n\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\tcenteredAtZeroLine: true\n\t\t)\n\t\t.frame(height: 40.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineCenteredZeroLineColored: View {\n\tvar body: some View {\n\t\tText(\"Stackline centered around zero-line, lower color, grid lines\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource1,\n\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\tlineWidth: 1,\n\t\t\tshadowed: true,\n\t\t\tcenteredAtZeroLine: true,\n\t\t\tlowerGraphColor: DSFColor.systemRed,\n\t\t\tgridLines: .init(width: 0.5, values: [0, 0.1, 0.2, 0.3, 0.4 ,0.5, 0.6, 0.7, 0.8, 0.9, 1.0])\n\t\t)\n\t\t.frame(height: 60.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineRange: View {\n\tvar body: some View {\n\t\tText(\"Stackline with range\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource2,\n\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\thighlightDefinitions: [\n\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\trange: 20 ..< 80,\n\t\t\t\t\tfillColor: DSFColor.systemGray.withAlphaComponent(0.2).cgColor\n\t\t\t\t),\n\t\t\t]\n\t\t)\n\t\t.frame(width: 250.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineNofill: View {\n\tvar body: some View {\n\t\tText(\"Stackline no fill\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource3,\n\t\t\tgraphColor: DSFColor.systemYellow,\n\t\t\tlineWidth: 3,\n\t\t\tlineShading: false,\n\t\t\tshadowed: false\n\t\t)\n\t\t.frame(width: 330.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineRange2: View {\n\tvar body: some View {\n\t\tText(\"StackLine with range\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource4,\n\t\t\tgraphColor: DSFColor.systemRed,\n\t\t\tlineWidth: 0.5,\n\t\t\tshadowed: false,\n\t\t\tshowZeroLine: true,\n\t\t\thighlightDefinitions: [\n\t\t\t\tDSFSparkline.HighlightRangeDefinition(\n\t\t\t\t\trange: 0.3 ..< 0.7,\n\t\t\t\t\tfillColor: DSFColor.systemPink.withAlphaComponent(0.1).cgColor\n\t\t\t\t),\n\t\t\t]\n\t\t)\n\t\t.frame(width: 330.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineCenteredZeroLine2: View {\n\tvar body: some View {\n\t\tText(\"StackLine centered around zero-line\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource4,\n\t\t\tgraphColor: DSFColor.systemGreen,\n\t\t\tlineWidth: 0.5,\n\t\t\tshadowed: false,\n\t\t\tshowZeroLine: true,\n\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition(\n\t\t\t\tcolor: DSFColor.systemGray,\n\t\t\t\tlineWidth: 1,\n\t\t\t\tlineDashStyle: []\n\t\t\t),\n\t\t\tcenteredAtZeroLine: true,\n\t\t\tlowerGraphColor: DSFColor.systemPink\n\t\t)\n\t\t.frame(width: 100.0, height: 59.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineCenteredZeroLineCustomFill: View {\n\tvar body: some View {\n\t\tText(\"StackLine centered around zero-line, custom fill\")\n\t\tDSFSparklineStackLineGraphView.SwiftUI(\n\t\t\tdataSource: UpDataSource1,\n\t\t\tgraphColor: DSFColor.systemBlue,\n\t\t\tlineWidth: 1,\n\t\t\tshowZeroLine: true,\n\t\t\tcenteredAtZeroLine: true,\n\t\t\tprimaryFill: primaryFill,\n\t\t\tsecondaryFill: secondaryFill\n\t\t)\n\t\t.frame(height: 80.0)\n\t\t.padding(5)\n\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t}\n}\n\nstruct StackLineDemoContentView: View {\n\tvar body: some View {\n\t\tScrollView {\n\t\t\tVStack {\n\t\t\t\tStackLineBasic()\n\t\t\t\tStackLineZeroLine()\n\t\t\t\tStackLineCenteredZeroLine()\n\t\t\t\tStackLineCenteredZeroLineColored()\n\t\t\t\tStackLineCenteredZeroLineCustomFill()\n\t\t\t\tStackLineRange()\n\t\t\t\tStackLineNofill()\n\t\t\t\tStackLineRange2()\n\t\t\t\tStackLineCenteredZeroLine2()\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct StackLineDemoContentView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tStackLineDemoContentView()\n\t}\n}\n\nprivate var UpDataSource1: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.4)\n\t// d.push(values: [0.0, 0.3, 0.2, 0.1, 0.8, 0.7, 0.5, 0.6, 0.1, 0.9, 1])\n\t\n\td.push(values: [\n\t\t0.85, 0.04, 0.24, 0.13, 0.51, 0.93, 0.26, 0.69, 0.16, 0.39,\n\t\t0.19, 0.12, 0.28, 0.42, 0.42, 0.48, 0.29, 0.05, 0.87, 0.28,\n\t])\n\t\n\treturn d\n}()\n\nprivate var UpDataSource2: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 8, range: 0 ... 100)\n\td.push(values: [100, 0, 25, 50, 75, 10, 10, 88])\n\treturn d\n}()\n\nprivate var UpDataSource3: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 21, range: -1 ... 1)\n\t\n\tvar sins: CGFloat = 0.0\n\tlet r: Range<Int> = 0 ..< 21\n\tlet vars: [CGFloat] = r.map { sin(CGFloat($0)) }\n\td.push(values: vars)\n\treturn d\n}()\n\nprivate var UpDataSource4: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 21, range: 0 ... 1)\n\td.zeroLineValue = 0.5\n\td.push(values: [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0])\n\treturn d\n}()\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/StripesDemoView.swift",
    "content": "//\n//  StripesDemoView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\n\nstruct StripesDemoView: View {\n\n\tlet gradient = DSFSparkline.GradientBucket(\n\t\tposts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 0, green: 0, blue: 1, alpha: 1), location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 1, blue: 1, alpha: 1), location: 0.5),\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 0, blue: 0, alpha: 1), location: 1)\n\t\t]\n\t)\n\n\tlet gradientBucketed = DSFSparkline.GradientBucket(\n\t\tposts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 0, green: 0, blue: 1, alpha: 1), location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 1, blue: 1, alpha: 1), location: 0.5),\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 0, blue: 0, alpha: 1), location: 1)\n\t\t],\n\t\tbucketCount: 6\n\t)\n\n\tlet gradient2: DSFSparkline.GradientBucket = {\n\t\tlet g = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemYellow.cgColor, location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(r: 0.3, g: 0, b: 0.3, location: 1.0)\n\t\t])\n\t\tg.bucketCount = 4\n\t\treturn g\n\t}()\n\n\tlet gradient3: DSFSparkline.GradientBucket = {\n\t\tlet g = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemYellow.cgColor, location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(r: 0.3, g: 0, b: 0.3, location: 1.0)\n\t\t])\n\t\tg.bucketCount = 5\n\t\treturn g\n\t}()\n\n\tlet gradient4: DSFSparkline.GradientBucket = {\n\t\tlet g = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(r: 0.0, g: 0.0, b: 0.0, location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(r: 1.0, g: 1.0, b: 1.0, location: 1.0)\n\t\t])\n\t\tg.bucketCount = 8\n\t\treturn g\n\t}()\n\n\tvar body: some View {\n\t\tVStack {\n\n\t\t\tVStack {\n\t\t\t\tText(\"Global annual mean temperature anomaly\")\n\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient)\n\t\t\t\t\t.frame(height: 30)\n\t\t\t\t\t.padding(5)\n\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\n\t\t\tVStack {\n\t\t\t\tText(\"Global annual mean temperature anomaly (6 color buckets)\")\n\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradientBucketed)\n\t\t\t\t\t.frame(height: 30)\n\t\t\t\t\t.padding(5)\n\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\n\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.systemTeal,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineShading: false,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t showZeroLine: true)\n\t\t\t\t.frame(height: 30)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\tVStack {\n\t\t\t\tText(\"Global annual mean temperature anomaly overlaid\")\n\n\t\t\t\tZStack {\n\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient)\n\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.black,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineWidth: 1.5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t interpolated: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineShading: true)\n\t\t\t\t}\n\t\t\t\t.frame(height: 40)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\n\t\t\tVStack {\n\t\t\t\tText(\"Global annual mean temperature anomaly overlaid (6 color buckets)\")\n\n\t\t\t\tZStack {\n\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradientBucketed)\n\t\t\t\t\tDSFSparklineLineGraphView.SwiftUI(dataSource: WorldDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t graphColor: DSFColor.black,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineWidth: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t interpolated: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lineShading: true)\n\t\t\t\t}\n\t\t\t\t.frame(height: 40)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t}\n\n\n\t\t\tText(\"Australian annual mean temperature anomaly\")\n\n\t\t\tVStack {\n\t\t\t\tHStack {\n\t\t\t\t\tText(\"integral\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: australianAnomaly,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t integral: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient2)\n\t\t\t\t\t\t.frame(height: 25)\n\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t}\n\t\t\t\tHStack {\n\t\t\t\t\tText(\"integral\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: australianAnomaly,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t integral: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient2)\n\t\t\t\t\t\t.frame(height: 25)\n\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t}\n\n\t\t\t\tHStack {\n\t\t\t\t\tText(\"fractional\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: australianAnomaly,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient2)\n\t\t\t\t\t\t.frame(height: 25)\n\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t}\n\n\t\t\t\tHStack {\n\t\t\t\t\tText(\"fractional\").frame(width: 70, alignment: Alignment.trailing)\n\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: australianAnomaly,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient2)\n\t\t\t\t\t\t.frame(height: 25)\n\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tVStack {\n\t\t\t\tHStack {\n\t\t\t\t\tVStack {\n\t\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: GradientTestDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient3)\n\t\t\t\t\t\t\t.frame(height: 25)\n\t\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t\t\tDSFSparklineBarGraphView.SwiftUI(dataSource: GradientTestDataSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgraphColor: DSFColor(red: 0.5, green: 0, blue: 0.5, alpha: 1.0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcenteredAtZeroLine: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlowerGraphColor: DSFColor.systemYellow)\n\t\t\t\t\t\t\t.frame(height: 50)\n\t\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t\t}\n\t\t\t\t\tVStack {\n\t\t\t\t\t\tDSFSparklineStripesGraphView.SwiftUI(dataSource: GradientTestDataSource2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t barSpacing: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t gradient: self.gradient4)\n\t\t\t\t\t\t\t.frame(height: 50)\n\t\t\t\t\t\t\t.padding(5)\n\t\t\t\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.padding(4)\n//\t\t.frame(width: 400)\n\n\t}\n}\n\nstruct StripesDemoView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tStripesDemoView()\n\t}\n}\n\n\n// MARK: -\n\nfileprivate var GradientTestDataSource: DSFSparkline.DataSource = {\n\tlet e = DSFSparkline.DataSource()\n\te.set(values: [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0,\n\t\t\t\t\t\t1, 2, 3, 4, 5, 6, 7, 8, 9])\n\treturn e\n}()\n\nfileprivate var GradientTestDataSource2: DSFSparkline.DataSource = {\n\tlet e = DSFSparkline.DataSource()\n\te.set(values: [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0,\n\t\t\t\t\t\t1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n\treturn e\n}()\n\n// MARK: - World definition\n\nlet WorldDataSource: DSFSparkline.DataSource = {\n\tlet e = DSFSparkline.DataSource(windowSize: UInt(WorldRawData.count))\n\te.set(values: WorldRawData)\n\treturn e\n}()\n\n// https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/download.html\n// https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/time_series/HadCRUT.4.6.0.0.annual_ns_avg.txt\n// Data format :- https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/series_format.html\n\nlet WorldRawData: [CGFloat] = [\n\t-0.373,\n\t-0.218,\n\t-0.228,\n\t-0.269,\n\t-0.248,\n\t-0.272,\n\t-0.358,\n\t-0.461,\n\t-0.467,\n\t-0.284,\n\t-0.343,\n\t-0.407,\n\t-0.524,\n\t-0.278,\n\t-0.494,\n\t-0.279,\n\t-0.251,\n\t-0.321,\n\t-0.238,\n\t-0.262,\n\t-0.276,\n\t-0.335,\n\t-0.227,\n\t-0.304,\n\t-0.368,\n\t-0.395,\n\t-0.384,\n\t-0.075,\n\t 0.035,\n\t-0.230,\n\t-0.227,\n\t-0.200,\n\t-0.213,\n\t-0.296,\n\t-0.409,\n\t-0.389,\n\t-0.367,\n\t-0.418,\n\t-0.307,\n\t-0.171,\n\t-0.416,\n\t-0.330,\n\t-0.455,\n\t-0.473,\n\t-0.410,\n\t-0.390,\n\t-0.186,\n\t-0.206,\n\t-0.412,\n\t-0.289,\n\t-0.203,\n\t-0.259,\n\t-0.402,\n\t-0.479,\n\t-0.520,\n\t-0.377,\n\t-0.283,\n\t-0.465,\n\t-0.511,\n\t-0.522,\n\t-0.490,\n\t-0.544,\n\t-0.437,\n\t-0.424,\n\t-0.244,\n\t-0.141,\n\t-0.383,\n\t-0.468,\n\t-0.333,\n\t-0.275,\n\t-0.247,\n\t-0.187,\n\t-0.302,\n\t-0.276,\n\t-0.294,\n\t-0.215,\n\t-0.108,\n\t-0.210,\n\t-0.206,\n\t-0.350,\n\t-0.137,\n\t-0.087,\n\t-0.137,\n\t-0.273,\n\t-0.131,\n\t-0.178,\n\t-0.147,\n\t-0.026,\n\t-0.006,\n\t-0.052,\n\t 0.014,\n\t 0.020,\n\t-0.027,\n\t-0.004,\n\t 0.144,\n\t 0.025,\n\t-0.071,\n\t-0.038,\n\t-0.039,\n\t-0.074,\n\t-0.173,\n\t-0.052,\n\t 0.028,\n\t 0.097,\n\t-0.129,\n\t-0.190,\n\t-0.267,\n\t-0.007,\n\t 0.046,\n\t 0.017,\n\t-0.049,\n\t 0.038,\n\t 0.014,\n\t 0.048,\n\t-0.223,\n\t-0.140,\n\t-0.068,\n\t-0.074,\n\t-0.113,\n\t 0.032,\n\t-0.027,\n\t-0.186,\n\t-0.065,\n\t 0.062,\n\t-0.214,\n\t-0.149,\n\t-0.241,\n\t 0.047,\n\t-0.062,\n\t 0.057,\n\t 0.092,\n\t 0.140,\n\t 0.011,\n\t 0.194,\n\t-0.014,\n\t-0.030,\n\t 0.045,\n\t 0.192,\n\t 0.198,\n\t 0.118,\n\t 0.296,\n\t 0.254,\n\t 0.105,\n\t 0.148,\n\t 0.208,\n\t 0.325,\n\t 0.183,\n\t 0.390,\n\t 0.539,\n\t 0.306,\n\t 0.294,\n\t 0.441,\n\t 0.496,\n\t 0.505,\n\t 0.447,\n\t 0.545,\n\t 0.506,\n\t 0.491,\n\t 0.395,\n\t 0.506,\n\t 0.560,\n\t 0.425,\n\t 0.470,\n\t 0.514,\n\t 0.579,\n\t 0.763,\n\t 0.797,\n\t 0.677,\n\t 0.597,\n\t 0.736,\n\t 0.768\n]\n\n// MARK: - Australia Mean Temp Deviation\n\nfileprivate var australianAnomaly: DSFSparkline.DataSource = {\n\tlet e = DSFSparkline.DataSource(windowSize: UInt(AustraliaMeanTempDeviation.count))\n\te.set(values: AustraliaMeanTempDeviation)\n\treturn e\n}()\n\n// http://www.bom.gov.au/climate/change/#tabs=Tracker&tracker=timeseries&tQ=graph%3Dtmean%26area%3Daus%26season%3D0112\nlet AustraliaMeanTempDeviation: [CGFloat] = [\n\t-0.50,\n\t-0.68,\n\t-0.20,\n\t-0.87,\n\t 0.12,\n\t 0.07,\n\t-0.57,\n\t-1.24,\n\t-0.54,\n\t-0.15,\n\t-0.53,\n\t-0.23,\n\t-0.47,\n\t-0.38,\n\t-0.69,\n\t-0.77,\n\t-0.17,\n\t-0.51,\n\t 0.16,\n\t-0.87,\n\t-0.24,\n\t-0.59,\n\t-0.42,\n\t-0.45,\n\t-0.36,\n\t-0.50,\n\t-0.14,\n\t-0.36,\n\t 0.19,\n\t-0.62,\n\t-0.24,\n\t-0.55,\n\t 0.08,\n\t-0.62,\n\t-0.40,\n\t-0.29,\n\t-0.73,\n\t-0.25,\n\t-0.45,\n\t-0.94,\n\t-0.61,\n\t-0.43,\n\t-0.43,\n\t-0.45,\n\t-0.36,\n\t-0.32,\n\t-0.92,\n\t 0.04,\n\t 0.14,\n\t 0.24,\n\t-0.66,\n\t 0.05,\n\t-0.11,\n\t-0.13,\n\t-0.22,\n\t 0.25,\n\t-0.50,\n\t-0.22,\n\t-0.39,\n\t-0.03,\n\t-0.10,\n\t-0.22,\n\t 0.15,\n\t 0.54,\n\t-0.70,\n\t-0.22,\n\t-0.75,\n\t-0.04,\n\t-0.31,\n\t 0.37,\n\t 0.74,\n\t 0.27,\n\t-0.04,\n\t 0.33,\n\t-0.38,\n\t 0.21,\n\t 0.22,\n\t 0.17,\n\t 0.73,\n\t-0.02,\n\t 0.47,\n\t 0.60,\n\t 0.12,\n\t 0.31,\n\t 0.18,\n\t 0.16,\n\t 0.60,\n\t 0.30,\n\t 0.97,\n\t 0.32,\n\t-0.04,\n\t 0.05,\n\t 0.71,\n\t 0.69,\n\t 0.54,\n\t 1.16,\n\t 0.50,\n\t 0.76,\n\t 0.45,\n\t 0.93,\n\t 0.33,\n\t-0.00,\n\t 0.24,\n\t 1.33,\n\t 1.04,\n\t 0.94,\n\t 0.99,\n\t 1.06,\n\t 1.12,\n\t 1.52,\n\t 1.15\n]\n\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/SwiftUI-Overlays/OverlayView.swift",
    "content": "//\n//  OverlayView.swift\n//  Demos\n//\n//  Created by Darren Ford on 17/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nextension DSFColor {\n\tstatic var primaryTextColor: DSFColor {\n\t\t#if os(macOS)\n\t\treturn NSColor.textColor\n\t\t#else\n\t\treturn UIColor.label\n\t\t#endif\n\t}\n}\n\n\nfileprivate var dataSource1: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: -55 ... 55, zeroLineValue: 0)\n\td.set(values: [\n\t\t\t\t18, -5, 11, 12, -21, 48, 41, -19, -28, 3,\n\t\t\t\t28, -27, -21, -45, -48, -39, 33, -4, 35, 37]\n\t)\n\treturn d\n}()\n\n\nstruct OverlayView: View {\n\n\tvar barGraph: DSFSparklineOverlay = {\n\t\tlet b = DSFSparklineOverlay.Bar()\n\t\tb.dataSource = dataSource1\n\t\tb.strokeWidth = 2\n\t\tb.primaryStrokeColor = DSFColor.systemPink.cgColor\n\t\tb.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemPink.withAlphaComponent(0.5).cgColor)\n\t\treturn b\n\t}()\n\n\tvar lineGraph: DSFSparklineOverlay = {\n\t\tlet l = DSFSparklineOverlay.Line()\n\t\tl.dataSource = dataSource1\n\t\tl.strokeWidth = 1\n\t\tl.interpolated = true\n\t\tl.primaryStrokeColor = DSFColor.primaryTextColor.cgColor\n\t\tl.primaryFill = DSFSparkline.Fill.Color(DSFColor.primaryTextColor.withAlphaComponent(0.7).cgColor)\n\t\treturn l\n\t}()\n\n\tvar barGraph2: DSFSparklineOverlay = {\n\t\tlet b = DSFSparklineOverlay.Bar()\n\t\tb.dataSource = dataSource1\n\t\tb.strokeWidth = 2\n\t\tb.primaryStrokeColor = DSFColor.systemPink.cgColor\n\t\tb.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemPink.withAlphaComponent(0.5).cgColor)\n\t\treturn b\n\t}()\n\n\tvar lineGraph2: DSFSparklineOverlay = {\n\t\tlet l = DSFSparklineOverlay.Line()\n\t\tl.dataSource = dataSource1\n\t\tl.strokeWidth = 1\n\t\tl.interpolated = true\n\t\tl.primaryStrokeColor = DSFColor.primaryTextColor.cgColor\n\t\tl.primaryFill = DSFSparkline.Fill.Color(DSFColor.primaryTextColor.withAlphaComponent(0.7).cgColor)\n\t\treturn l\n\t}()\n\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Overlay two sparklines using the same data\")\n\t\t\t\t.font(.headline)\n\n\t\t\tHStack {\n\t\t\t\tVStack {\n\t\t\t\t\tDSFSparklineSurface.SwiftUI([\n\t\t\t\t\t\tbarGraph,\t\t// bar on the bottom\n\t\t\t\t\t\tlineGraph\t\t// line on the top\n\t\t\t\t\t])\n\t\t\t\t\t.frame(height: 40)\n\t\t\t\t\tText(\"Line on top\").font(.caption)\n\t\t\t\t}\n\n\t\t\t\tVStack {\n\t\t\t\t\tDSFSparklineSurface.SwiftUI([\n\t\t\t\t\t\tlineGraph2,\t\t// line on the bottom\n\t\t\t\t\t\tbarGraph2\t\t// bar on the top\n\t\t\t\t\t])\n\t\t\t\t\t.frame(height: 40)\n\t\t\t\t\tText(\"Bar on top\").font(.caption)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.frame(width: 500)\n\t\t.padding()\n\t}\n}\n\n\n\nstruct OverlayView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tOverlayView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/SwiftUI-Overlays/StripesOverlaidView.swift",
    "content": "//\n//  StripesOverlaidView.swift\n//  Demos\n//\n//  Created by Darren Ford on 28/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nstruct StripesOverlaidView: View {\n\n\tstatic let palette = DSFSparkline.GradientBucket(posts: [\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemGreen.cgColor, location: 0),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemGreen.cgColor, location: 0.1),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemYellow.cgColor, location: 0.5),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemRed.cgColor, location: 0.9),\n\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemRed.cgColor, location: 1.0)\n\t])\n\n\tvar stripesOverlay: DSFSparklineOverlay = {\n\t\tlet s = DSFSparklineOverlay.Stripes()\n\t\ts.dataSource = WorldDataSource\n\t\ts.integral = false\n\t\ts.gradient = StripesOverlaidView.palette\n\t\treturn s\n\t}()\n\n\tvar lineOverlay: DSFSparklineOverlay = {\n\t\tlet l = DSFSparklineOverlay.Line()\n\t\tl.dataSource = WorldDataSource\n\t\tl.strokeWidth = 1\n\t\tl.interpolated = true\n\t\tl.primaryStrokeColor = DSFColor.black.cgColor\n\t\tl.primaryFill = DSFSparkline.Fill.Color(DSFColor.black.withAlphaComponent(0.3).cgColor)\n\t\treturn l\n\t}()\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Overlay two sparklines using the same data\")\n\t\t\t\t.font(.headline)\n\n\t\t\tDSFSparklineSurface.SwiftUI([\n\t\t\t\tstripesOverlay,\n\t\t\t\tlineOverlay\n\t\t\t])\n\t\t\t.frame(height: 40)\n\t\t}\n\t}\n}\n\nstruct StripesOverlaidView_Previews: PreviewProvider {\n    static var previews: some View {\n        StripesOverlaidView()\n    }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/SwiftUI-Overlays/SuperCoolLineSpark.swift",
    "content": "//\n//  SuperCoolLineSpark.swift\n//  Demos\n//\n//  Created by Darren Ford on 1/3/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfileprivate let SwiftUIDemoDataSource: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.5)\n\t  d.push(values: [\n\t\t  0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,\n\t\t  0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n\t  ])\n\t  return d\n  }()\n\nstruct SuperCoolLineSpark: View {\n\t// The overlay representing the zero-line for the data source\n\tvar zeroOverlay: DSFSparklineOverlay = {\n\t\tlet zeroLine = DSFSparklineOverlay.ZeroLine()\n\t\tzeroLine.dataSource = SwiftUIDemoDataSource\n\t\tzeroLine.dashStyle = []\n\t\treturn zeroLine\n\t}()\n\n\t// The overlay to draw a highlight between range 0 ..< 0.2\n\tvar rangeOverlay: DSFSparklineOverlay = {\n\t\tlet highlight = DSFSparklineOverlay.RangeHighlight()\n\t\thighlight.dataSource = SwiftUIDemoDataSource\n\t\thighlight.highlightRange = 0.0 ..< 0.2\n\t\thighlight.fill = DSFSparkline.Fill.Color(DSFColor.gray.withAlphaComponent(0.4).cgColor)\n\t\treturn highlight\n\t}()\n\n\t// The actual line graph\n\tvar lineOverlay: DSFSparklineOverlay = {\n\t\tlet lineOverlay = DSFSparklineOverlay.Line()\n\t\tlineOverlay.dataSource = SwiftUIDemoDataSource\n\n\t\tlineOverlay.primaryStrokeColor = DSFColor.systemBlue.cgColor\n\t\tlineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemBlue.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.secondaryStrokeColor = DSFColor.systemYellow.cgColor\n\t\tlineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemYellow.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.strokeWidth = 1\n\t\tlineOverlay.markerSize = 4\n\t\tlineOverlay.centeredAtZeroLine = true\n\n\t\treturn lineOverlay\n\t}()\n\n\tvar body: some View {\n\t\tDSFSparklineSurface.SwiftUI([\n\t\t\trangeOverlay,    // range highlight overlay\n\t\t\tzeroOverlay,     // zero-line overlay\n\t\t\tlineOverlay,     // line graph overlay\n\t\t])\n\t\t.frame(width: 150, height: 40)\n\t}\n}\n\nstruct SuperCoolLineSpark_Previews: PreviewProvider {\n    static var previews: some View {\n        SuperCoolLineSpark()\n    }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/SwiftUI-Overlays/SwiftUIContentView.swift",
    "content": "//\n//  SwiftUIView.swift\n//  Demos\n//\n//  Created by Darren Ford on 26/2/21.\n//\n\nimport DSFSparkline\nimport SwiftUI\n\n// A shared data source\nprivate var lineOverlayDataSource: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: -0.1 ... 1.1, zeroLineValue: 0.5)\n\td.push(values: [\n\t\t1.00, 1.00, 0.44, 0.16, 0.30, 0.58, 0.87, 0.44, 0.00, 0.00,\n\t\t0.38, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50,\n\t])\n\treturn d\n}()\n\nstruct SwiftUIContentView_LineOnly: View {\n\t// The actual line graph\n\tfileprivate let lineOverlay1: DSFSparklineOverlay = {\n\t\tlet lineOverlay = DSFSparklineOverlay.Line()\n\t\tlineOverlay.dataSource = lineOverlayDataSource\n\n\t\tlineOverlay.primaryStrokeColor = DSFColor.systemGreen.cgColor\n\t\tlineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemGreen.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.secondaryStrokeColor = DSFColor.systemRed.cgColor\n\t\tlineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemRed.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.strokeWidth = 2\n\t\tlineOverlay.markerSize = 6\n\t\tlineOverlay.centeredAtZeroLine = true\n\n\t\treturn lineOverlay\n\t}()\n\n\tvar body: some View {\n\t\tDSFSparklineSurface.SwiftUI([\n\t\t\tlineOverlay1, // overlay 1 - line graph\n\t\t])\n\t}\n}\n\nstruct SwiftUIContentView_LineOnly_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tSwiftUIContentView_LineOnly()\n\t}\n}\n\n//////\n\nstruct SwiftUIContentView_LineZeroLine: View {\n\t// The actual line graph\n\tfileprivate let lineOverlay2: DSFSparklineOverlay = {\n\t\tlet lineOverlay = DSFSparklineOverlay.Line()\n\t\tlineOverlay.dataSource = lineOverlayDataSource\n\n\t\tlineOverlay.primaryStrokeColor = DSFColor.systemGreen.cgColor\n\t\tlineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemGreen.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.secondaryStrokeColor = DSFColor.systemRed.cgColor\n\t\tlineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemRed.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.strokeWidth = 2\n\t\tlineOverlay.markerSize = 6\n\t\tlineOverlay.centeredAtZeroLine = true\n\n\t\treturn lineOverlay\n\t}()\n\n\t// The overlay representing the zero-line for the graph\n\tfileprivate let lineZeroOverlay2: DSFSparklineOverlay = {\n\t\tlet zeroLine = DSFSparklineOverlay.ZeroLine()\n\t\tzeroLine.dataSource = LineSource1\n\t\tzeroLine.dashStyle = []\n\t\treturn zeroLine\n\t}()\n\n\tvar body: some View {\n\t\tDSFSparklineSurface.SwiftUI([\n\t\t\tlineZeroOverlay2, // overlay 1 - zero-line\n\t\t\tlineOverlay2, // overlay 2 - line graph\n\t\t])\n\t}\n}\n\nstruct SwiftUIContentView_LineZeroLine_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tSwiftUIContentView_LineZeroLine()\n\t}\n}\n\n//////\n\nstruct SwiftUIContentView_LineZeroLineGrid: View {\n\t// The actual line graph\n\tfileprivate let lineOverlay3: DSFSparklineOverlay = {\n\t\tlet lineOverlay = DSFSparklineOverlay.Line()\n\t\tlineOverlay.dataSource = lineOverlayDataSource\n\n\t\tlineOverlay.primaryStrokeColor = DSFColor.systemGreen.cgColor\n\t\tlineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemGreen.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.secondaryStrokeColor = DSFColor.systemRed.cgColor\n\t\tlineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemRed.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.strokeWidth = 2\n\t\tlineOverlay.markerSize = 6\n\t\tlineOverlay.centeredAtZeroLine = true\n\n\t\treturn lineOverlay\n\t}()\n\n\t// The overlay representing the zero-line for the graph\n\tfileprivate let lineZeroOverlay3: DSFSparklineOverlay = {\n\t\tlet zeroLine = DSFSparklineOverlay.ZeroLine()\n\t\tzeroLine.dataSource = LineSource1\n\t\tzeroLine.dashStyle = []\n\t\treturn zeroLine\n\t}()\n\n\tfileprivate let gridOverlay3: DSFSparklineOverlay = {\n\t\tlet grid = DSFSparklineOverlay.GridLines()\n\t\tgrid.dataSource = lineOverlayDataSource\n\n\t\tgrid.floatValues = [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]\n\t\tgrid.strokeColor = DSFColor.systemGray.withAlphaComponent(0.3).cgColor\n\t\tgrid.strokeWidth = 0.5\n\t\tgrid.dashStyle = [1, 1]\n\n\t\treturn grid\n\t}()\n\n\tvar body: some View {\n\t\tDSFSparklineSurface.SwiftUI([\n\t\t\tgridOverlay3, // overlay 1 - grid lines\n\t\t\tlineZeroOverlay3, // overlay 2 - zero-line\n\t\t\tlineOverlay3, // overlay 3 - line graph\n\t\t])\n\t}\n}\n\nstruct SwiftUIContentView_LineZeroLineGrid_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tSwiftUIContentView_LineZeroLineGrid()\n\t}\n}\n\nstruct SwiftUIContentView_LineZeroLineGridRanges: View {\n\t// The actual line graph\n\tfileprivate let lineOverlay4: DSFSparklineOverlay = {\n\t\tlet lineOverlay = DSFSparklineOverlay.Line()\n\t\tlineOverlay.dataSource = lineOverlayDataSource\n\n\t\tlineOverlay.primaryStrokeColor = DSFColor.systemGreen.cgColor\n\t\tlineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemGreen.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.secondaryStrokeColor = DSFColor.systemRed.cgColor\n\t\tlineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemRed.withAlphaComponent(0.3).cgColor)\n\n\t\tlineOverlay.strokeWidth = 2\n\t\tlineOverlay.markerSize = 6\n\t\tlineOverlay.centeredAtZeroLine = true\n\n\t\treturn lineOverlay\n\t}()\n\n\t// The overlay representing the zero-line for the graph\n\tfileprivate let lineZeroOverlay4: DSFSparklineOverlay = {\n\t\tlet zeroLine = DSFSparklineOverlay.ZeroLine()\n\t\tzeroLine.dataSource = LineSource1\n\t\tzeroLine.dashStyle = []\n\t\treturn zeroLine\n\t}()\n\n\tfileprivate let gridOverlay4: DSFSparklineOverlay = {\n\t\tlet grid = DSFSparklineOverlay.GridLines()\n\t\tgrid.dataSource = lineOverlayDataSource\n\n\t\tgrid.floatValues = [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]\n\t\tgrid.strokeColor = DSFColor.systemGray.withAlphaComponent(0.3).cgColor\n\t\tgrid.strokeWidth = 0.5\n\t\tgrid.dashStyle = [1, 1]\n\n\t\treturn grid\n\t}()\n\n\tfileprivate let rangeOverlay4: DSFSparklineOverlay = {\n\t\tlet highlight = DSFSparklineOverlay.RangeHighlight()\n\t\thighlight.dataSource = lineOverlayDataSource\n\n\t\thighlight.highlightRange = 0.0 ..< 0.2\n\t\thighlight.fill = DSFSparkline.Fill.Color(DSFColor.systemRed.withAlphaComponent(0.1).cgColor)\n\n\t\treturn highlight\n\t}()\n\n\tfileprivate let rangeOverlay5: DSFSparklineOverlay = {\n\t\tlet highlight = DSFSparklineOverlay.RangeHighlight()\n\t\thighlight.dataSource = lineOverlayDataSource\n\n\t\thighlight.highlightRange = 0.8 ..< 1.0\n\t\thighlight.fill = DSFSparkline.Fill.Color(DSFColor.systemGreen.withAlphaComponent(0.1).cgColor)\n\n\t\treturn highlight\n\t}()\n\n\tvar body: some View {\n\t\tDSFSparklineSurface.SwiftUI([\n\t\t\trangeOverlay4, // overlay 1 - lower highlight\n\t\t\trangeOverlay5, // overlay 2 - upper highlight\n\t\t\tlineZeroOverlay4, // overlay 3 - zero-line\n\t\t\tgridOverlay4, // overlay 4 - grid\n\t\t\tlineOverlay4, // overlay 5 - line graph\n\t\t])\n\t}\n}\n\nstruct SwiftUIContentView_LineZeroLineGridRanges_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tSwiftUIContentView_LineZeroLineGridRanges()\n\t}\n}\n\n/////\n\nstruct SwiftUILineGraphContentView: View {\n\n\tlet shouldAnimate: Bool\n\n\tfileprivate let animator = Animator()\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"A SwiftUI view demonstrating overlays\")\n\t\t\t\t.font(.headline)\n\n\t\t\tHStack {\n\t\t\t\tVStack {\n\t\t\t\t\tSwiftUIContentView_LineOnly()\n\t\t\t\t\t\t.frame(width: 150, height: 50)\n\t\t\t\t\t\t.padding(4)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3))\n\n\t\t\t\t\tText(\"Line only\").font(.footnote)\n\t\t\t\t}\n\t\t\t\tVStack {\n\t\t\t\t\tSwiftUIContentView_LineZeroLine()\n\t\t\t\t\t\t.frame(width: 150, height: 50)\n\t\t\t\t\t\t.padding(4)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3))\n\t\t\t\t\tText(\"Line, zero-line\").font(.footnote)\n\t\t\t\t}\n\t\t\t\tVStack {\n\t\t\t\t\tSwiftUIContentView_LineZeroLineGrid()\n\t\t\t\t\t\t.frame(width: 150, height: 50)\n\t\t\t\t\t\t.padding(4)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3))\n\t\t\t\t\tText(\"Line, zero-line, grid\").font(.footnote)\n\t\t\t\t}\n\n\t\t\t\tVStack {\n\t\t\t\t\tSwiftUIContentView_LineZeroLineGridRanges()\n\t\t\t\t\t\t.frame(width: 150, height: 50)\n\t\t\t\t\t\t.padding(4)\n\t\t\t\t\t\t.border(Color.gray.opacity(0.3))\n\t\t\t\t\tText(\"Line, zero-line, grid, ranges\").font(.footnote)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.onAppear() {\n\t\t\tif shouldAnimate {\n\t\t\t\tself.animator.updateWithNewValues()\n\t\t\t}\n\t\t}\n\t}\n}\n\nfileprivate class Animator {\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// push a new value into the graph's data source\n\t\t\tlet cr2 = CGFloat.random(in: lineOverlayDataSource.range!) // -1 ... 1)\n\t\t\t_ = lineOverlayDataSource.push(value: cr2)\n\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n}\n\nstruct SwiftUIContentView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tSwiftUILineGraphContentView(shouldAnimate: false)\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/SwiftUI-Overlays/SwiftUIView.swift",
    "content": "//\n//  SwiftUIView.swift\n//  Demos\n//\n//  Created by Darren Ford on 28/2/21.\n//\n\nimport SwiftUI\n\nstruct SwiftUIView: View {\n\tlet shouldAnimate: Bool\n\tvar body: some View {\n\t\tScrollView([.vertical, .horizontal]) {\n\t\t\tVStack {\n\t\t\t\tSuperCoolLineSpark()\n\t\t\t\tOverlayView()\n\t\t\t\tStripesOverlaidView()\n\t\t\t\tSwiftUILineGraphContentView(shouldAnimate: shouldAnimate)\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct SwiftUIView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tSwiftUIView(shouldAnimate: false)\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/SwiftUI_Sparkline_DemoApp.swift",
    "content": "//\n//  SwiftUI_Sparkline_DemoApp.swift\n//  Shared\n//\n//  Created by Darren Ford on 27/1/21.\n//\n\nimport SwiftUI\n\nlet IsRunningInPreviewPane: Bool = ProcessInfo.processInfo.environment[\"XCODE_RUNNING_FOR_PREVIEWS\"] == \"1\"\n\n@main\nstruct SwiftUI_Sparkline_DemoApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/TabletView.swift",
    "content": "//\n//  TabletView.swift\n//  Demos\n//\n//  Created by Darren Ford on 28/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\n\nfileprivate var TabletDataSource2: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(range: -1 ... 1)\n\td.set(values: [1, -1, 1, -1, 1, 0, -1, -1, 1, 0, 1, -1, -1, 0])\n\treturn d\n}()\n\n\n\nstruct TabletView: View {\n\n\tlet shouldAnimate: Bool\n\tfileprivate let animator = Animator()\n\n\tvar TabletDataSource1: DSFSparkline.DataSource = {\n\t\tlet d = DSFSparkline.DataSource(windowSize: 20, range: -1 ... 1)\n\t\td.push(values: [1, 1, 1, -1, 1, 0, -1, -1, 1, 1, 1, -1, -1, 1, 1, 0, -1, 1, 1, 1])\n\t\treturn d\n\t}()\n\n\tvar tabletOverlay: DSFSparklineOverlay = {\n\t\tlet t = DSFSparklineOverlay.Tablet()\n\t\tt.dataSource = TabletDataSource2\n\t\tt.winStrokeColor = DSFColor.primaryTextColor.cgColor\n\t\tt.winFill = DSFSparkline.Fill.Color(DSFColor.systemGreen.withAlphaComponent(0.7).cgColor)\n\t\tt.lossStrokeColor = DSFColor.primaryTextColor.cgColor\n\t\tt.lossFill = DSFSparkline.Fill.Color(DSFColor.systemRed.withAlphaComponent(0.1).cgColor)\n\t\treturn t\n\t}()\n\n\tvar body: some View {\n\t\tVStack {\n\t\t\tText(\"Tablets using prebuilt types\")\n\n\t\t\tVStack {\n\t\t\t\tDSFSparklineTabletGraphView.SwiftUI(\n\t\t\t\t\tdataSource: TabletDataSource1,\n\t\t\t\t\twinColor: .systemTeal,\n\t\t\t\t\tlossColor: DSFColor.systemGray.withAlphaComponent(0.2),\n\t\t\t\t\tbarSpacing: 2\n\t\t\t\t)\n\t\t\t\t.frame(height: 20)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\t\tDSFSparklineTabletGraphView.SwiftUI(\n\t\t\t\t\tdataSource: TabletDataSource1,\n\t\t\t\t\tlineWidth: 0.5,\n\t\t\t\t\tbarSpacing: 2\n\t\t\t\t)\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t.frame(width: 200, height: 20)\n\t\t\t}\n\n\t\t\tVStack {\n\t\t\t\tText(\"Tablet using overlays\")\n\t\t\t\tDSFSparklineSurface.SwiftUI([\n\t\t\t\t\tself.tabletOverlay\n\t\t\t\t])\n\t\t\t\t.padding(5)\n\t\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\t\t\t\t.frame(height: 30)\n\t\t\t\t.onAppear {\n\t\t\t\t\tif shouldAnimate {\n\t\t\t\t\t\tself.animator.updateWithNewValues()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t.padding(EdgeInsets(top: 16, leading: 0, bottom: 0, trailing: 0))\n\t\t}\n\t}\n}\n\nstruct TabletView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tTabletView(shouldAnimate: false)\n\t}\n}\n\n\nfileprivate class Animator {\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// push a new value into the graph's data source\n\t\t\tlet cr2 = CGFloat.random(in: TabletDataSource2.range!) // -1 ... 1)\n\t\t\t_ = TabletDataSource2.push(value: cr2)\n\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/TestingView.swift",
    "content": "//\n//  TestingView.swift\n//  Demos\n//\n//  Created by Darren Ford on 14/4/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nstruct TestingView: View {\n\n\tvar body: some View {\n\t\tText(\"hello\")\n\t\t\t.padding()\n\t}\n}\n\nstruct TestingView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tTestingView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/WinLossGraphContentView.swift",
    "content": "//\n//  WinLossGraphContentView.swift\n//  SwiftUI Demo\n//\n//  Created by Darren Ford on 26/1/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfunc WinLossCreate() -> some View {\n\treturn WinLossGraphContentView(\n\t\tleftDataSource: WinLossDataSource1,\n\t\trightDataSource: WinLossDataSource2,\t\n\t\tupDataSource: WinLossDataSource3)\n}\n\nstruct ProductSales: Identifiable {\n\tvar id: String { product }\n\n\tstatic let formatter: NumberFormatter = {\n\t\tlet formatter = NumberFormatter()\n\t\tformatter.numberStyle = .percent\n\t\tformatter.minimumIntegerDigits = 1\n\t\tformatter.maximumIntegerDigits = 3\n\t\tformatter.maximumFractionDigits = 3\n\t\treturn formatter\n\t}()\n\n\tlet product: String\n\tlet q1: Double\n\tvar q1s: String { ProductSales.formatter.string(for: q1 / 100) ?? \"\" }\n\tlet q2: Double\n\tvar q2s: String { ProductSales.formatter.string(for: q2 / 100) ?? \"\" }\n\tlet q3: Double\n\tvar q3s: String { ProductSales.formatter.string(for: q3 / 100) ?? \"\" }\n\tlet q4: Double\n\tvar q4s: String { ProductSales.formatter.string(for: q4 / 100) ?? \"\" }\n\tvar wl: [CGFloat] { [q1, q2, q3, q4] }\n}\n\nstruct WinLossGraphContentView: View {\n\n\tlet leftDataSource: DSFSparkline.DataSource\n\tlet rightDataSource: DSFSparkline.DataSource\n\tlet upDataSource: DSFSparkline.DataSource\n\n\t@State private var sales: [ProductSales] = [\n\t\tProductSales(product: \"AAA-001\", q1: 6, q2: -4, q3: 9.80, q4: 10.20),\n\t\tProductSales(product: \"BBB-002\", q1: 12, q2: -11, q3: -10.6, q4: 5.8),\n\t\tProductSales(product: \"CCC-003\", q1: -9, q2: 7, q3: 5.20, q4: 6.70),\n\t\tProductSales(product: \"DDD-004\", q1: 5, q2: -9, q3: 1.80, q4: -5.90),\n\t]\n\n\tvar body: some View {\n\t\tVStack(spacing: 8) {\n\n\t\t\tText(\"Win/Loss\")\n\t\t\t\t.font(.title2).bold()\n\n\t\t\tDSFSparklineWinLossGraphView.SwiftUI(\n\t\t\t\tdataSource: leftDataSource\n\t\t\t)\n\t\t\t.frame(height: 60)\n\t\t\t.padding(5)\n\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\tText(\"Win/Loss/Tie\")\n\t\t\t\t.font(.title2).bold()\n\n\t\t\tDSFSparklineWinLossGraphView.SwiftUI(\n\t\t\t\tdataSource: rightDataSource,\n\t\t\t\twinColor: .systemIndigo,\n\t\t\t\tlossColor: .systemTeal,\n\t\t\t\ttieColor: DSFColor.systemGray.withAlphaComponent(0.1),\n\t\t\t\tlineWidth: 3,\n\t\t\t\tbarSpacing: 6\n\t\t\t)\n\t\t\t.frame(height: 60)\n\t\t\t.padding(5)\n\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\tText(\"Win/Loss/Tie with center-line\")\n\t\t\t\t.font(.title2).bold()\n\n\t\t\tDSFSparklineWinLossGraphView.SwiftUI(\n\t\t\t\tdataSource: upDataSource,\n\t\t\t\twinColor: .systemGreen,\n\t\t\t\tlossColor: .systemRed,\n\t\t\t\ttieColor: DSFColor.systemYellow.withAlphaComponent(0.2),\n\t\t\t\tbarSpacing: 3,\n\t\t\t\tshowZeroLine: true,\n\t\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition(color: .systemGray)\n\t\t\t)\n\t\t\t.frame(width: 330.0, height: 34.0)\n\t\t\t.padding(5)\n\t\t\t.border(Color.gray.opacity(0.2), width: 1)\n\n\t\t\tText(\"Product quarter\")\n\t\t\t\t.font(.title2).bold()\n\n\t\t\tTable(sales) {\n\t\t\t\tTableColumn(\"Product\", value: \\.product)\n\t\t\t\t\t.alignment(.leading)\n\t\t\t\tTableColumn(\"Quarter 1\") { product in\n\t\t\t\t\tText(product.q1s)\n\t\t\t\t}\n\t\t\t\t.width(75)\n\t\t\t\t.alignment(.trailing)\n\t\t\t\tTableColumn(\"Quarter 2\") { product in\n\t\t\t\t\tText(product.q2s)\n\t\t\t\t}\n\t\t\t\t.width(75)\n\t\t\t\t.alignment(.trailing)\n\t\t\t\tTableColumn(\"Quarter 3\") { product in\n\t\t\t\t\tText(product.q3s)\n\t\t\t\t}\n\t\t\t\t.width(75)\n\t\t\t\t.alignment(.trailing)\n\t\t\t\tTableColumn(\"Quarter 4\") { product in\n\t\t\t\t\tText(product.q4s)\n\t\t\t\t}\n\t\t\t\t.width(75)\n\t\t\t\t.alignment(.trailing)\n\t\t\t\tTableColumn(\"win-loss\") { product in\n\t\t\t\t\tDSFSparklineWinLossGraphView.SwiftUI(\n\t\t\t\t\t\tdataSource: .init(values: product.wl)\n\t\t\t\t\t)\n\t\t\t\t\t.frame(height: 25)\n\t\t\t\t\t.frame(minWidth: 150)\n\t\t\t\t}\n\t\t\t\t.width(150)\n\t\t\t\t.alignment(.center)\n\t\t\t}\n\t\t\t.frame(height: 250)\n\t\t}\n\t\t.padding()\n\t}\n}\n\nvar WinLossDataSource1: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 10, range: -1.0 ... 1)\n\td.push(values: [1, -1, 0, 1, -1, -1, 1, -1, 0, 1])\n\treturn d\n}()\n\nvar WinLossDataSource2: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 10, range: -1.0 ... 1.0)\n\td.push(values: [20, 10, 0, -10, -20, -30, 40, 50, 0, 70])\n\treturn d\n}()\n\nvar WinLossDataSource3: DSFSparkline.DataSource = {\n\tlet d = DSFSparkline.DataSource(windowSize: 20, range: -1 ... 1)\n\td.push(values: [1, 1, 1, -1, 1, 0, -1, -1, 1, 1, 1, -1, -1, 1, 1, 0, -1, 1, 1, 1])\n\treturn d\n}()\n\nstruct WinLossGraphContentView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tWinLossGraphContentView(leftDataSource: WinLossDataSource1,\n\t\t\t\t\t\t\t\t\t\trightDataSource: WinLossDataSource2,\n\t\t\t\t\t\t\t\t\t\tupDataSource: WinLossDataSource3)\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/Shared/WiperGaugeDemoView.swift",
    "content": "//\n//  PieGraphDemoView.swift\n//  Demos\n//\n//  Created by Darren Ford on 16/2/21.\n//\n\nimport SwiftUI\nimport DSFSparkline\n\nfileprivate let palette1 = DSFSparkline.Palette([.systemRed, .systemOrange, .systemYellow])\nfileprivate let palette2 = DSFSparkline.Palette.shared\nfileprivate let grays = DSFSparkline.Palette([.systemGreen, .systemRed])\n\nfileprivate let coldHot = DSFSparkline.GradientBucket(posts: [\n\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 0, green: 0, blue: 1, alpha: 1), location: 0),\n\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 0, green: 0, blue: 1, alpha: 1), location: 0.3),\n\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 0.581, blue: 0, alpha: 1), location: 0.6),\n\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 0, blue: 0, alpha: 1), location: 0.8),\n\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 0, blue: 0, alpha: 1), location: 1)\n])\n\nstruct WiperGraphDemoView: View {\n\t@State var randomValue: CGFloat = CGFloat.random(in: 0...1)\n\n\t@State var sliderValue: CGFloat = 0.75\n\n\t@State var animationDuration: Double = 0.5\n\n\tvar body: some View {\n\t\tScrollView {\n\t\t\tVStack(spacing: 8) {\n\t\t\t\tText(\"Palette colors\").font(.title2).bold()\n\t\t\t\tHStack(spacing: 8) {\n\t\t\t\t\tForEach(0 ..< 7) {\n\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(valueColor: DSFSparkline.ValueBasedFill(palette: palette2), value: Double($0) / 7.0 + 0.1)\n\t\t\t\t\t\t\t.frame(width: 48, height: 24)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDivider()\n\n\t\t\t\tText(\"Solid colors\").font(.title2).bold()\n\t\t\t\tHStack(spacing: 8) {\n\t\t\t\t\tForEach(0 ..< 6) {\n\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(\n\t\t\t\t\t\t\tvalueColor: DSFSparkline.ValueBasedFill(flatColor: CGColor(srgbRed: 0.1, green: 0.4, blue: 1.0, alpha: 1)),\n\t\t\t\t\t\t\tvalue: Double($0) / 6.0 + 0.1\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 48, height: 24)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDivider()\n\n\t\t\t\tVStack {\n\t\t\t\t\tText(\"Palette colors (discrete)\").font(.title2).bold()\n\t\t\t\t\tHStack {\n\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(valueColor: DSFSparkline.ValueBasedFill(palette: palette2), value: randomValue)\n\t\t\t\t\t\t\t\t.frame(width: 64, height: 32)\n\t\t\t\t\t\t\tText(\"default\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(\n\t\t\t\t\t\t\t\tvalueColor: DSFSparkline.ValueBasedFill(palette: palette2),\n\t\t\t\t\t\t\t\tvalue: randomValue,\n\t\t\t\t\t\t\t\tanimationStyle: .init(duration: animationDuration)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.frame(width: 64, height: 32)\n\t\t\t\t\t\t\tText(\"animated\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDivider().frame(height: 60)\n\n\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\tHStack {\n\t\t\t\t\t\t\t\tButton(\"Random\") {\n\t\t\t\t\t\t\t\t\trandomValue = CGFloat.random(in: 0...1)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tButton(\"Min\") { randomValue = 0 }\n\t\t\t\t\t\t\t\tButton(\"Max\") { randomValue = 1 }\n\t\t\t\t\t\t\t\tSlider(value: $animationDuration, in: 0 ... 2)\n\t\t\t\t\t\t\t\t.frame(width: 100)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tText(\"\\(randomValue)\")\n\t\t\t\t\t\t\t\t.font(.custom(\"FontNameMono\", fixedSize: 12))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tHStack {\n\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(\n\t\t\t\t\t\t\t\tvalueColor: DSFSparkline.ValueBasedFill(palette: palette2),\n\t\t\t\t\t\t\t\tvalue: randomValue\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.frame(width: 128, height: 64)\n\t\t\t\t\t\t\tText(\"default\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(\n\t\t\t\t\t\t\t\tvalueColor: DSFSparkline.ValueBasedFill(palette: palette2),\n\t\t\t\t\t\t\t\tvalue: randomValue,\n\t\t\t\t\t\t\t\tanimationStyle: .init(duration: animationDuration)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.frame(width: 128, height: 64)\n\t\t\t\t\t\t\tText(\"animated\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tDivider()\n\t\t\t\t\tVStack {\n\t\t\t\t\t\tText(\"Value color types\").font(.title2).bold()\n\t\t\t\t\t\tHStack {\n\t\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(valueColor: DSFSparkline.ValueBasedFill(flatColor: CGColor(srgbRed: 0.1, green: 0.4, blue: 0.8, alpha: 1)), value: sliderValue)\n\t\t\t\t\t\t\t\t\t.frame(width: 200, height: 100)\n\t\t\t\t\t\t\t\tText(\"Solid color\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(valueColor: DSFSparkline.ValueBasedFill(gradient: coldHot), value: sliderValue)\n\t\t\t\t\t\t\t\t\t.frame(width: 200, height: 100)\n\t\t\t\t\t\t\t\tText(\"Smooth gradient\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tVStack {\n\t\t\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(valueColor: DSFSparkline.ValueBasedFill.sharedPalette, value: sliderValue)\n\t\t\t\t\t\t\t\t\t.frame(width: 200, height: 100)\n\t\t\t\t\t\t\t\tText(\"Bucket Color\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tSlider(value: $sliderValue)\n\t\t\t\t\t\t\t.frame(width: 200)\n\t\t\t\t\t}\n\t\t\t\t\tDivider()\n\t\t\t\t\tVStack {\n\t\t\t\t\t\tText(\"Color components\").font(.title2).bold()\n\t\t\t\t\t\tDSFSparklineWiperGaugeGraphView.SwiftUI(\n\t\t\t\t\t\t\tvalueColor: DSFColor(red: 0.1, green: 0.4, blue: 0.8, alpha: 1),\n\t\t\t\t\t\t\tvalue: sliderValue,\n\t\t\t\t\t\t\tvalueBackgroundColor: DSFColor.red,\n\t\t\t\t\t\t\tupperArcColor: DSFColor.yellow,\n\t\t\t\t\t\t\tpointerColor: DSFColor.green, \n\t\t\t\t\t\t\tbackgroundColor: DSFColor.purple\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 200, height: 100)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct WiperGraphDemoView_Previews: PreviewProvider {\n\tstatic var previews: some View {\n\t\tWiperGraphDemoView()\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/macOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/SwiftUI Sparkline Crossplatform/macOS/macOS.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-only</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  iOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n\n\n\tfunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n\t\t// Override point for customization after application launch.\n\t\treturn true\n\t}\n\n\t// MARK: UISceneSession Lifecycle\n\n\tfunc application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {\n\t\t// Called when a new scene session is being created.\n\t\t// Use this method to select a configuration to create the new scene with.\n\t\treturn UISceneConfiguration(name: \"Default Configuration\", sessionRole: connectingSceneSession.role)\n\t}\n\n\tfunc application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {\n\t\t// Called when the user discards a scene session.\n\t\t// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.\n\t\t// Use this method to release any resources that were specific to the discarded scenes, as they will not return.\n\t}\n\n\n}\n\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"32700.99.1234\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"22684\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"iOS_Sparkline_Demo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <scrollView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"E5i-pV-9r1\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"48\" width=\"414\" height=\"810\"/>\n                                <subviews>\n                                    <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" spacing=\"8\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"a8x-rk-lDK\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"1458\"/>\n                                        <subviews>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"NSAttributedString inlinable\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"C1v-nq-25c\" userLabel=\"NSAttributedString inlinable\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LlP-da-22M\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"28.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Pie Charts\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aSZ-K4-c3f\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"57\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" distribution=\"fillEqually\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BNq-1g-xSf\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"85.5\" width=\"414\" height=\"28\"/>\n                                                <subviews>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xCX-QR-0r6\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"69\" height=\"28\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animatable\" value=\"NO\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ImA-fW-c0P\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"69\" y=\"0.0\" width=\"69\" height=\"28\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animatable\" value=\"NO\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3zb-XU-BNk\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"138\" y=\"0.0\" width=\"69\" height=\"28\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animatable\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"animationDuration\">\n                                                                <real key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animated\" value=\"YES\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"416-u3-Cvp\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"207\" y=\"0.0\" width=\"69\" height=\"28\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animatable\" value=\"NO\"/>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                <color key=\"value\" systemColor=\"labelColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Bdq-97-yue\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"276\" y=\"0.0\" width=\"69\" height=\"28\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animatable\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"strokeColor\">\n                                                                <color key=\"value\" systemColor=\"labelColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"animationDuration\">\n                                                                <real key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animated\" value=\"YES\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Jnf-ZI-QmU\">\n                                                        <rect key=\"frame\" x=\"345\" y=\"0.0\" width=\"69\" height=\"28\"/>\n                                                        <state key=\"normal\" title=\"Update\"/>\n                                                        <connections>\n                                                            <action selector=\"updateValues:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"SBb-9D-R0d\"/>\n                                                        </connections>\n                                                    </button>\n                                                </subviews>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"28\" id=\"NBC-Bb-JFZ\"/>\n                                                </constraints>\n                                            </stackView>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Line\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"L3M-Ro-ELV\" userLabel=\"Simple Line Area\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"121.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ajb-7V-VA6\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"150\" width=\"414\" height=\"50\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"50\" id=\"Hg5-cH-Cwa\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"30\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"NO\"/>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"4,4\"/>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ai9-lk-hdF\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"208\" width=\"414\" height=\"50\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"50\" id=\"CBL-yz-QVv\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"30\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"NO\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                        <real key=\"value\" value=\"6\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"NO\"/>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Line Centered\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xw4-QX-axL\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"266\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EqD-MM-1EB\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"294.5\" width=\"414\" height=\"75\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"75\" id=\"74r-FI-JvX\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemGreenColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"30\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                        <real key=\"value\" value=\"0.5\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"2,2\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                        <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"negativeColor\">\n                                                        <color key=\"value\" systemColor=\"systemPinkColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <real key=\"value\" value=\"0.5\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                        <color key=\"value\" systemColor=\"systemRedColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showHighlightRange\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"highlightRangeString\" value=\"-3,3\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"highlightColor\">\n                                                        <color key=\"value\" systemColor=\"quaternarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                        <real key=\"value\" value=\"4\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Bar\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ej2-xW-q0D\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"377.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BBW-Jd-8WN\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"406\" width=\"414\" height=\"75\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"75\" id=\"jto-Po-hxQ\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemGreenColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <integer key=\"value\" value=\"1\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"NO\"/>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Bar Centered\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ewW-in-PXp\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"489\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SXc-Lq-HWV\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"517.5\" width=\"414\" height=\"75\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"75\" id=\"g83-0t-KFe\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemTealColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <integer key=\"value\" value=\"1\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"negativeColor\">\n                                                        <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                        <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Bar Zero-line\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Q2j-hh-ltL\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"600.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" distribution=\"fillEqually\" spacing=\"12\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mAv-lQ-6fh\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"629\" width=\"414\" height=\"75\"/>\n                                                <subviews>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Rdk-zA-Xyw\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"94.5\" height=\"75\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                <color key=\"value\" systemColor=\"systemYellowColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                                <integer key=\"value\" value=\"10\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ubo-jJ-kxT\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"106.5\" y=\"0.0\" width=\"94.5\" height=\"75\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                                <integer key=\"value\" value=\"10\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NUp-L1-rCj\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"213\" y=\"0.0\" width=\"94.5\" height=\"75\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                <color key=\"value\" systemColor=\"systemRedColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                                <integer key=\"value\" value=\"10\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kP5-lN-Uhl\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"319.5\" y=\"0.0\" width=\"94.5\" height=\"75\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                <color key=\"value\" systemColor=\"systemPinkColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                                <integer key=\"value\" value=\"1\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                                <integer key=\"value\" value=\"10\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                </subviews>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"75\" id=\"bCS-VG-cVH\"/>\n                                                </constraints>\n                                            </stackView>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Dot\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6GM-cZ-7X5\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"712\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"H0Y-0a-Ipr\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"740.5\" width=\"414\" height=\"75\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"75\" id=\"htz-bI-puc\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"200\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Win/Loss\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kon-AO-vHm\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"823.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7N7-yg-gbp\" customClass=\"DSFSparklineWinLossGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"852\" width=\"414\" height=\"25\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"25\" id=\"RR3-w6-hIY\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"15\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                        <color key=\"value\" systemColor=\"separatorColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                        <real key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"centerlineColor\">\n                                                        <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"centerlineWidth\">\n                                                        <real key=\"value\" value=\"1\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"centerlineDashStyleString\" value=\"2,2\"/>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Win/Loss/Tie\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9hj-rY-a47\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"885\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ByN-ri-mCl\" customClass=\"DSFSparklineWinLossGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"913.5\" width=\"414\" height=\"45\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"45\" id=\"dj8-Mf-Qxy\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"15\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                        <color key=\"value\" systemColor=\"separatorColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                        <real key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"winColor\">\n                                                        <color key=\"value\" red=\"0.0048598507420000003\" green=\"0.096086271109999996\" blue=\"0.57499289509999996\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lossColor\">\n                                                        <color key=\"value\" red=\"0.60687201845962391\" green=\"0.010440673658578765\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"tieColor\">\n                                                        <color key=\"value\" red=\"1\" green=\"0.56650460754892473\" blue=\"0.00052769381198836118\" alpha=\"0.11864688809357542\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"centerlineColor\">\n                                                        <color key=\"value\" systemColor=\"secondaryLabelColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Tablet\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ibn-3b-VoA\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"966.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3MS-nZ-UwQ\" customClass=\"DSFSparklineTabletGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"995\" width=\"414\" height=\"25\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"25\" id=\"bm1-Ef-imf\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"15\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                        <color key=\"value\" systemColor=\"separatorColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                        <real key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <integer key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5WL-JK-xwx\" customClass=\"DSFSparklineTabletGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1028\" width=\"414\" height=\"14\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"14\" id=\"kt0-j4-gCA\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"15\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                        <color key=\"value\" systemColor=\"separatorColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                        <real key=\"value\" value=\"2\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                        <real key=\"value\" value=\"4\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                        <real key=\"value\" value=\"1\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"winColor\">\n                                                        <color key=\"value\" red=\"0.0044808890670000002\" green=\"0.030145617199999999\" blue=\"0.34826511139999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lossColor\">\n                                                        <color key=\"value\" red=\"1\" green=\"0.56650460749999998\" blue=\"0.00052769381199999999\" alpha=\"0.5\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Stackline\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6sK-mM-LcA\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1050\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PEf-dy-zeY\" customClass=\"DSFSparklineStackLineGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1078.5\" width=\"414\" height=\"35\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"35\" id=\"KCf-eA-M9U\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"50\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Stackline Centered\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4HG-Bw-fz3\" userLabel=\"Line Centered\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1121.5\" width=\"414\" height=\"20.5\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"R2J-3t-GVH\" customClass=\"DSFSparklineStackLineGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1150\" width=\"414\" height=\"35\"/>\n                                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"35\" id=\"nKQ-WS-e2v\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" red=\"0.39145434205184221\" green=\"0.55418628454208374\" blue=\"0.41031768849562661\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"10\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                        <integer key=\"value\" value=\"100\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"tertiarySystemFillColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"50\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                        <color key=\"value\" red=\"0.55418628454208374\" green=\"0.39853696759501883\" blue=\"0.45183829138689885\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" distribution=\"fillEqually\" spacing=\"16\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HWM-aY-0Ll\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1193\" width=\"414\" height=\"30\"/>\n                                                <subviews>\n                                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Percent Bar\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4XW-hQ-ZIZ\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"199\" height=\"30\"/>\n                                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                        <nil key=\"textColor\"/>\n                                                        <nil key=\"highlightedColor\"/>\n                                                    </label>\n                                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uay-U5-adF\">\n                                                        <rect key=\"frame\" x=\"215\" y=\"0.0\" width=\"199\" height=\"30\"/>\n                                                        <state key=\"normal\" title=\"Random\"/>\n                                                        <connections>\n                                                            <action selector=\"newValuesForPercentBar:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"5dJ-eX-ZQp\"/>\n                                                        </connections>\n                                                    </button>\n                                                </subviews>\n                                            </stackView>\n                                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" spacing=\"3\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uHy-MG-wZT\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1231\" width=\"414\" height=\"111\"/>\n                                                <subviews>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nqw-rH-xBC\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"35\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"quaternarySystemFillColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"35\" id=\"vxk-or-C5K\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                <real key=\"value\" value=\"22\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.031\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"backgroundTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shouldAnimate\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"animationDuration\">\n                                                                <real key=\"value\" value=\"0.25\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                <color key=\"value\" red=\"1\" green=\"0.57810515169999999\" blue=\"0.0\" alpha=\"0.25467089348032995\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                <real key=\"value\" value=\"8\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WZi-Z5-y6X\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"38\" width=\"414\" height=\"35\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"quaternarySystemFillColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"35\" id=\"oQH-Hp-8gQ\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                <real key=\"value\" value=\"22\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.90000000000000002\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"backgroundTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shouldAnimate\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"animationDuration\">\n                                                                <real key=\"value\" value=\"0.25\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                <color key=\"value\" red=\"1\" green=\"0.57810515169999999\" blue=\"0.0\" alpha=\"0.25467089348032995\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                <real key=\"value\" value=\"8\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"abE-mZ-jtO\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"76\" width=\"414\" height=\"35\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"quaternarySystemFillColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"35\" id=\"YfZ-E6-Ecw\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                                <real key=\"value\" value=\"22\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.75\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"backgroundTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shouldAnimate\" value=\"YES\"/>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"animationDuration\">\n                                                                <real key=\"value\" value=\"0.25\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                                <color key=\"value\" red=\"1\" green=\"0.57810515169999999\" blue=\"0.0\" alpha=\"0.25467089348032995\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                                <real key=\"value\" value=\"8\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                                <color key=\"value\" systemColor=\"systemIndigoColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                </subviews>\n                                            </stackView>\n                                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" distribution=\"equalSpacing\" alignment=\"center\" spacing=\"3\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eTD-fI-rhT\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1350\" width=\"414\" height=\"50\"/>\n                                                <subviews>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8r6-jM-faW\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"40\" height=\"50\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"7Yo-Yf-6vY\"/>\n                                                            <constraint firstAttribute=\"width\" constant=\"40\" id=\"ahS-QV-rdY\"/>\n                                                        </constraints>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oHc-VK-j0C\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"96.5\" y=\"0.0\" width=\"80\" height=\"50\"/>\n                                                        <viewLayoutGuide key=\"safeArea\" id=\"DUd-bC-8rs\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"width\" constant=\"80\" id=\"6Dd-UZ-7PB\"/>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"d7M-Ek-ZXG\"/>\n                                                        </constraints>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SDJ-aR-rYs\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"232.5\" y=\"0.0\" width=\"25\" height=\"50\"/>\n                                                        <viewLayoutGuide key=\"safeArea\" id=\"Tw1-Ds-3C6\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"width\" constant=\"25\" id=\"WZh-7b-Oag\"/>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"mVJ-fg-99R\"/>\n                                                        </constraints>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AlM-wP-Yl8\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"314\" y=\"0.0\" width=\"100\" height=\"50\"/>\n                                                        <viewLayoutGuide key=\"safeArea\" id=\"9jO-Qi-MVi\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"URE-aq-9n5\"/>\n                                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"hSZ-lQ-Ldc\"/>\n                                                        </constraints>\n                                                    </view>\n                                                </subviews>\n                                                <viewLayoutGuide key=\"safeArea\" id=\"i0P-kq-jkL\"/>\n                                            </stackView>\n                                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" distribution=\"equalSpacing\" alignment=\"center\" spacing=\"3\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Dyz-uN-7bW\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"1408\" width=\"414\" height=\"50\"/>\n                                                <subviews>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9oF-Ff-1E9\" customClass=\"DSFSparklineCircularGaugeView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"40\" height=\"50\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"width\" constant=\"40\" id=\"11a-SH-7fh\"/>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"FNb-II-n65\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.23000000000000001\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kqu-Vs-JSe\" customClass=\"DSFSparklineCircularGaugeView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"96.5\" y=\"0.0\" width=\"80\" height=\"50\"/>\n                                                        <viewLayoutGuide key=\"safeArea\" id=\"ejk-H2-Ujj\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"width\" constant=\"80\" id=\"3UA-Ae-md9\"/>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"6q1-6f-xIE\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.65000000000000002\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"trackWidth\">\n                                                                <integer key=\"value\" value=\"20\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                <integer key=\"value\" value=\"10\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iel-sI-0z2\" customClass=\"DSFSparklineCircularGaugeView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"232.5\" y=\"0.0\" width=\"25\" height=\"50\"/>\n                                                        <viewLayoutGuide key=\"safeArea\" id=\"PKN-ql-71V\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"T5p-7g-Na7\"/>\n                                                            <constraint firstAttribute=\"width\" constant=\"25\" id=\"aMk-Mt-UDB\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.92000000000000004\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dID-DW-6S2\" customClass=\"DSFSparklineCircularGaugeView\" customModule=\"DSFSparkline\">\n                                                        <rect key=\"frame\" x=\"314\" y=\"0.0\" width=\"100\" height=\"50\"/>\n                                                        <viewLayoutGuide key=\"safeArea\" id=\"hqe-tN-qfO\"/>\n                                                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                                        <constraints>\n                                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"WaJ-37-zrY\"/>\n                                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"mhu-bx-pjT\"/>\n                                                        </constraints>\n                                                        <userDefinedRuntimeAttributes>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                                <real key=\"value\" value=\"0.40000000000000002\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"trackWidth\">\n                                                                <integer key=\"value\" value=\"20\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                <integer key=\"value\" value=\"5\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lineColor\">\n                                                                <color key=\"value\" systemColor=\"linkColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"trackColor\">\n                                                                <color key=\"value\" systemColor=\"systemMintColor\"/>\n                                                            </userDefinedRuntimeAttribute>\n                                                        </userDefinedRuntimeAttributes>\n                                                    </view>\n                                                </subviews>\n                                                <viewLayoutGuide key=\"safeArea\" id=\"Jaf-BR-yFK\"/>\n                                            </stackView>\n                                        </subviews>\n                                    </stackView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"a8x-rk-lDK\" firstAttribute=\"bottom\" secondItem=\"ggQ-rD-P9m\" secondAttribute=\"bottom\" id=\"05G-zc-3dI\"/>\n                                    <constraint firstItem=\"a8x-rk-lDK\" firstAttribute=\"width\" secondItem=\"BXH-SH-Ds3\" secondAttribute=\"width\" id=\"0LJ-Se-5uk\"/>\n                                    <constraint firstItem=\"a8x-rk-lDK\" firstAttribute=\"trailing\" secondItem=\"ggQ-rD-P9m\" secondAttribute=\"trailing\" id=\"6sf-w7-Bgr\"/>\n                                    <constraint firstItem=\"a8x-rk-lDK\" firstAttribute=\"leading\" secondItem=\"ggQ-rD-P9m\" secondAttribute=\"leading\" id=\"Z5g-bn-hRE\"/>\n                                    <constraint firstItem=\"a8x-rk-lDK\" firstAttribute=\"top\" secondItem=\"ggQ-rD-P9m\" secondAttribute=\"top\" id=\"dPy-36-u1U\"/>\n                                </constraints>\n                                <viewLayoutGuide key=\"contentLayoutGuide\" id=\"ggQ-rD-P9m\"/>\n                                <viewLayoutGuide key=\"frameLayoutGuide\" id=\"BXH-SH-Ds3\"/>\n                            </scrollView>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"6Tk-OE-BBY\" firstAttribute=\"trailing\" secondItem=\"E5i-pV-9r1\" secondAttribute=\"trailing\" id=\"1bL-rZ-n8S\"/>\n                            <constraint firstItem=\"6Tk-OE-BBY\" firstAttribute=\"bottom\" secondItem=\"E5i-pV-9r1\" secondAttribute=\"bottom\" constant=\"4\" id=\"6mv-B0-IDT\"/>\n                            <constraint firstItem=\"E5i-pV-9r1\" firstAttribute=\"top\" secondItem=\"6Tk-OE-BBY\" secondAttribute=\"top\" id=\"TDA-Rf-sNN\"/>\n                            <constraint firstItem=\"E5i-pV-9r1\" firstAttribute=\"leading\" secondItem=\"6Tk-OE-BBY\" secondAttribute=\"leading\" id=\"ggY-Q1-cvj\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"attributedStringSupportLabel\" destination=\"LlP-da-22M\" id=\"0Zy-Dq-MdL\"/>\n                        <outlet property=\"dot1\" destination=\"H0Y-0a-Ipr\" id=\"Ygl-Op-bwl\"/>\n                        <outlet property=\"percentBar1\" destination=\"nqw-rH-xBC\" id=\"QoV-Jk-scP\"/>\n                        <outlet property=\"percentBar2\" destination=\"WZi-Z5-y6X\" id=\"FNN-WE-NTT\"/>\n                        <outlet property=\"percentBar3\" destination=\"abE-mZ-jtO\" id=\"UJ8-Ck-70i\"/>\n                        <outlet property=\"pie0\" destination=\"xCX-QR-0r6\" id=\"iFR-hz-MKF\"/>\n                        <outlet property=\"pie1\" destination=\"ImA-fW-c0P\" id=\"kSm-il-8cP\"/>\n                        <outlet property=\"pie2\" destination=\"3zb-XU-BNk\" id=\"GAm-lW-nGd\"/>\n                        <outlet property=\"pie3\" destination=\"416-u3-Cvp\" id=\"yzE-Di-ABJ\"/>\n                        <outlet property=\"pie4\" destination=\"Bdq-97-yue\" id=\"2dQ-dz-lA6\"/>\n                        <outlet property=\"s1\" destination=\"Rdk-zA-Xyw\" id=\"bEp-4v-Nuu\"/>\n                        <outlet property=\"s2\" destination=\"Ubo-jJ-kxT\" id=\"fGb-GN-lUE\"/>\n                        <outlet property=\"s3\" destination=\"NUp-L1-rCj\" id=\"xk3-7g-lbw\"/>\n                        <outlet property=\"s4\" destination=\"kP5-lN-Uhl\" id=\"Kq5-ir-zf8\"/>\n                        <outlet property=\"spark1\" destination=\"ajb-7V-VA6\" id=\"7z7-Oq-gjZ\"/>\n                        <outlet property=\"spark12\" destination=\"ai9-lk-hdF\" id=\"gO8-nO-yPw\"/>\n                        <outlet property=\"spark2\" destination=\"EqD-MM-1EB\" id=\"B9W-V4-3gh\"/>\n                        <outlet property=\"spark3\" destination=\"BBW-Jd-8WN\" id=\"QS2-ZH-LJV\"/>\n                        <outlet property=\"spark4\" destination=\"SXc-Lq-HWV\" id=\"TwB-jw-Sfb\"/>\n                        <outlet property=\"stacklineGraphView\" destination=\"PEf-dy-zeY\" id=\"TRN-Zc-j7l\"/>\n                        <outlet property=\"stacklineGraphView2\" destination=\"R2J-3t-GVH\" id=\"m2K-0C-2tc\"/>\n                        <outlet property=\"tabletView1\" destination=\"3MS-nZ-UwQ\" id=\"tGc-no-TcD\"/>\n                        <outlet property=\"tabletView2\" destination=\"5WL-JK-xwx\" id=\"7gZ-6G-eJ8\"/>\n                        <outlet property=\"winLoss1\" destination=\"7N7-yg-gbp\" id=\"mYs-yM-uGA\"/>\n                        <outlet property=\"winLoss2\" destination=\"ByN-ri-mCl\" id=\"ao7-aj-LAo\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"131.8840579710145\" y=\"123.88392857142857\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"labelColor\">\n            <color white=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <systemColor name=\"linkColor\">\n            <color red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"quaternarySystemFillColor\">\n            <color red=\"0.4549019608\" green=\"0.4549019608\" blue=\"0.50196078430000002\" alpha=\"0.080000000000000002\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"secondaryLabelColor\">\n            <color red=\"0.23529411759999999\" green=\"0.23529411759999999\" blue=\"0.26274509800000001\" alpha=\"0.59999999999999998\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"separatorColor\">\n            <color red=\"0.23529411759999999\" green=\"0.23529411759999999\" blue=\"0.26274509800000001\" alpha=\"0.28999999999999998\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <systemColor name=\"systemGreenColor\">\n            <color red=\"0.20392156859999999\" green=\"0.78039215689999997\" blue=\"0.34901960780000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemIndigoColor\">\n            <color red=\"0.34509803919999998\" green=\"0.33725490200000002\" blue=\"0.83921568629999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemMintColor\">\n            <color red=\"0.0\" green=\"0.78039215689999997\" blue=\"0.74509803919999995\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemOrangeColor\">\n            <color red=\"1\" green=\"0.58431372550000005\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemPinkColor\">\n            <color red=\"1\" green=\"0.1764705882\" blue=\"0.33333333329999998\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemRedColor\">\n            <color red=\"1\" green=\"0.23137254900000001\" blue=\"0.18823529410000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemTealColor\">\n            <color red=\"0.18823529410000001\" green=\"0.69019607839999997\" blue=\"0.78039215689999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemYellowColor\">\n            <color red=\"1\" green=\"0.80000000000000004\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"tertiarySystemFillColor\">\n            <color red=\"0.46274509800000002\" green=\"0.46274509800000002\" blue=\"0.50196078430000002\" alpha=\"0.12\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>\n\t\t\t\t\t<key>UISceneStoryboardFile</key>\n\t\t\t\t\t<string>Main</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/SceneDelegate.swift",
    "content": "//\n//  SceneDelegate.swift\n//  iOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport UIKit\n\nclass SceneDelegate: UIResponder, UIWindowSceneDelegate {\n\n\tvar window: UIWindow?\n\n\n\tfunc scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n\t\t// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.\n\t\t// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.\n\t\t// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).\n\t\tguard let _ = (scene as? UIWindowScene) else { return }\n\t}\n\n\tfunc sceneDidDisconnect(_ scene: UIScene) {\n\t\t// Called as the scene is being released by the system.\n\t\t// This occurs shortly after the scene enters the background, or when its session is discarded.\n\t\t// Release any resources associated with this scene that can be re-created the next time the scene connects.\n\t\t// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).\n\t}\n\n\tfunc sceneDidBecomeActive(_ scene: UIScene) {\n\t\t// Called when the scene has moved from an inactive state to an active state.\n\t\t// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.\n\t}\n\n\tfunc sceneWillResignActive(_ scene: UIScene) {\n\t\t// Called when the scene will move from an active state to an inactive state.\n\t\t// This may occur due to temporary interruptions (ex. an incoming phone call).\n\t}\n\n\tfunc sceneWillEnterForeground(_ scene: UIScene) {\n\t\t// Called as the scene transitions from the background to the foreground.\n\t\t// Use this method to undo the changes made on entering the background.\n\t}\n\n\tfunc sceneDidEnterBackground(_ scene: UIScene) {\n\t\t// Called as the scene transitions from the foreground to the background.\n\t\t// Use this method to save data, release shared resources, and store enough scene-specific state information\n\t\t// to restore the scene back to its current state.\n\t}\n\n\n}\n\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  iOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport UIKit\n\nimport DSFSparkline\n\nclass ViewController: UIViewController {\n\t@IBOutlet var spark1: DSFSparklineLineGraphView!\n\t@IBOutlet var spark12: DSFSparklineLineGraphView!\n\tvar spark1ds = DSFSparkline.DataSource(windowSize: 50, range: -10 ... 30)\n\t@IBOutlet var spark2: DSFSparklineLineGraphView!\n\tvar spark2ds = DSFSparkline.DataSource(windowSize: 50, range: -12 ... 12)\n\t@IBOutlet var spark3: DSFSparklineBarGraphView!\n\tvar spark3ds = DSFSparkline.DataSource(windowSize: 30, range: -10 ... 10)\n\t@IBOutlet var spark4: DSFSparklineBarGraphView!\n\tvar spark4ds = DSFSparkline.DataSource(windowSize: 30, range: -10 ... 10)\n\n\t@IBOutlet var dot1: DSFSparklineDotGraphView!\n\tvar dot1ds = DSFSparkline.DataSource(windowSize: 80, range: -10 ... 10)\n\n\t@IBOutlet var s1: DSFSparklineBarGraphView!\n\tvar ds1 = DSFSparkline.DataSource(range: -10 ... 10)\n\t@IBOutlet var s2: DSFSparklineBarGraphView!\n\tvar ds2 = DSFSparkline.DataSource(range: -10 ... 10)\n\t@IBOutlet var s3: DSFSparklineBarGraphView!\n\tvar ds3 = DSFSparkline.DataSource(range: -10 ... 10)\n\t@IBOutlet var s4: DSFSparklineBarGraphView!\n\tvar ds4 = DSFSparkline.DataSource(range: -10 ... 10)\n\n\t@IBOutlet var winLoss1: DSFSparklineWinLossGraphView!\n\tvar wl1 = DSFSparkline.DataSource(range: -1 ... 1)\n\n\t@IBOutlet var winLoss2: DSFSparklineWinLossGraphView!\n\n\t@IBOutlet var tabletView1: DSFSparklineTabletGraphView!\n\t@IBOutlet var tabletView2: DSFSparklineTabletGraphView!\n\n\t@IBOutlet var stacklineGraphView: DSFSparklineStackLineGraphView!\n\tvar sl1 = DSFSparkline.DataSource(range: 0 ... 10)\n\n\t@IBOutlet var stacklineGraphView2: DSFSparklineStackLineGraphView!\n\n\t@IBOutlet var pie0: DSFSparklinePieGraphView!\n\t@IBOutlet var pie1: DSFSparklinePieGraphView!\n\t@IBOutlet var pie2: DSFSparklinePieGraphView!\n\t@IBOutlet var pie3: DSFSparklinePieGraphView!\n\t@IBOutlet var pie4: DSFSparklinePieGraphView!\n\n\n\t@IBOutlet weak var attributedStringSupportLabel: UILabel!\n\n\n\t@IBOutlet weak var percentBar1: DSFSparklinePercentBarGraphView!\n\t@IBOutlet weak var percentBar2: DSFSparklinePercentBarGraphView!\n\t@IBOutlet weak var percentBar3: DSFSparklinePercentBarGraphView!\n\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\n\t\t// Setup the inline attributed string\n\t\tself.configureAttributedString()\n\n\t\tself.spark1.dataSource = self.spark1ds\n\t\tself.spark12.dataSource = self.spark1ds\n\n\t\tself.spark2.dataSource = self.spark2ds\n\t\tself.spark2ds.zeroLineValue = 0\n\n\t\tself.spark3.dataSource = self.spark3ds\n\n\t\tself.spark4.dataSource = self.spark4ds\n\t\tself.spark4ds.zeroLineValue = -5\n\n\t\tself.dot1.dataSource = self.dot1ds\n\n\t\tself.s1.dataSource = self.ds1\n\t\tself.s2.dataSource = self.ds2\n\t\tself.s3.dataSource = self.ds3\n\t\tself.s4.dataSource = self.ds4\n\n\t\tself.winLoss1.dataSource = self.wl1\n\t\tself.winLoss2.dataSource = self.wl1\n\n\t\tself.tabletView1.dataSource = self.wl1\n\t\tself.tabletView2.dataSource = self.wl1\n\n\t\tself.sl1.zeroLineValue = 5\n\t\tself.stacklineGraphView.dataSource = self.sl1\n\t\tself.stacklineGraphView2.dataSource = self.sl1\n\n\t\tlet palette = DSFSparkline.Palette([\n\t\t\tDSFColor(red: 0.6, green: 0.6, blue: 1, alpha: 1),\n\t\t\tDSFColor(red: 0.4, green: 0.4, blue: 1, alpha: 1),\n\t\t\tDSFColor(red: 0.2, green: 0.2, blue: 1, alpha: 1),\n\t\t\tDSFColor(red: 0.0, green: 0.0, blue: 1, alpha: 1),\n\t\t])\n\n\t\tself.pie0.palette = .sharedGrays\n\t\tself.pie0.dataSource = DSFSparkline.StaticDataSource([5, 5, 5, 5, 5])\n\n\t\tself.pie1.palette = palette\n\t\tself.pie2.palette = palette\n\n\t\tself.percentBar1.animationStyle = DSFSparkline.AnimationStyle()\n\t\tself.percentBar2.animationStyle = DSFSparkline.AnimationStyle()\n\t\tself.percentBar3.animationStyle = DSFSparkline.AnimationStyle()\n\n\t\tself.updateValues(self)\n\n\t\tself.addNewValue2()\n\t}\n\n\tvar sinusoid: CGFloat = 0.00\n\n\tfunc addNewValue2() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t_ = self.spark1ds.push(value: CGFloat.random(in: self.spark1ds.range!))\n\t\t\t_ = self.spark2ds.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\n\t\t\t_ = self.spark3ds.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\n\t\t\tlet val = sin(self.sinusoid)\n\t\t\tself.sinusoid += 0.3\n\n\t\t\t_ = self.spark4ds.push(value: val * 10.0)\n\n\t\t\t_ = self.dot1ds.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\n\t\t\t_ = self.ds1.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\t\t\t_ = self.ds2.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\t\t\t_ = self.ds3.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\t\t\t_ = self.ds4.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\n\t\t\t_ = self.wl1.push(value: CGFloat(Int.random(in: -1 ... 1)))\n\n\t\t\t_ = self.sl1.push(value: CGFloat(Int.random(in: 0 ... 10)))\n\n\t\t\tself.addNewValue2()\n\t\t}\n\t}\n\n\tfunc configureAttributedString() {\n\t\tlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\n\n\t\tlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033,  0.277, 0.650, 1.000])!\n\t\tlet primaryStroke = baseColor // (gray: 0.0, alpha: 0.3))\n\t\tlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\n\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\t\tline.strokeWidth = 1\n\t\tline.primaryStrokeColor = primaryStroke\n\t\tline.primaryFill = primaryFill\n\t\tline.dataSource = source                    // Assign the datasource to the overlay\n\t\tbitmap.addOverlay(line)                     // And add the overlay to the surface.\n\n\t\tlet attr = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)!\n\t\tlet message = NSMutableAttributedString(string: \"Inlined \")\n\t\tmessage.append(attr)\n\t\tmessage.append(NSAttributedString(string: \" line graph\"))\n\n\t\tself.attributedStringSupportLabel.attributedText = message\n\t}\n\n\n\t@IBAction func updateValues(_: Any) {\n\t\tlet v1 = UInt.random(count: 4, range: 1 ... 10).map { CGFloat($0) }\n\t\tself.pie1.dataSource = DSFSparkline.StaticDataSource(v1)\n\t\tself.pie2.dataSource = DSFSparkline.StaticDataSource(v1)\n\t\tlet v2 = UInt.random(count: 4, range: 1 ... 10).map { CGFloat($0) }\n\t\tself.pie3.dataSource = DSFSparkline.StaticDataSource(v2)\n\t\tself.pie4.dataSource = DSFSparkline.StaticDataSource(v2)\n\t}\n\n\t@IBAction func newValuesForPercentBar(_ sender: Any) {\n\t\tself.percentBar1.value = CGFloat(drand48())\n\t\tself.percentBar2.value = CGFloat(drand48())\n\t\tself.percentBar3.value = CGFloat(drand48())\n\t}\n\n\n\n}\n\nextension CGFloat {\n\tstatic func random(count: UInt, range: ClosedRange<CGFloat>) -> [CGFloat] {\n\t\treturn (0 ..< count).map { _ in CGFloat.random(in: range) }\n\t}\n}\n\nextension UInt {\n\tstatic func random(count: UInt, range: ClosedRange<UInt>) -> [UInt] {\n\t\treturn (0 ..< count).map { _ in UInt.random(in: range) }\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/iOS Sparkline Demo/iOS Sparkline Demo.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.network.client</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  macOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport Cocoa\n\nimport DSFSparkline\n\n@NSApplicationMain\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n\tfunc applicationDidFinishLaunching(_ aNotification: Notification) {\n\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"22505\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"22505\"/>\n        <capability name=\"Named colors\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors introduced in macOS 10.14\" minToolsVersion=\"10.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"macOS Sparkline Demo\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"macOS Sparkline Demo\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About macOS Sparkline Demo\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide macOS Sparkline Demo\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit macOS Sparkline Demo\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"macOS Sparkline Demo Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"macOS_Sparkline_Demo\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"98r-iN-zZc\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <outlet property=\"window\" destination=\"IQv-IB-iLA\" id=\"wKG-Lv-M3O\"/>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModule=\"macOS_Sparkline_Demo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"aLR-YP-GED\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"618\" height=\"728\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <gridView xPlacement=\"leading\" yPlacement=\"center\" rowAlignment=\"none\" rowSpacing=\"11\" columnSpacing=\"20\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GBP-Ic-3tg\">\n                                <rect key=\"frame\" x=\"20\" y=\"107\" width=\"558\" height=\"601\"/>\n                                <rows>\n                                    <gridRow id=\"LWT-zz-Wli\"/>\n                                    <gridRow id=\"a9M-Aq-5EU\"/>\n                                    <gridRow id=\"aLC-sK-pHI\"/>\n                                    <gridRow id=\"rOA-HK-JHa\"/>\n                                    <gridRow id=\"mUE-ZI-8yG\"/>\n                                    <gridRow id=\"Mqg-XJ-bG5\"/>\n                                    <gridRow id=\"Urz-a5-acf\"/>\n                                    <gridRow id=\"ldh-b2-9YP\"/>\n                                    <gridRow id=\"jbP-L9-XJx\"/>\n                                    <gridRow id=\"H5O-EY-kNw\"/>\n                                    <gridRow id=\"K76-XG-Qsl\"/>\n                                    <gridRow id=\"JXA-C4-Qhm\"/>\n                                    <gridRow id=\"67c-qk-plU\"/>\n                                    <gridRow id=\"BE0-WA-Esz\"/>\n                                    <gridRow id=\"17y-ez-wQ3\"/>\n                                </rows>\n                                <columns>\n                                    <gridColumn id=\"mND-oT-fMP\"/>\n                                    <gridColumn xPlacement=\"fill\" width=\"62\" id=\"lKi-gS-TNi\"/>\n                                    <gridColumn id=\"BAq-tP-YvS\"/>\n                                </columns>\n                                <gridCells>\n                                    <gridCell row=\"LWT-zz-Wli\" column=\"mND-oT-fMP\" headOfMergedCell=\"SvU-3Q-xSO\" id=\"SvU-3Q-xSO\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"wkB-t0-cET\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"585\" width=\"37\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Label\" id=\"f6g-SZ-dX3\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"LWT-zz-Wli\" column=\"lKi-gS-TNi\" headOfMergedCell=\"SvU-3Q-xSO\" id=\"gaP-8z-0D2\"/>\n                                    <gridCell row=\"LWT-zz-Wli\" column=\"BAq-tP-YvS\" headOfMergedCell=\"SvU-3Q-xSO\" id=\"dOo-dw-e60\"/>\n                                    <gridCell row=\"a9M-Aq-5EU\" column=\"mND-oT-fMP\" id=\"uRY-xS-tms\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Br9-aV-51P\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"550\" width=\"43\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Crash\" id=\"kP2-gU-xGS\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"a9M-Aq-5EU\" column=\"lKi-gS-TNi\" id=\"Vor-4M-4U8\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A4a-lZ-xkS\">\n                                            <rect key=\"frame\" x=\"140\" y=\"550\" width=\"66\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"2,822\" id=\"F4H-Da-4TV\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"a9M-Aq-5EU\" column=\"BAq-tP-YvS\" id=\"f5q-yf-nDE\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OiD-9p-Pec\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"542\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"aoL-Bw-P6f\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"1.5\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"40\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showGridLines\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"gridLinesValuesString\" value=\"-10, -5, 0, 5, 10\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"gridLinesColor\">\n                                                    <color key=\"value\" name=\"AccentColor\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"gridLinesHidden\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"gridLinesVisible\" value=\"YES\"/>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"aLC-sK-pHI\" column=\"mND-oT-fMP\" id=\"fbP-A9-Cu9\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RSS-Et-Ewc\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"507\" width=\"65\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Crash (2)\" id=\"EoP-4H-Ynb\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" red=\"0.42787649500000002\" green=\"1\" blue=\"0.33720872619999998\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"aLC-sK-pHI\" column=\"lKi-gS-TNi\" id=\"GQX-bs-orJ\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8YD-kP-XpR\">\n                                            <rect key=\"frame\" x=\"140\" y=\"507\" width=\"66\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"2,822\" id=\"UzH-Ep-LAw\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"aLC-sK-pHI\" column=\"BAq-tP-YvS\" id=\"udP-F5-0Sd\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7rQ-DQ-1cR\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"499\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"Ybe-gn-KCp\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"linkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"0.5\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                    <color key=\"value\" name=\"tertiaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"2,2\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"negativeColor\">\n                                                    <color key=\"value\" name=\"systemOrangeColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                    <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                    <real key=\"value\" value=\"4\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"rOA-HK-JHa\" column=\"mND-oT-fMP\" id=\"e3L-YV-l2s\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rqu-Ag-2nU\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"464\" width=\"76\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Static Data\" id=\"dMM-dY-w8K\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"rOA-HK-JHa\" column=\"lKi-gS-TNi\" id=\"raf-BR-nMc\"/>\n                                    <gridCell row=\"rOA-HK-JHa\" column=\"BAq-tP-YvS\" id=\"lIF-PY-sE4\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tNT-lg-8kA\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"456\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"gsf-Ye-tOh\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"placeholderTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"2\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                    <real key=\"value\" value=\"6\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"mUE-ZI-8yG\" column=\"mND-oT-fMP\" id=\"JUi-AP-7D1\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FJq-ps-Fbl\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"421\" width=\"84\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Deprecation\" id=\"v5M-wK-vP3\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemBlueColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"mUE-ZI-8yG\" column=\"lKi-gS-TNi\" id=\"Uj1-kZ-1G2\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4v9-x6-8ah\">\n                                            <rect key=\"frame\" x=\"140\" y=\"421\" width=\"66\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"3,037\" id=\"27w-5h-CaQ\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"mUE-ZI-8yG\" column=\"BAq-tP-YvS\" id=\"Smp-Jf-JPv\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"n87-Qb-hCp\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"413\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"B8l-YI-Etj\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemBlueColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"100\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"Mqg-XJ-bG5\" column=\"mND-oT-fMP\" id=\"Hpv-lY-5Ya\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3wx-H0-7Ow\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"378\" width=\"83\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Intervention\" id=\"Xxi-QW-iJp\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemOrangeColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"Mqg-XJ-bG5\" column=\"lKi-gS-TNi\" id=\"mkn-W6-Pdk\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4nH-NK-WRY\">\n                                            <rect key=\"frame\" x=\"140\" y=\"378\" width=\"66\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"162\" id=\"11w-7T-MxN\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"Mqg-XJ-bG5\" column=\"BAq-tP-YvS\" id=\"Gd0-vA-1Yb\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BEz-6V-bx1\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"370\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"1W5-NG-iuE\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemOrangeColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"Urz-a5-acf\" column=\"mND-oT-fMP\" id=\"KTh-ec-gUg\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ied-wV-JMz\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"335\" width=\"95\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Network Error\" id=\"ljv-BH-AcY\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"Urz-a5-acf\" column=\"lKi-gS-TNi\" id=\"hgr-d2-dil\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0me-JO-0hc\">\n                                            <rect key=\"frame\" x=\"140\" y=\"335\" width=\"66\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"30,382\" id=\"buR-jG-fao\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"Urz-a5-acf\" column=\"BAq-tP-YvS\" id=\"h1q-mq-bhM\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bTX-f3-3gr\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"327\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"jjG-zN-x95\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <integer key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                    <integer key=\"value\" value=\"0\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"20\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                    <real key=\"value\" value=\"2\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"2,1\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                    <color key=\"value\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"ldh-b2-9YP\" column=\"mND-oT-fMP\" id=\"ycW-i5-37X\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0EL-U5-VUl\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"292\" width=\"126\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Transmission Error\" id=\"ZEn-qy-J3w\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemYellowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"ldh-b2-9YP\" column=\"lKi-gS-TNi\" id=\"EH2-jW-C5V\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xOP-wC-3ic\">\n                                            <rect key=\"frame\" x=\"140\" y=\"292\" width=\"66\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"11\" id=\"W0P-Gr-AOH\">\n                                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"ldh-b2-9YP\" column=\"BAq-tP-YvS\" id=\"3MP-Ub-yd0\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DpK-RA-KO6\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"284\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"8EG-Wx-EQV\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemYellowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"40\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"jbP-L9-XJx\" column=\"mND-oT-fMP\" id=\"Bh6-7L-opA\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6bF-fI-UTe\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"249\" width=\"112\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Packet Rejection\" id=\"iAV-45-pDZ\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemIndigoColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"jbP-L9-XJx\" column=\"lKi-gS-TNi\" id=\"5vM-G3-i4C\"/>\n                                    <gridCell row=\"jbP-L9-XJx\" column=\"BAq-tP-YvS\" id=\"M0M-de-hKM\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"py7-t6-7BU\" customClass=\"DSFSparklineWinLossGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"241\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"DNH-g1-HFa\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemYellowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                    <color key=\"value\" name=\"separatorColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"-\"/>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"H5O-EY-kNw\" column=\"mND-oT-fMP\" id=\"NCf-hd-cVW\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xpk-48-kFy\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"206\" width=\"81\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Throughput\" id=\"Waa-6g-5xP\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"linkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"H5O-EY-kNw\" column=\"lKi-gS-TNi\" id=\"dGm-a2-bim\"/>\n                                    <gridCell row=\"H5O-EY-kNw\" column=\"BAq-tP-YvS\" id=\"4QV-Du-MVb\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Q4u-Fj-eiP\" customClass=\"DSFSparklineStackLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"198\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"ATZ-jw-nM7\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"linkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"15\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                    <real key=\"value\" value=\"2\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showHighlightRange\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"highlightColor\">\n                                                    <color key=\"value\" name=\"selectedControlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"highlightRangeString\" value=\"3,7\"/>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"K76-XG-Qsl\" column=\"mND-oT-fMP\" id=\"ncE-AV-s8y\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gjW-nV-VPb\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"164\" width=\"69\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Total Loss\" id=\"Scb-jz-QgE\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"systemBrownColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"K76-XG-Qsl\" column=\"lKi-gS-TNi\" id=\"JrP-5T-sFF\"/>\n                                    <gridCell row=\"K76-XG-Qsl\" column=\"BAq-tP-YvS\" id=\"6kx-eg-5oh\">\n                                        <stackView key=\"contentView\" distribution=\"fillEqually\" orientation=\"horizontal\" alignment=\"centerY\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lcb-gV-qL0\">\n                                            <rect key=\"frame\" x=\"224\" y=\"157\" width=\"334\" height=\"30\"/>\n                                            <subviews>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zlJ-ct-id6\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"163\" height=\"30\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"30\" id=\"8vN-tq-EPf\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                            <real key=\"value\" value=\"18\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                            <color key=\"value\" name=\"systemBrownColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                            <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                            <color key=\"value\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                            <real key=\"value\" value=\"0.12\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                            <color key=\"value\" red=\"0.57874745130000005\" green=\"0.32151988149999999\" blue=\"0.0\" alpha=\"0.27824719424175126\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c5M-fi-374\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"171\" y=\"0.0\" width=\"163\" height=\"30\"/>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"fontName\" value=\"Menlo Bold\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"fontSize\">\n                                                            <real key=\"value\" value=\"18\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                            <color key=\"value\" name=\"systemBrownColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                            <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                            <color key=\"value\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                            <real key=\"value\" value=\"0.80000000000000004\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                            <color key=\"value\" red=\"0.57874745130000005\" green=\"0.32151988149999999\" blue=\"0.0\" alpha=\"0.27824719424175126\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"c5M-fi-374\" firstAttribute=\"height\" secondItem=\"zlJ-ct-id6\" secondAttribute=\"height\" id=\"IoF-xS-efq\"/>\n                                            </constraints>\n                                            <visibilityPriorities>\n                                                <integer value=\"1000\"/>\n                                                <integer value=\"1000\"/>\n                                            </visibilityPriorities>\n                                            <customSpacing>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                            </customSpacing>\n                                        </stackView>\n                                    </gridCell>\n                                    <gridCell row=\"JXA-C4-Qhm\" column=\"mND-oT-fMP\" id=\"rtY-KS-thC\">\n                                        <box key=\"contentView\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"izb-56-HRE\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"143\" width=\"122\" height=\"5\"/>\n                                        </box>\n                                    </gridCell>\n                                    <gridCell row=\"JXA-C4-Qhm\" column=\"lKi-gS-TNi\" id=\"TeL-Xr-c4a\">\n                                        <box key=\"contentView\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rad-Vr-B53\">\n                                            <rect key=\"frame\" x=\"142\" y=\"143\" width=\"62\" height=\"5\"/>\n                                        </box>\n                                    </gridCell>\n                                    <gridCell row=\"JXA-C4-Qhm\" column=\"BAq-tP-YvS\" id=\"O1U-Bj-YCH\">\n                                        <box key=\"contentView\" horizontalHuggingPriority=\"100\" verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LVs-rq-aL8\">\n                                            <rect key=\"frame\" x=\"224\" y=\"143\" width=\"334\" height=\"5\"/>\n                                        </box>\n                                    </gridCell>\n                                    <gridCell row=\"67c-qk-plU\" column=\"mND-oT-fMP\" id=\"UJ0-bn-zJc\">\n                                        <textField key=\"contentView\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rFv-8C-Wch\">\n                                            <rect key=\"frame\" x=\"-2\" y=\"102\" width=\"77\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"CPU Levels\" id=\"64t-9u-f4Y\">\n                                                <font key=\"font\" metaFont=\"systemBold\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </gridCell>\n                                    <gridCell row=\"67c-qk-plU\" column=\"lKi-gS-TNi\" id=\"zc7-0Z-b5C\"/>\n                                    <gridCell row=\"67c-qk-plU\" column=\"BAq-tP-YvS\" id=\"OBT-aJ-5Wz\">\n                                        <stackView key=\"contentView\" distribution=\"fillEqually\" orientation=\"horizontal\" alignment=\"top\" spacing=\"4\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"w5N-2a-bX8\">\n                                            <rect key=\"frame\" x=\"224\" y=\"86\" width=\"216\" height=\"48\"/>\n                                            <subviews>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cr4-vs-J7q\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"40\" height=\"48\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"48\" id=\"Ci6-pO-roZ\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"40\" id=\"yjr-gX-XK9\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                            <color key=\"value\" red=\"1\" green=\"0.49327188729999999\" blue=\"0.47399842739999998\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                            <integer key=\"value\" value=\"8\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                            <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"1.5,1.5\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                            <real key=\"value\" value=\"1.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zib-x5-HMi\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"44\" y=\"0.0\" width=\"40\" height=\"48\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"40\" id=\"Kaf-Qz-BTZ\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"48\" id=\"Wbs-tD-J64\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                            <color key=\"value\" red=\"0.83216959239999999\" green=\"0.98548370600000001\" blue=\"0.47333085539999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                            <integer key=\"value\" value=\"8\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                            <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"1.5,1.5\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                            <real key=\"value\" value=\"1.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ff8-fX-wcp\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"88\" y=\"0.0\" width=\"40\" height=\"48\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"48\" id=\"HZT-bV-MIL\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"40\" id=\"uUp-PR-2Ys\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                            <color key=\"value\" red=\"0.45138680930000002\" green=\"0.99309605359999997\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                            <integer key=\"value\" value=\"8\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                            <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"1.5,1.5\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                            <real key=\"value\" value=\"1.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1oc-TP-XvY\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"132\" y=\"0.0\" width=\"40\" height=\"48\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"48\" id=\"Gny-nF-gx7\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"40\" id=\"mx6-f2-tY0\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                            <color key=\"value\" red=\"0.47684186699999997\" green=\"0.50480759139999998\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                            <integer key=\"value\" value=\"8\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                            <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"1.5,1.5\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                            <real key=\"value\" value=\"1.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RvH-VG-IqQ\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"176\" y=\"0.0\" width=\"40\" height=\"48\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"40\" id=\"ixh-ET-CqP\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"48\" id=\"tnR-9D-NkL\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                            <color key=\"value\" red=\"1\" green=\"0.5409764051\" blue=\"0.84731429820000004\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                            <integer key=\"value\" value=\"8\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                            <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"1.5,1.5\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                            <real key=\"value\" value=\"1.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                            </subviews>\n                                            <visibilityPriorities>\n                                                <integer value=\"1000\"/>\n                                                <integer value=\"1000\"/>\n                                                <integer value=\"1000\"/>\n                                                <integer value=\"1000\"/>\n                                                <integer value=\"1000\"/>\n                                            </visibilityPriorities>\n                                            <customSpacing>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                                <real value=\"3.4028234663852886e+38\"/>\n                                            </customSpacing>\n                                        </stackView>\n                                    </gridCell>\n                                    <gridCell row=\"BE0-WA-Esz\" column=\"mND-oT-fMP\" id=\"4cs-G9-hnb\"/>\n                                    <gridCell row=\"BE0-WA-Esz\" column=\"lKi-gS-TNi\" id=\"OdA-8y-x7P\"/>\n                                    <gridCell row=\"BE0-WA-Esz\" column=\"BAq-tP-YvS\" id=\"G3t-xd-11p\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AVo-hu-76v\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"43\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"ifW-Lb-JMn\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                    <integer key=\"value\" value=\"10\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                    <color key=\"value\" name=\"separatorColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"70\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                    <gridCell row=\"17y-ez-wQ3\" column=\"mND-oT-fMP\" id=\"YWV-6O-NxH\"/>\n                                    <gridCell row=\"17y-ez-wQ3\" column=\"lKi-gS-TNi\" id=\"lod-vY-vX8\"/>\n                                    <gridCell row=\"17y-ez-wQ3\" column=\"BAq-tP-YvS\" id=\"lPs-p4-TB6\">\n                                        <customView key=\"contentView\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZVQ-x6-UGu\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"224\" y=\"0.0\" width=\"334\" height=\"32\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"32\" id=\"5m2-fH-yfx\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemBlueColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                    <integer key=\"value\" value=\"10\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                    <color key=\"value\" name=\"separatorColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"upsideDown\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"70\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </gridCell>\n                                </gridCells>\n                            </gridView>\n                            <scrollView verticalHuggingPriority=\"50\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZDr-oU-WDb\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"578\" height=\"79\"/>\n                                <clipView key=\"contentView\" id=\"MSZ-hg-s8h\">\n                                    <rect key=\"frame\" x=\"1\" y=\"1\" width=\"576\" height=\"77\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <stackView distribution=\"fill\" orientation=\"vertical\" alignment=\"leading\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NBb-Xu-3pN\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"576\" height=\"0.0\"/>\n                                        </stackView>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"NBb-Xu-3pN\" firstAttribute=\"leading\" secondItem=\"MSZ-hg-s8h\" secondAttribute=\"leading\" id=\"WBT-9f-Vyg\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"NBb-Xu-3pN\" secondAttribute=\"bottom\" id=\"e4Z-Gv-nj6\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"NBb-Xu-3pN\" secondAttribute=\"trailing\" id=\"j0Y-Ec-Xe0\"/>\n                                    </constraints>\n                                    <userDefinedRuntimeAttributes>\n                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"flipped\" value=\"YES\"/>\n                                    </userDefinedRuntimeAttributes>\n                                </clipView>\n                                <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"89g-wv-akM\">\n                                    <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"442\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"w9m-P5-17V\">\n                                    <rect key=\"frame\" x=\"424\" y=\"1\" width=\"15\" height=\"268\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"flipped\" value=\"YES\"/>\n                                </userDefinedRuntimeAttributes>\n                            </scrollView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"GBP-Ic-3tg\" firstAttribute=\"top\" secondItem=\"aLR-YP-GED\" secondAttribute=\"top\" constant=\"20\" id=\"5it-kd-m2W\"/>\n                            <constraint firstItem=\"ZDr-oU-WDb\" firstAttribute=\"leading\" secondItem=\"aLR-YP-GED\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"E1z-B7-oFI\"/>\n                            <constraint firstItem=\"ZDr-oU-WDb\" firstAttribute=\"top\" secondItem=\"GBP-Ic-3tg\" secondAttribute=\"bottom\" constant=\"8\" id=\"SyK-Q3-VwF\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"ZDr-oU-WDb\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"aD3-Jk-D5n\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"GBP-Ic-3tg\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"f4c-7O-shj\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ZDr-oU-WDb\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"fHW-6B-yDT\"/>\n                            <constraint firstItem=\"GBP-Ic-3tg\" firstAttribute=\"leading\" secondItem=\"aLR-YP-GED\" secondAttribute=\"leading\" constant=\"20\" id=\"foW-UX-sET\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"attributedStringTextField\" destination=\"wkB-t0-cET\" id=\"hDA-8x-0EA\"/>\n                        <outlet property=\"cpu2DotView\" destination=\"ZVQ-x6-UGu\" id=\"ObD-kh-yay\"/>\n                        <outlet property=\"cpuDotView\" destination=\"AVo-hu-76v\" id=\"CA3-Ol-PXm\"/>\n                        <outlet property=\"cpuStack\" destination=\"NBb-Xu-3pN\" id=\"mC8-ek-u5F\"/>\n                        <outlet property=\"fakeSparkCpu1\" destination=\"cr4-vs-J7q\" id=\"IIc-C2-H2g\"/>\n                        <outlet property=\"fakeSparkCpu2\" destination=\"Zib-x5-HMi\" id=\"ci1-wN-zN7\"/>\n                        <outlet property=\"fakeSparkCpu3\" destination=\"Ff8-fX-wcp\" id=\"HwU-hy-Xh8\"/>\n                        <outlet property=\"fakeSparkCpu4\" destination=\"1oc-TP-XvY\" id=\"lNF-Ye-VYT\"/>\n                        <outlet property=\"fakeSparkCpu5\" destination=\"RvH-VG-IqQ\" id=\"Boa-cK-m6J\"/>\n                        <outlet property=\"sparkCrash\" destination=\"OiD-9p-Pec\" id=\"Ueb-QC-dK6\"/>\n                        <outlet property=\"sparkCrash2\" destination=\"7rQ-DQ-1cR\" id=\"DwK-vp-T2v\"/>\n                        <outlet property=\"sparkDeprecation\" destination=\"n87-Qb-hCp\" id=\"Hm1-Tz-bOg\"/>\n                        <outlet property=\"sparkIntervention\" destination=\"BEz-6V-bx1\" id=\"qIh-LU-aNB\"/>\n                        <outlet property=\"sparkNetworkError\" destination=\"bTX-f3-3gr\" id=\"X7E-QQ-J8W\"/>\n                        <outlet property=\"sparkPacketRejection\" destination=\"py7-t6-7BU\" id=\"MYo-Eh-ayp\"/>\n                        <outlet property=\"sparkStaticData\" destination=\"tNT-lg-8kA\" id=\"qhT-8D-Kbe\"/>\n                        <outlet property=\"sparkTransmissionError\" destination=\"DpK-RA-KO6\" id=\"hXS-ZK-NLh\"/>\n                        <outlet property=\"stackLineView\" destination=\"Q4u-Fj-eiP\" id=\"AYb-Hn-doN\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"90.5\" y=\"947.5\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <namedColor name=\"AccentColor\">\n            <color red=\"0.0\" green=\"0.46000000000000002\" blue=\"0.89000000000000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </namedColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSSupportsAutomaticTermination</key>\n\t<true/>\n\t<key>NSSupportsSuddenTermination</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  macOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport Cocoa\n\nimport DSFSparkline\n\nclass ViewController: NSViewController {\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\n\t\t// Do any additional setup after loading the view.\n\t}\n\n\toverride var representedObject: Any? {\n\t\tdidSet {\n\t\t// Update the view, if already loaded.\n\t\t}\n\t}\n\n\n\t@IBOutlet weak var sparkCrash: DSFSparklineDataSourceView!\n\tvar sparkCrashDatasource = DSFSparkline.DataSource(range: -10 ... 10)\n\n\t@IBOutlet weak var sparkCrash2: DSFSparklineDataSourceView!\n\tvar sparkCrash2Datasource = DSFSparkline.DataSource(range: -13 ... 13)\n\n\t@IBOutlet weak var sparkDeprecation: DSFSparklineDataSourceView!\n\tvar sparkDeprecationDatasource = DSFSparkline.DataSource(range: -10 ... 10)\n\n\t@IBOutlet weak var sparkIntervention: DSFSparklineDataSourceView!\n\tvar sparkInterventionDatasource = DSFSparkline.DataSource()\n\n\t@IBOutlet weak var sparkNetworkError: DSFSparklineDataSourceView!\n\tvar sparkNetworkErrorDatasource = DSFSparkline.DataSource(range: -10 ... 30)\n\n\t@IBOutlet weak var sparkTransmissionError: DSFSparklineDataSourceView!\n\tvar sparkTransmissionErrorDatasource = DSFSparkline.DataSource(range: 0 ... 1)\n\n\t@IBOutlet weak var sparkPacketRejection: DSFSparklineWinLossGraphView!\n\tvar sparkPacketRejectionDatasource = DSFSparkline.DataSource(windowSize: 10, range: -1 ... 1)\n\n\t@IBOutlet weak var stackLineView: DSFSparklineStackLineGraphView!\n\tvar stackLineViewDatasource = DSFSparkline.DataSource(range: 0 ... 10)\n\n\n\n\t@IBOutlet weak var fakeSparkCpu1: DSFSparklineDataSourceView!\n\tvar fakeSparkCpu1Datasource = DSFSparkline.DataSource(range: 0 ... 1, zeroLineValue: 0.8)\n\t@IBOutlet weak var fakeSparkCpu2: DSFSparklineDataSourceView!\n\tvar fakeSparkCpu2Datasource = DSFSparkline.DataSource(range: 0 ... 1, zeroLineValue: 0.8)\n\t@IBOutlet weak var fakeSparkCpu3: DSFSparklineDataSourceView!\n\tvar fakeSparkCpu3Datasource = DSFSparkline.DataSource(range: 0 ... 1, zeroLineValue: 0.8)\n\t@IBOutlet weak var fakeSparkCpu4: DSFSparklineDataSourceView!\n\tvar fakeSparkCpu4Datasource = DSFSparkline.DataSource(range: 0 ... 1, zeroLineValue: 0.8)\n\t@IBOutlet weak var fakeSparkCpu5: DSFSparklineDataSourceView!\n\tvar fakeSparkCpu5Datasource = DSFSparkline.DataSource(range: 0 ... 1, zeroLineValue: 0.8)\n\n\t@IBOutlet weak var sparkStaticData: DSFSparklineLineGraphView!\n\tvar sparkStaticDatasource = DSFSparkline.DataSource(range: -20 ... 50)\n\n\t@IBOutlet weak var cpuStack: NSStackView!\n\n\t@IBOutlet weak var cpuDotView: DSFSparklineDotGraphView!\n\tvar cpuDotViewDatasource = DSFSparkline.DataSource(windowSize: 100, range: 0 ... 100)\n\n\t@IBOutlet weak var cpu2DotView: DSFSparklineDotGraphView!\n\tvar cpu2DotViewDatasource = DSFSparkline.DataSource(windowSize: 100, range: 0 ... 100)\n\n\tlet cpuUsage = MyCpuUsage()\n\n\t@IBOutlet weak var attributedStringTextField: NSTextField!\n\n\toverride func viewWillAppear() {\n\t\tsuper.viewWillAppear()\n\n\t\tself.configureAttributedString()\n\n\t\tself.cpuStack.translatesAutoresizingMaskIntoConstraints = false\n\n\t\tcpuUsage.delegate = self\n\n\t\tsparkCrash.dataSource = sparkCrashDatasource\n\n\t\tsparkCrash2.dataSource = sparkCrash2Datasource\n\t\tsparkCrash2Datasource.zeroLineValue = -5\n\n\t\tsparkDeprecation.dataSource = sparkDeprecationDatasource\n\t\tsparkIntervention.dataSource = sparkInterventionDatasource\n\t\tsparkNetworkError.dataSource = sparkNetworkErrorDatasource\n\t\tsparkTransmissionError.dataSource = sparkTransmissionErrorDatasource\n\n\t\tsparkPacketRejectionDatasource.windowSize = 20\n\t\tsparkPacketRejection.dataSource = sparkPacketRejectionDatasource\n\n\t\tstackLineView.dataSource = stackLineViewDatasource\n\t\t//stackLineView.highlightRangeDefinition?.range = 3 ..< 7\n\t\tstackLineView.highlightRangeVisible = true\n\n\t\tfakeSparkCpu1.dataSource = fakeSparkCpu1Datasource\n\t\tfakeSparkCpu2.dataSource = fakeSparkCpu2Datasource\n\t\tfakeSparkCpu3.dataSource = fakeSparkCpu3Datasource\n\t\tfakeSparkCpu4.dataSource = fakeSparkCpu4Datasource\n\t\tfakeSparkCpu5.dataSource = fakeSparkCpu5Datasource\n\n\t\tcpuDotView.dataSource = cpuDotViewDatasource\n\t\tcpu2DotView.dataSource = cpu2DotViewDatasource\n\n\t\tsparkStaticData.dataSource = sparkStaticDatasource\n\t\tsparkStaticDatasource.set(values: (0 ... 10).map { _ in\n\t\t\tCGFloat.random(in: -20.0 ... 50.0)\n\t\t})\n\n\t\tself.updateWithNewValues()\n\n\t\tcpuUsage.updateInfo(Timer())\n\t}\n\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet cr = CGFloat.random(in: -10.0 ... 10.0)\n\t\t\t_ = self.sparkCrashDatasource.push(value: cr)\n\t\t\t_ = self.sparkCrash2Datasource.push(value: cr)\n\n\t\t\t_ = self.sparkDeprecationDatasource.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\t\t\t_ = self.sparkInterventionDatasource.push(value: CGFloat.random(in: -10.0 ... 10.0))\n\t\t\t_ = self.sparkNetworkErrorDatasource.push(value: CGFloat.random(in: -10.0 ... 30.0))\n\t\t\t_ = self.sparkTransmissionErrorDatasource.push(value: CGFloat.random(in: 0 ... 1))\n\n\t\t\t_ = self.sparkPacketRejectionDatasource.push(value: CGFloat(Int.random(in: -1 ... 1)))\n\n\t\t\t_ = self.stackLineViewDatasource.push(value: CGFloat(Int.random(in: 0 ... 10)))\n\n\n\t\t\t/////\n\n\t\t\t_ = self.fakeSparkCpu1Datasource.push(value: CGFloat.random(in: 0 ... 1))\n\t\t\t_ = self.fakeSparkCpu2Datasource.push(value: CGFloat.random(in: 0 ... 1))\n\t\t\t_ = self.fakeSparkCpu3Datasource.push(value: CGFloat.random(in: 0 ... 1))\n\t\t\t_ = self.fakeSparkCpu4Datasource.push(value: CGFloat.random(in: 0 ... 1))\n\t\t\t_ = self.fakeSparkCpu5Datasource.push(value: CGFloat.random(in: 0 ... 1))\n\n\t\t\t_ = self.cpuDotViewDatasource.push(value: CGFloat.random(in: 0 ... 100))\n\t\t\t_ = self.cpu2DotViewDatasource.push(value: CGFloat.random(in: 0 ... 100))\n\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n\n\tvar cpuDataSources: [DSFSparkline.DataSource] = []\n\n\tfunc configureAttributedString() {\n\t\tlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\n\n\t\tlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033,  0.277, 0.650, 1.000])!\n\t\tlet primaryStroke = baseColor // (gray: 0.0, alpha: 0.3))\n\t\tlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\n\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\t\tline.strokeWidth = 1\n\t\tline.primaryStrokeColor = primaryStroke\n\t\tline.primaryFill = primaryFill\n\t\tline.dataSource = source                    // Assign the datasource to the overlay\n\t\tbitmap.addOverlay(line)                     // And add the overlay to the surface.\n\n\t\tlet attr = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)!\n\t\tlet message = NSMutableAttributedString(string: \"Inlined \")\n\t\tmessage.append(attr)\n\t\tmessage.append(NSAttributedString(string: \" line graph\"))\n\n\t\tself.attributedStringTextField.attributedStringValue = message\n\t}\n\n}\n\n\nextension ViewController: CPUDelegate {\n\tfunc cpuUsage(usage: [Float]) {\n\t\tDispatchQueue.main.async { [weak self] in\n\t\t\tself?.updateOnMainThread(usage: usage)\n\t\t}\n\t}\n\n\tfunc updateOnMainThread(usage: [Float]) {\n\n\t\tif cpuDataSources.count == 0 {\n\t\t\tself.cpuStack.arrangedSubviews.forEach { $0.removeFromSuperview() }\n\t\t\tcpuDataSources.removeAll()\n\n\t\t\tusage.forEach { _ in\n\t\t\t\tlet cpu = DSFSparklineBarGraphView(frame: CGRect(x: 0, y: 0, width: cpuStack.frame.width, height: 32))\n\t\t\t\tlet ds = DSFSparkline.DataSource(range: 0 ... 100)\n\t\t\t\tds.windowSize = 30\n\t\t\t\tcpu.dataSource = ds\n\t\t\t\tself.cpuDataSources.append(ds)\n\n\t\t\t\tcpu.translatesAutoresizingMaskIntoConstraints = false\n\t\t\t\tcpu.addConstraint(NSLayoutConstraint(item: cpu, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 48))\n\t\t\t\tcpu.graphColor = .systemBlue\n\t\t\t\tcpu.isHidden = false\n\t\t\t\tcpu.barSpacing = 1\n\t\t\t\tself.cpuStack.addArrangedSubview(cpu)\n\n\t\t\t\tlet box = NSBox(frame: NSRect(x: 0, y: 0, width: 20, height: 1))\n\t\t\t\tbox.translatesAutoresizingMaskIntoConstraints = false\n\t\t\t\tbox.boxType = .separator\n\t\t\t\tself.cpuStack.addArrangedSubview(box)\n\t\t\t}\n\t\t}\n\n\t\tusage.enumerated().forEach { (offset, element) in\n\t\t\t_ = cpuDataSources[offset].push(value: CGFloat(element * 100.0))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/cpuUsage.swift",
    "content": "//\n//  cpuUsage.swift\n//  DSFSparklines Demo\n//\n//  Created by Darren Ford on 3/7/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n\nimport Foundation\n\n// CPU usage credit VenoMKO: https://stackoverflow.com/a/6795612/1033581\n\nprotocol CPUDelegate {\n\tfunc cpuUsage(usage: [Float])\n}\n\nclass MyCpuUsage {\n\tvar cpuInfo: processor_info_array_t!\n\tvar prevCpuInfo: processor_info_array_t?\n\tvar numCpuInfo: mach_msg_type_number_t = 0\n\tvar numPrevCpuInfo: mach_msg_type_number_t = 0\n\tvar numCPUs: uint = 0\n\tvar updateTimer: Timer!\n\tlet CPUUsageLock: NSLock = NSLock()\n\n\tinit() {\n\t\tlet mibKeys: [Int32] = [ CTL_HW, HW_NCPU ]\n\t\t// sysctl Swift usage credit Matt Gallagher: https://github.com/mattgallagher/CwlUtils/blob/master/Sources/CwlUtils/CwlSysctl.swift\n\t\tmibKeys.withUnsafeBufferPointer() { mib in\n\t\t\tvar sizeOfNumCPUs: size_t = MemoryLayout<uint>.size\n\t\t\tlet status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0)\n\t\t\tif status != 0 {\n\t\t\t\tnumCPUs = 1\n\t\t\t}\n\t\t\tupdateTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true)\n\t\t}\n\t}\n\n\tvar delegate: CPUDelegate?\n\n\t@objc func updateInfo(_ timer: Timer) {\n\t\tvar numCPUsU: natural_t = 0\n\t\tlet err: kern_return_t = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo);\n\t\tif err == KERN_SUCCESS {\n\t\t\tCPUUsageLock.lock()\n\n\t\t\tvar result = [Float]()\n\n\t\t\tfor i in 0 ..< Int32(numCPUs) {\n\t\t\t\tvar inUse: Int32\n\t\t\t\tvar total: Int32\n\t\t\t\tif let prevCpuInfo = prevCpuInfo {\n\t\t\t\t\tinUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]\n\t\t\t\t\t\t- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]\n\t\t\t\t\t\t+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]\n\t\t\t\t\t\t- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]\n\t\t\t\t\t\t+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]\n\t\t\t\t\t\t- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]\n\t\t\t\t\ttotal = inUse + (cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]\n\t\t\t\t\t\t- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)])\n\t\t\t\t} else {\n\t\t\t\t\tinUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]\n\t\t\t\t\t\t+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]\n\t\t\t\t\t\t+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]\n\t\t\t\t\ttotal = inUse + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]\n\t\t\t\t}\n\t\t\t\tresult.append(Float(inUse) / Float(total))\n\n\t\t\t\t//print(String(format: \"Core: %u Usage: %f\", i, Float(inUse) / Float(total) * 100))\n\t\t\t}\n\t\t\tCPUUsageLock.unlock()\n\n\t\t\tif let prevCpuInfo = prevCpuInfo {\n\t\t\t\t// vm_deallocate Swift usage credit rsfinn: https://stackoverflow.com/a/48630296/1033581\n\t\t\t\tlet prevCpuInfoSize: size_t = MemoryLayout<integer_t>.stride * Int(numPrevCpuInfo)\n\t\t\t\tvm_deallocate(mach_task_self_, vm_address_t(bitPattern: prevCpuInfo), vm_size_t(prevCpuInfoSize))\n\t\t\t}\n\n\t\t\tprevCpuInfo = cpuInfo\n\t\t\tnumPrevCpuInfo = numCpuInfo\n\n\t\t\tcpuInfo = nil\n\t\t\tnumCpuInfo = 0\n\n\t\t\tself.delegate?.cpuUsage(usage: result)\n\n\t\t} else {\n\t\t\tprint(\"Error!\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo/macOS_Sparkline_Demo.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-only</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  macOS Sparkline Demo Objc\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface AppDelegate : NSObject <NSApplicationDelegate>\n\n\n@end\n\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  macOS Sparkline Demo Objc\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {\n\t// Insert code here to initialize your application\n}\n\n\n- (void)applicationWillTerminate:(NSNotification *)aNotification {\n\t// Insert code here to tear down your application\n}\n\n\n@end\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"22154\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"22154\"/>\n        <capability name=\"System colors introduced in macOS 10.14\" minToolsVersion=\"10.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"macOS Sparkline Demo Objc\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"macOS Sparkline Demo Objc\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About macOS Sparkline Demo Objc\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide macOS Sparkline Demo Objc\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit macOS Sparkline Demo Objc\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"macOS Sparkline Demo Objc Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Sparkline Demo\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"98r-iN-zZc\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" misplaced=\"YES\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"500\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <box title=\"Throughput\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pA9-Os-r2C\">\n                                <rect key=\"frame\" x=\"17\" y=\"382\" width=\"446\" height=\"102\"/>\n                                <view key=\"contentView\" id=\"gof-HN-L75\">\n                                    <rect key=\"frame\" x=\"4\" y=\"5\" width=\"438\" height=\"82\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"X3f-SW-jsr\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"8\" y=\"8\" width=\"422\" height=\"66\"/>\n                                            <subviews>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CiR-MG-fWQ\" customClass=\"DSFSparklinePercentBarGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"75\" height=\"16\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"75\" id=\"L2C-rR-4Ua\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"16\" id=\"PSW-5b-40r\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"value\">\n                                                            <real key=\"value\" value=\"0.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarColor\">\n                                                            <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barColor\">\n                                                            <color key=\"value\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"barTextColor\">\n                                                            <color key=\"value\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"underBarTextColor\">\n                                                            <color key=\"value\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shouldAnimate\" value=\"NO\"/>\n                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showLabel\" value=\"NO\"/>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"leftInset\">\n                                                            <real key=\"value\" value=\"1\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"topInset\">\n                                                            <real key=\"value\" value=\"1\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"rightInset\">\n                                                            <real key=\"value\" value=\"1\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"bottomInset\">\n                                                            <real key=\"value\" value=\"1\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                            <real key=\"value\" value=\"2\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bkR-H6-ebF\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"14\" width=\"75\" height=\"48\"/>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"gaugeBackgroundColor\">\n                                                            <color key=\"value\" name=\"windowBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </customView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"CiR-MG-fWQ\" firstAttribute=\"leading\" secondItem=\"X3f-SW-jsr\" secondAttribute=\"leading\" id=\"5J6-HG-AXp\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"CiR-MG-fWQ\" secondAttribute=\"bottom\" id=\"AWX-R4-fcT\"/>\n                                                <constraint firstItem=\"bkR-H6-ebF\" firstAttribute=\"top\" secondItem=\"X3f-SW-jsr\" secondAttribute=\"top\" constant=\"4\" id=\"L11-Ad-kEm\"/>\n                                                <constraint firstItem=\"bkR-H6-ebF\" firstAttribute=\"leading\" secondItem=\"CiR-MG-fWQ\" secondAttribute=\"leading\" id=\"ajz-5I-I1d\"/>\n                                                <constraint firstItem=\"CiR-MG-fWQ\" firstAttribute=\"top\" secondItem=\"bkR-H6-ebF\" secondAttribute=\"bottom\" constant=\"-2\" id=\"cfE-qp-HaP\"/>\n                                                <constraint firstItem=\"bkR-H6-ebF\" firstAttribute=\"trailing\" secondItem=\"CiR-MG-fWQ\" secondAttribute=\"trailing\" id=\"vL3-3f-N4B\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                    <integer key=\"value\" value=\"30\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"30\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"markerSize\">\n                                                    <real key=\"value\" value=\"5\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"X3f-SW-jsr\" secondAttribute=\"trailing\" constant=\"8\" id=\"YtZ-K9-idd\"/>\n                                        <constraint firstItem=\"X3f-SW-jsr\" firstAttribute=\"leading\" secondItem=\"gof-HN-L75\" secondAttribute=\"leading\" constant=\"8\" id=\"bXQ-LG-A5s\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"X3f-SW-jsr\" secondAttribute=\"bottom\" constant=\"8\" id=\"hIa-RK-6eb\"/>\n                                        <constraint firstItem=\"X3f-SW-jsr\" firstAttribute=\"top\" secondItem=\"gof-HN-L75\" secondAttribute=\"top\" constant=\"8\" id=\"ocL-UT-0zI\"/>\n                                    </constraints>\n                                </view>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"98\" id=\"dPe-ah-XSU\"/>\n                                </constraints>\n                            </box>\n                            <box title=\"Throughput\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hNC-qx-jV7\">\n                                <rect key=\"frame\" x=\"17\" y=\"174\" width=\"446\" height=\"204\"/>\n                                <view key=\"contentView\" id=\"YWt-zc-gNz\">\n                                    <rect key=\"frame\" x=\"4\" y=\"5\" width=\"438\" height=\"184\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Vfz-XG-Zqu\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"8\" y=\"84\" width=\"422\" height=\"68\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"68\" id=\"ykB-AK-O22\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemPinkColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                    <integer key=\"value\" value=\"30\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"NO\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                        <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2Sf-rx-WZW\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"8\" y=\"8\" width=\"422\" height=\"68\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"68\" id=\"wRV-AD-ZhK\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                    <integer key=\"value\" value=\"30\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"zeroLineVisible\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                    <real key=\"value\" value=\"1\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"negativeColor\">\n                                                    <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"2Sf-rx-WZW\" firstAttribute=\"trailing\" secondItem=\"Vfz-XG-Zqu\" secondAttribute=\"trailing\" id=\"E2s-6B-jYP\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"Vfz-XG-Zqu\" secondAttribute=\"trailing\" constant=\"8\" id=\"GEJ-xl-sPy\"/>\n                                        <constraint firstItem=\"2Sf-rx-WZW\" firstAttribute=\"top\" secondItem=\"Vfz-XG-Zqu\" secondAttribute=\"bottom\" constant=\"8\" id=\"JXw-Ox-WYH\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"2Sf-rx-WZW\" secondAttribute=\"bottom\" constant=\"8\" id=\"eZL-2B-N8q\"/>\n                                        <constraint firstItem=\"Vfz-XG-Zqu\" firstAttribute=\"leading\" secondItem=\"YWt-zc-gNz\" secondAttribute=\"leading\" constant=\"8\" id=\"ke2-lp-kkr\"/>\n                                        <constraint firstItem=\"2Sf-rx-WZW\" firstAttribute=\"leading\" secondItem=\"Vfz-XG-Zqu\" secondAttribute=\"leading\" id=\"ux0-dI-hbp\"/>\n                                    </constraints>\n                                </view>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"200\" id=\"5qO-0u-nv7\"/>\n                                </constraints>\n                            </box>\n                            <box title=\"Received/Sent\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nk7-dk-fnU\">\n                                <rect key=\"frame\" x=\"18\" y=\"16\" width=\"444\" height=\"155\"/>\n                                <view key=\"contentView\" ambiguous=\"YES\" id=\"aB3-uQ-T3N\">\n                                    <rect key=\"frame\" x=\"4\" y=\"5\" width=\"436\" height=\"135\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <customView ambiguous=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Yaa-RU-TFK\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"8\" y=\"67\" width=\"420\" height=\"60\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"60\" id=\"gx4-36-Wnh\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                    <integer key=\"value\" value=\"100\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                    <color key=\"value\" name=\"separatorColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"100\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                        <customView ambiguous=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7Nz-0V-zTh\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                            <rect key=\"frame\" x=\"8\" y=\"6\" width=\"420\" height=\"60\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"60\" id=\"lMC-gV-0Bo\"/>\n                                            </constraints>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                    <color key=\"value\" name=\"systemBlueColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"windowSize\">\n                                                    <integer key=\"value\" value=\"100\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                    <color key=\"value\" name=\"separatorColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </userDefinedRuntimeAttribute>\n                                                <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"upsideDown\" value=\"YES\"/>\n                                                <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                    <integer key=\"value\" value=\"100\"/>\n                                                </userDefinedRuntimeAttribute>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"Yaa-RU-TFK\" secondAttribute=\"trailing\" constant=\"8\" id=\"38K-kZ-1lE\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"7Nz-0V-zTh\" secondAttribute=\"bottom\" constant=\"8\" id=\"Dse-xi-ok0\"/>\n                                        <constraint firstItem=\"7Nz-0V-zTh\" firstAttribute=\"top\" secondItem=\"Yaa-RU-TFK\" secondAttribute=\"bottom\" constant=\"1\" id=\"Ehr-Qy-eu9\"/>\n                                        <constraint firstItem=\"7Nz-0V-zTh\" firstAttribute=\"trailing\" secondItem=\"Yaa-RU-TFK\" secondAttribute=\"trailing\" id=\"L3v-sc-MEX\"/>\n                                        <constraint firstItem=\"7Nz-0V-zTh\" firstAttribute=\"leading\" secondItem=\"Yaa-RU-TFK\" secondAttribute=\"leading\" id=\"dnE-o4-aNe\"/>\n                                        <constraint firstItem=\"Yaa-RU-TFK\" firstAttribute=\"leading\" secondItem=\"aB3-uQ-T3N\" secondAttribute=\"leading\" constant=\"8\" id=\"icO-Lj-BWa\"/>\n                                        <constraint firstItem=\"Yaa-RU-TFK\" firstAttribute=\"top\" secondItem=\"aB3-uQ-T3N\" secondAttribute=\"top\" constant=\"8\" id=\"xN1-vh-lui\"/>\n                                    </constraints>\n                                </view>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"151\" id=\"Qsm-1Y-LUr\"/>\n                                </constraints>\n                            </box>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"hNC-qx-jV7\" firstAttribute=\"top\" secondItem=\"pA9-Os-r2C\" secondAttribute=\"bottom\" constant=\"8\" id=\"bbX-2T-BOb\"/>\n                            <constraint firstItem=\"nk7-dk-fnU\" firstAttribute=\"top\" secondItem=\"YWt-zc-gNz\" secondAttribute=\"bottom\" constant=\"8\" id=\"gbc-ng-u1l\"/>\n                            <constraint firstItem=\"hNC-qx-jV7\" firstAttribute=\"trailing\" secondItem=\"pA9-Os-r2C\" secondAttribute=\"trailing\" id=\"hQp-Po-fuR\"/>\n                            <constraint firstItem=\"nk7-dk-fnU\" firstAttribute=\"trailing\" secondItem=\"YWt-zc-gNz\" secondAttribute=\"trailing\" id=\"kXy-PE-8p7\"/>\n                            <constraint firstItem=\"pA9-Os-r2C\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" constant=\"20\" id=\"rz1-WW-1qw\"/>\n                            <constraint firstItem=\"hNC-qx-jV7\" firstAttribute=\"leading\" secondItem=\"pA9-Os-r2C\" secondAttribute=\"leading\" id=\"t6c-yu-LP3\"/>\n                            <constraint firstItem=\"nk7-dk-fnU\" firstAttribute=\"leading\" secondItem=\"YWt-zc-gNz\" secondAttribute=\"leading\" id=\"vTV-qe-uty\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"pA9-Os-r2C\" secondAttribute=\"trailing\" constant=\"20\" id=\"vcj-nf-bnw\"/>\n                            <constraint firstItem=\"pA9-Os-r2C\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" id=\"wGc-TH-1AC\"/>\n                            <constraint firstAttribute=\"bottom\" relation=\"greaterThanOrEqual\" secondItem=\"nk7-dk-fnU\" secondAttribute=\"bottom\" constant=\"20\" id=\"zEv-v6-peu\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"barGraph\" destination=\"Vfz-XG-Zqu\" id=\"Xf1-ZW-Bdo\"/>\n                        <outlet property=\"centeredBarGraph\" destination=\"2Sf-rx-WZW\" id=\"QJR-nt-v8t\"/>\n                        <outlet property=\"lineGraph\" destination=\"X3f-SW-jsr\" id=\"WgW-zU-yGA\"/>\n                        <outlet property=\"percentBarThroughput\" destination=\"CiR-MG-fWQ\" id=\"Btp-fr-9zD\"/>\n                        <outlet property=\"receiveGraph\" destination=\"Yaa-RU-TFK\" id=\"Hyh-4k-V0H\"/>\n                        <outlet property=\"sendGraph\" destination=\"7Nz-0V-zTh\" id=\"J2f-O8-wk7\"/>\n                        <outlet property=\"wiperGauge\" destination=\"bkR-H6-ebF\" id=\"pKa-uB-ZR3\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"770\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSSupportsAutomaticTermination</key>\n\t<true/>\n\t<key>NSSupportsSuddenTermination</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/ViewController.h",
    "content": "//\n//  ViewController.h\n//  macOS Sparkline Demo Objc\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface ViewController : NSViewController\n\n\n@end\n\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/ViewController.m",
    "content": "//\n//  ViewController.m\n//  macOS Sparkline Demo Objc\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\n#import \"ViewController.h\"\n\n#import <CoreGraphics/CoreGraphics.h>\n\n@import DSFSparkline;\n\n@interface ViewController ()\n\n@property (nonatomic, weak) IBOutlet DSFSparklineLineGraphView *lineGraph;\n@property (nonatomic, strong) DSFSparklineDataSource* dataSource;\n\n@property (weak) IBOutlet DSFSparklineBarGraphView* barGraph;\n@property (nonatomic, strong) DSFSparklineDataSource* barDataSource;\n\n@property (weak) IBOutlet DSFSparklineBarGraphView* centeredBarGraph;\n@property (nonatomic, strong) DSFSparklineDataSource* centeredBarDataSource;\n\n@property (weak) IBOutlet DSFSparklineDotGraphView *receiveGraph;\n@property (nonatomic, strong) DSFSparklineDataSource* receiveDataSource;\n@property (weak) IBOutlet DSFSparklineDotGraphView *sendGraph;\n@property (nonatomic, strong) DSFSparklineDataSource* sendDataSource;\n\n@property (weak) IBOutlet DSFSparklinePercentBarGraphView *percentBarThroughput;\n\n@property (weak) IBOutlet DSFSparklineWiperGaugeGraphView *wiperGauge;\n\n\n@end\n\n@implementation ViewController\n\n- (void)viewDidLoad {\n\t[super viewDidLoad];\n\n\tsrand48(time(0));\n\n\t_dataSource = [[DSFSparklineDataSource alloc] init];\n\t_barDataSource = [[DSFSparklineDataSource alloc] init];\n\t_centeredBarDataSource = [[DSFSparklineDataSource alloc] init];\n\t_receiveDataSource = [[DSFSparklineDataSource alloc] init];\n\t_sendDataSource = [[DSFSparklineDataSource alloc] init];\n\n\t[_wiperGauge setAnimationStyle:[[AnimationStyle alloc] initWithDuration:0.2 function: AnimatorFunctionTypeLinear]];\n\n\t// Add a custom marker drawing function\n\t[_lineGraph setMarkerDrawingBlock:^(CGContextRef context, NSArray<DSFSparklineOverlayLineMarker *> * markers) {\n\n\t\t// Just draw the markers for the 4 most recent values\n\t\tid ms = [markers subarrayWithRange:NSMakeRange([markers count] - 4, 4)];\n\t\tfor (DSFSparklineOverlayLineMarker* m in ms) {\n\t\t\tCGContextSetFillColorWithColor(context, NSColor.whiteColor.CGColor);\n\t\t\tCGContextSetShadowWithColor(context, CGSizeMake(1, 1), 4, NSColor.linkColor.CGColor);\n\t\t\tCGContextFillRect(context, [m rect]);\n\t\t}\n\t}];\n\n\t[[self lineGraph] setDataSource:[self dataSource]];\n\t[[self dataSource] setRangeWithLowerBound:-1.0 upperBound:1.0];\n\t[[self lineGraph] setZeroLineDashStyleString: @\"3,3\"];\n\n\t[[self barGraph] setDataSource:[self barDataSource]];\n\t[[self barDataSource] setRangeWithLowerBound:0.0 upperBound:1.0];\n\t[[self barDataSource] setZeroLineValue:0.2];\n\t[[self barDataSource] setWindowSize:30];\n\n\tCGColorRef blue = CGColorCreateGenericRGB(0, 0, 1, 0.5);\n\tid high = [[DSFSparklineHighlightRangeDefinition alloc] initWithLowerBound:0.3\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t upperBound:0.7\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  fillColor:blue];\n\t[[self barGraph] setHighlightRangeDefinition:@[high]];\n\n\t[[self centeredBarGraph] setDataSource:[self centeredBarDataSource]];\n\t[[self centeredBarDataSource] setRangeWithLowerBound:-1.0 upperBound:1.0];\n\t//[[self centeredBarDataSource] setZeroLineValue:-0.2];\n\t[[self centeredBarDataSource] setWindowSize:22];\n\n\t[[self centeredBarDataSource] setWithValues:\n\t @[@(0.0), @(0.1), @(0.2), @(0.3), @(0.4), @(0.5), @(0.6), @(0.7), @(0.8), @(0.9), @(1),\n\t\t@(0.0), @(-0.1), @(-0.2), @(-0.3), @(-0.4), @(-0.5), @(-0.6), @(-0.7), @(-0.8), @(-0.9), @(-1)]];\n\n\t[[self receiveGraph] setDataSource:[self receiveDataSource]];\n\t[[self receiveDataSource] setRangeWithLowerBound:0.0 upperBound:1.0];\n\t[[self sendGraph] setDataSource:[self sendDataSource]];\n\t[[self sendDataSource] setRangeWithLowerBound:0.0 upperBound:1.0];\n\n\tDSFSparklinePercentBarStyle* style = [[self percentBarThroughput] displayStyle];\n\t[style setBarEdgeInsets: NSEdgeInsetsMake(1, 1, 1, 1)];\n\n\t[self performUpdate];\n}\n\n- (void)performUpdate {\n\tdispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n\n\t\tCGFloat v1 = drand48();\n\t\t[[self wiperGauge] setValue:v1];\n\n\t\tBOOL result = [[self dataSource] pushWithValue: (v1 * 2) - 1];\n\t\t[[self percentBarThroughput] setValue:v1];\n\n\t\tresult = [[self barDataSource] pushWithValue: v1];\n\n//\t\tv1 = drand48();\n//\t\tresult = [[self centeredBarDataSource] pushWithValue:(v1 * 2) - 1];\n\n\n\t\tv1 = drand48();\n\t\tresult = [[self receiveDataSource] pushWithValue:v1];\n\n\t\tv1 = drand48();\n\t\tresult = [[self sendDataSource] pushWithValue:v1];\n\n\t\t[self performUpdate];\n\t});\n}\n\n- (void)setRepresentedObject:(id)representedObject {\n\t [super setRepresentedObject:representedObject];\n\n\t // Update the view, if already loaded.\n}\n\n\n@end\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/macOS_Sparkline_Demo_Objc.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-only</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/macOS Sparkline Demo Objc/main.m",
    "content": "//\n//  main.m\n//  macOS Sparkline Demo Objc\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, const char * argv[]) {\n\t@autoreleasepool {\n\t    // Setup code that might create autoreleased objects goes here.\n\t}\n\treturn NSApplicationMain(argc, argv);\n}\n"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  macOS Table Demo\n//\n//  Created by Darren Ford on 27/12/19.\n//\n\nimport Cocoa\n\n@NSApplicationMain\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n\n\n\tfunc applicationDidFinishLaunching(_ aNotification: Notification) {\n\t\t// Insert code here to initialize your application\n\t}\n\n\tfunc applicationWillTerminate(_ aNotification: Notification) {\n\t\t// Insert code here to tear down your application\n\t}\n\n\n}\n\n"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"17701\"/>\n        <capability name=\"System colors introduced in macOS 10.14\" minToolsVersion=\"10.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"macOS Table Demo\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"macOS Table Demo\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About macOS Table Demo\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide macOS Table Demo\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit macOS Table Demo\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"macOS Table Demo Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"macOS_Table_Demo\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"98r-iN-zZc\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <segue destination=\"xZb-pu-c1X\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"awD-vj-2ku\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"264\"/>\n        </scene>\n        <!--Tab View Controller-->\n        <scene sceneID=\"24O-mf-JPx\">\n            <objects>\n                <tabViewController id=\"xZb-pu-c1X\" sceneMemberID=\"viewController\">\n                    <tabViewItems>\n                        <tabViewItem id=\"dgT-bO-D74\"/>\n                        <tabViewItem id=\"FWE-dx-Lf8\"/>\n                    </tabViewItems>\n                    <tabView key=\"tabView\" type=\"noTabsNoBorder\" id=\"Etl-qo-lnX\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <font key=\"font\" metaFont=\"message\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"xZb-pu-c1X\" id=\"A2L-hg-ie3\"/>\n                        </connections>\n                    </tabView>\n                    <connections>\n                        <outlet property=\"tabView\" destination=\"Etl-qo-lnX\" id=\"Uum-aO-y4x\"/>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"tabItems\" id=\"pcc-Lp-B7N\"/>\n                        <segue destination=\"I7I-7n-kPK\" kind=\"relationship\" relationship=\"tabItems\" id=\"ARq-PO-KNv\"/>\n                    </connections>\n                </tabViewController>\n                <customObject id=\"ER6-Ni-cXV\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"668\" y=\"279\"/>\n        </scene>\n        <!--Table-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController title=\"Table\" id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModule=\"macOS_Table_Demo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" misplaced=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"575\" height=\"245\"/>\n                        <subviews>\n                            <scrollView autohidesScrollers=\"YES\" horizontalLineScroll=\"42\" horizontalPageScroll=\"10\" verticalLineScroll=\"42\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GWa-kq-M6J\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"475\" height=\"55\"/>\n                                <clipView key=\"contentView\" id=\"l94-XN-lZh\">\n                                    <rect key=\"frame\" x=\"1\" y=\"1\" width=\"473\" height=\"38\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <tableView verticalHuggingPriority=\"750\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"lastColumnOnly\" alternatingRowBackgroundColors=\"YES\" columnReordering=\"NO\" columnSelection=\"YES\" multipleSelection=\"NO\" autosaveColumns=\"NO\" rowHeight=\"40\" headerView=\"DXW-4H-9LJ\" viewBased=\"YES\" id=\"8Z2-o9-tfX\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"19\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <size key=\"intercellSpacing\" width=\"3\" height=\"2\"/>\n                                            <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"gridColor\" name=\"gridColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <tableColumns>\n                                                <tableColumn identifier=\"ident\" width=\"62\" minWidth=\"40\" maxWidth=\"1000\" id=\"9G7-AO-PbM\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" title=\"Text Cell\" id=\"DPV-QH-tpF\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView identifier=\"identifier\" id=\"xgf-ni-dIy\">\n                                                            <rect key=\"frame\" x=\"1\" y=\"1\" width=\"67\" height=\"17\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oxK-uw-bN5\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"67\" height=\"17\"/>\n                                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMinY=\"YES\"/>\n                                                                    <textFieldCell key=\"cell\" lineBreakMode=\"truncatingTail\" sendsActionOnEndEditing=\"YES\" title=\"Table View Cell\" id=\"zB1-Oa-SEW\">\n                                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </textFieldCell>\n                                                                </textField>\n                                                            </subviews>\n                                                            <connections>\n                                                                <outlet property=\"textField\" destination=\"oxK-uw-bN5\" id=\"7ht-H6-w8H\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                                <tableColumn identifier=\"ingraph\" width=\"150\" minWidth=\"150\" maxWidth=\"150\" id=\"RXE-IB-oYG\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" title=\"Text Cell\" id=\"5fy-iK-lqT\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView identifier=\"ingraph\" id=\"EfF-k3-f0g\" customClass=\"Graphico\" customModule=\"macOS_Table_Demo\" customModuleProvider=\"target\">\n                                                            <rect key=\"frame\" x=\"71\" y=\"1\" width=\"150\" height=\"17\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mJd-uu-ISW\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"150\" height=\"17\"/>\n                                                                    <userDefinedRuntimeAttributes>\n                                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                            <color key=\"value\" name=\"systemGreenColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                            <real key=\"value\" value=\"1\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"NO\"/>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                                    </userDefinedRuntimeAttributes>\n                                                                </customView>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"mJd-uu-ISW\" firstAttribute=\"leading\" secondItem=\"EfF-k3-f0g\" secondAttribute=\"leading\" id=\"Wqm-1w-ecd\"/>\n                                                                <constraint firstAttribute=\"bottom\" secondItem=\"mJd-uu-ISW\" secondAttribute=\"bottom\" id=\"i1K-6w-p7M\"/>\n                                                                <constraint firstItem=\"mJd-uu-ISW\" firstAttribute=\"top\" secondItem=\"EfF-k3-f0g\" secondAttribute=\"top\" id=\"vK2-KA-hEM\"/>\n                                                                <constraint firstAttribute=\"trailing\" secondItem=\"mJd-uu-ISW\" secondAttribute=\"trailing\" id=\"zq9-Pk-x9D\"/>\n                                                            </constraints>\n                                                            <connections>\n                                                                <outlet property=\"sparkline\" destination=\"mJd-uu-ISW\" id=\"fUb-n6-d0k\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                                <tableColumn identifier=\"outgraph\" width=\"150\" minWidth=\"150\" maxWidth=\"150\" id=\"sbV-NN-XLZ\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" title=\"Text Cell\" id=\"dCZ-v4-GWv\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView identifier=\"outgraph\" id=\"ejl-mS-lCR\" customClass=\"Graphico\" customModule=\"macOS_Table_Demo\" customModuleProvider=\"target\">\n                                                            <rect key=\"frame\" x=\"224\" y=\"1\" width=\"150\" height=\"17\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nui-jx-X69\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"150\" height=\"17\"/>\n                                                                    <userDefinedRuntimeAttributes>\n                                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                            <color key=\"value\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                                            <real key=\"value\" value=\"1\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"lineShading\" value=\"YES\"/>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"NO\"/>\n                                                                        <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                                                    </userDefinedRuntimeAttributes>\n                                                                </customView>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"nui-jx-X69\" firstAttribute=\"top\" secondItem=\"ejl-mS-lCR\" secondAttribute=\"top\" id=\"Xq3-gc-2Jh\"/>\n                                                                <constraint firstAttribute=\"bottom\" secondItem=\"nui-jx-X69\" secondAttribute=\"bottom\" id=\"ekS-Ub-IIt\"/>\n                                                                <constraint firstItem=\"nui-jx-X69\" firstAttribute=\"leading\" secondItem=\"ejl-mS-lCR\" secondAttribute=\"leading\" id=\"qzL-zm-WmY\"/>\n                                                                <constraint firstAttribute=\"trailing\" secondItem=\"nui-jx-X69\" secondAttribute=\"trailing\" id=\"sxR-Ii-3vb\"/>\n                                                            </constraints>\n                                                            <connections>\n                                                                <outlet property=\"sparkline\" destination=\"nui-jx-X69\" id=\"aEh-nu-P7V\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                                <tableColumn identifier=\"cpuGraph\" width=\"150\" minWidth=\"150\" maxWidth=\"150\" id=\"VD3-7l-12m\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" title=\"Text Cell\" id=\"i5i-3T-h8w\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView identifier=\"cpuGraph\" id=\"cTk-PE-kJz\" customClass=\"Graphicodot\" customModule=\"macOS_Table_Demo\" customModuleProvider=\"target\">\n                                                            <rect key=\"frame\" x=\"377\" y=\"1\" width=\"150\" height=\"17\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qpf-7v-LOk\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"150\" height=\"17\"/>\n                                                                    <userDefinedRuntimeAttributes>\n                                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                                            <color key=\"value\" name=\"systemPurpleColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                                            <color key=\"value\" name=\"unemphasizedSelectedContentBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                                            <integer key=\"value\" value=\"5\"/>\n                                                                        </userDefinedRuntimeAttribute>\n                                                                    </userDefinedRuntimeAttributes>\n                                                                </customView>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"qpf-7v-LOk\" firstAttribute=\"leading\" secondItem=\"cTk-PE-kJz\" secondAttribute=\"leading\" id=\"9Db-6j-X1W\"/>\n                                                                <constraint firstItem=\"qpf-7v-LOk\" firstAttribute=\"top\" secondItem=\"cTk-PE-kJz\" secondAttribute=\"top\" id=\"ItH-D7-gWh\"/>\n                                                                <constraint firstAttribute=\"trailing\" secondItem=\"qpf-7v-LOk\" secondAttribute=\"trailing\" id=\"pic-OO-M0t\"/>\n                                                                <constraint firstAttribute=\"bottom\" secondItem=\"qpf-7v-LOk\" secondAttribute=\"bottom\" id=\"uxr-V7-hYm\"/>\n                                                            </constraints>\n                                                            <connections>\n                                                                <outlet property=\"sparkline\" destination=\"qpf-7v-LOk\" id=\"38E-sa-qzX\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                                <tableColumn width=\"64\" minWidth=\"10\" maxWidth=\"3.4028234663852886e+38\" id=\"qQT-fA-yIT\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"itq-A7-YX4\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView id=\"Hgl-je-HBv\">\n                                                            <rect key=\"frame\" x=\"530\" y=\"1\" width=\"68\" height=\"17\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gPu-gk-AAY\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"68\" height=\"17\"/>\n                                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMinY=\"YES\"/>\n                                                                    <textFieldCell key=\"cell\" lineBreakMode=\"truncatingTail\" sendsActionOnEndEditing=\"YES\" id=\"DT3-7w-M3u\">\n                                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </textFieldCell>\n                                                                </textField>\n                                                            </subviews>\n                                                            <connections>\n                                                                <outlet property=\"textField\" destination=\"gPu-gk-AAY\" id=\"gcH-fn-z2p\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                            </tableColumns>\n                                            <connections>\n                                                <outlet property=\"dataSource\" destination=\"XfG-lQ-9wD\" id=\"LWL-qP-Cul\"/>\n                                                <outlet property=\"delegate\" destination=\"XfG-lQ-9wD\" id=\"2Lf-0J-MCO\"/>\n                                            </connections>\n                                        </tableView>\n                                    </subviews>\n                                </clipView>\n                                <scroller key=\"horizontalScroller\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"NX9-rQ-Aph\">\n                                    <rect key=\"frame\" x=\"1\" y=\"39\" width=\"473\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"mck-Zs-RC3\">\n                                    <rect key=\"frame\" x=\"224\" y=\"17\" width=\"15\" height=\"102\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <tableHeaderView key=\"headerView\" wantsLayer=\"YES\" id=\"DXW-4H-9LJ\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"25\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableHeaderView>\n                            </scrollView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"GWa-kq-M6J\" secondAttribute=\"trailing\" constant=\"20\" id=\"a9N-5K-Xot\"/>\n                            <constraint firstItem=\"GWa-kq-M6J\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" id=\"j82-9R-K8Z\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"GWa-kq-M6J\" secondAttribute=\"bottom\" constant=\"20\" id=\"kne-cp-Dqi\"/>\n                            <constraint firstItem=\"GWa-kq-M6J\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" constant=\"20\" id=\"oJr-mA-qMd\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"tableView\" destination=\"8Z2-o9-tfX\" id=\"bZx-7T-OFe\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1400.5\" y=\"76\"/>\n        </scene>\n        <!--Grid-->\n        <scene sceneID=\"7Kh-O6-k5I\">\n            <objects>\n                <viewController title=\"Grid\" id=\"I7I-7n-kPK\" customClass=\"GridViewController\" customModule=\"macOS_Table_Demo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6Yy-Mj-DHO\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <subviews>\n                            <scrollView horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mAg-9D-t3a\">\n                                <rect key=\"frame\" x=\"19\" y=\"20\" width=\"411\" height=\"261\"/>\n                                <clipView key=\"contentView\" ambiguous=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Onm-i6-doK\">\n                                    <rect key=\"frame\" x=\"1\" y=\"1\" width=\"394\" height=\"244\"/>\n                                    <subviews>\n                                        <gridView ambiguous=\"YES\" xPlacement=\"leading\" yPlacement=\"bottom\" rowAlignment=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zx0-2C-bnv\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"206\" height=\"102\"/>\n                                            <rows>\n                                                <gridRow id=\"Vel-ah-6Jt\"/>\n                                                <gridRow id=\"Tpm-y3-upm\"/>\n                                                <gridRow id=\"Q7Q-V3-ed7\"/>\n                                            </rows>\n                                            <columns>\n                                                <gridColumn id=\"dw9-FK-zev\"/>\n                                                <gridColumn id=\"Ugf-Xx-NxY\"/>\n                                            </columns>\n                                            <gridCells>\n                                                <gridCell row=\"Vel-ah-6Jt\" column=\"dw9-FK-zev\" id=\"vvN-Kd-uOw\"/>\n                                                <gridCell row=\"Vel-ah-6Jt\" column=\"Ugf-Xx-NxY\" id=\"cfG-hd-NMi\"/>\n                                                <gridCell row=\"Tpm-y3-upm\" column=\"dw9-FK-zev\" id=\"mrA-GD-hTg\"/>\n                                                <gridCell row=\"Tpm-y3-upm\" column=\"Ugf-Xx-NxY\" id=\"CEu-l7-B8D\"/>\n                                                <gridCell row=\"Q7Q-V3-ed7\" column=\"dw9-FK-zev\" id=\"PBa-6n-Eaz\"/>\n                                                <gridCell row=\"Q7Q-V3-ed7\" column=\"Ugf-Xx-NxY\" id=\"Eo5-ZR-bdu\"/>\n                                            </gridCells>\n                                        </gridView>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"Zx0-2C-bnv\" firstAttribute=\"leading\" secondItem=\"Onm-i6-doK\" secondAttribute=\"leading\" id=\"U72-hN-6Ee\"/>\n                                        <constraint firstItem=\"Zx0-2C-bnv\" firstAttribute=\"top\" secondItem=\"Onm-i6-doK\" secondAttribute=\"top\" constant=\"142\" id=\"gaz-KD-Efo\"/>\n                                    </constraints>\n                                </clipView>\n                                <scroller key=\"horizontalScroller\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"8sB-z0-Hib\">\n                                    <rect key=\"frame\" x=\"1\" y=\"245\" width=\"394\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"3fE-W1-fyY\">\n                                    <rect key=\"frame\" x=\"395\" y=\"1\" width=\"15\" height=\"244\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                            </scrollView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"mAg-9D-t3a\" firstAttribute=\"leading\" secondItem=\"6Yy-Mj-DHO\" secondAttribute=\"leading\" constant=\"19\" id=\"cfR-5j-tfc\"/>\n                            <constraint firstItem=\"mAg-9D-t3a\" firstAttribute=\"top\" secondItem=\"6Yy-Mj-DHO\" secondAttribute=\"top\" constant=\"19\" id=\"dog-aA-05M\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"mAg-9D-t3a\" secondAttribute=\"trailing\" constant=\"20\" id=\"w7B-wZ-5dJ\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"mAg-9D-t3a\" secondAttribute=\"bottom\" constant=\"20\" id=\"zk5-0P-l0a\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"grid\" destination=\"Zx0-2C-bnv\" id=\"hah-S2-Pkp\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"fT5-BF-2hP\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1338\" y=\"507\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/GridViewController.swift",
    "content": "//\n//  GridViewController.swift\n//  macOS Table Demo\n//\n//  Created by Darren Ford on 27/12/19.\n//\n\nimport Cocoa\n\nimport DSFSparkline\n\nclass GridViewController: NSViewController {\n\t@IBOutlet weak var grid: NSGridView!\n\n\tlet sz = 32\n\n\tvar dataSources: [[DSFSparkline.DataSource]] = []\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\t\t// Do view setup here.\n\n\t\tgrid.removeColumn(at: 0)\n\t\tgrid.removeColumn(at: 0)\n\n\t\tgrid.removeRow(at: 0)\n\t\tgrid.removeRow(at: 0)\n\t\tgrid.removeRow(at: 0)\n\n\t\t(0 ... sz).forEach { row in\n\t\t\tlet item = (0 ... sz).map { _ in\n\t\t\t\tDSFSparkline.DataSource(windowSize: 30, range: -1 ... 1)\n\t\t\t}\n\t\t\tdataSources.append(item)\n\t\t}\n\n\t\t(0 ... sz).forEach { row in\n\t\t\tlet vs = (0 ... sz).map { column -> DSFSparklineLineGraphView in\n\t\t\t\tlet i = DSFSparklineLineGraphView()\n\t\t\t\ti.zeroLineVisible = false\n\t\t\t\ti.graphColor = self.color(row: row, col: column)\n\t\t\t\ti.lineWidth = 0.5\n\t\t\t\ti.translatesAutoresizingMaskIntoConstraints = false\n\t\t\t\ti.addConstraint(NSLayoutConstraint(item: i, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 32))\n\t\t\t\ti.addConstraint(NSLayoutConstraint(item: i, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 32))\n\n\t\t\t\ti.dataSource = self.dataSources[row][column]\n\n\t\t\t\tlet ranr: [CGFloat] = RandomArray(count: 30, range: -1 ... 1)\n\t\t\t\tself.dataSources[row][column].push(values: ranr)\n\n\t\t\t\treturn i\n\t\t\t}\n\n\t\t\tself.grid.addColumn(with: vs)\n\t\t}\n\n\t\tself.updateWithNewValues()\n\t}\n\n\tprivate func lighter(_ color: NSColor) -> NSColor {\n\t\tvar h: CGFloat = 0\n\t\tvar s: CGFloat = 0\n\t\tvar b: CGFloat = 0\n\t\tvar a: CGFloat = 0\n\n\t\tlet cl = color.usingColorSpace(.genericRGB)!\n\n\t\tcl.getHue(&h, saturation: &s, brightness: &b, alpha: &a)\n\t\treturn NSColor(calibratedHue: h,\n\t\t\t\t\t\t\tsaturation: max(s + 0.3, 1.0),\n\t\t\t\t\t\t\tbrightness: max(b + 0.3, 1.0), alpha: a)\n\t}\n\n\tfunc color(row: Int, col: Int) -> NSColor {\n\n\t\t// CMYK\n\t\tlet xpos = CGFloat(col) / CGFloat(sz)\n\t\tlet ypos = CGFloat(row) / CGFloat(sz)\n\n\t\tlet c = hypot(xpos, ypos) / 1.414\n\t\tlet m = hypot(1.0 - xpos, ypos) / 1.414\n\t\tlet y = hypot(1.0 - xpos, 1.0 - ypos) / 1.414\n\t\tlet k = hypot(xpos, 1.0 - ypos) / 1.414\n\n\t\tlet color = NSColor(deviceCyan: c, magenta: m, yellow: y, black: k, alpha: 1.0)\n\t\treturn self.lighter(color)\n\t}\n\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t(0 ... self.sz).forEach { row in\n\t\t\t\t(0 ... self.sz).forEach { column in\n\t\t\t\t\t_ = self.dataSources[row][column].push(value: CGFloat.random(in: -1 ... 1))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n\n}\n\n/// Generate an array of random values for Swift value types that support random value generation\n/// - Parameters:\n///   - count: The number of random numbers to generate\n///   - range: The range of values to generate\n///\n/// Example:\n///\n/// ```swift\n/// let tenVals: [CGFloat] = RandomArray(count: 10, range: -10 ... 10)\n/// ```\n///\n/// Note that the `[CGFloat]` in the definition is required, as explicit generic function instantiation isn't supported\n/// in Swift.\nfunc RandomArray<T>(count: UInt, range: ClosedRange<T>) -> Array<T> where T: BinaryFloatingPoint, T.RawSignificand : FixedWidthInteger {\n   return (0 ..< count).map { _ in T.random(in: range) }\n}\n"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSSupportsAutomaticTermination</key>\n\t<true/>\n\t<key>NSSupportsSuddenTermination</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  macOS Table Demo\n//\n//  Created by Darren Ford on 27/12/19.\n//\n\nimport Cocoa\n\nimport DSFSparkline\n\nclass ViewController: NSViewController {\n\n\t@IBOutlet weak var tableView: NSTableView!\n\n\tlet count = 200\n\n\tvar inDataSources: [DSFSparkline.DataSource] = []\n\tvar outDataSources: [DSFSparkline.DataSource] = []\n\tvar cpuDataSources: [DSFSparkline.DataSource] = []\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\n\t\t// Do any additional setup after loading the view.\n\n\t\t(0 ..< count).forEach { _ in\n\t\t\tinDataSources.append(DSFSparkline.DataSource(windowSize: 50, range: -1.5 ... 1.5))\n\t\t\toutDataSources.append(DSFSparkline.DataSource(windowSize: 50, range: -1.5 ... 1.5))\n\n\t\t\tcpuDataSources.append(DSFSparkline.DataSource(windowSize: 100, range: 0 ... 100))\n\t\t}\n\n\t\tself.tableView.reloadData()\n\n\t\tself.updateWithNewValues()\n\t}\n\n\toverride var representedObject: Any? {\n\t\tdidSet {\n\t\t// Update the view, if already loaded.\n\t\t}\n\t}\n\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in\n\t\t\tguard let `self` = self else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tself.inDataSources.forEach {\n\t\t\t\t _ = $0.push(value: CGFloat.random(in: -1 ... 1))\n\t\t\t}\n\t\t\tself.outDataSources.forEach {\n\t\t\t\t _ = $0.push(value: CGFloat.random(in: -1 ... 1))\n\t\t\t}\n\t\t\tself.cpuDataSources.forEach {\n\t\t\t\t _ = $0.push(value: CGFloat.random(in: 0 ... 100))\n\t\t\t}\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n\n\n}\n\nclass Graphico: NSTableCellView {\n\t@IBOutlet weak var sparkline: DSFSparklineLineGraphView!\n}\n\nclass Graphicodot: NSTableCellView {\n\t@IBOutlet weak var sparkline: DSFSparklineDotGraphView!\n}\n\n\nextension ViewController: NSTableViewDataSource, NSTableViewDelegate {\n\n\tfunc numberOfRows(in tableView: NSTableView) -> Int {\n\t\treturn count\n\t}\n\n\tfunc tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {\n\t\tif tableColumn?.identifier == NSUserInterfaceItemIdentifier(\"ident\"),\n\t\t\tlet tcv = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(\"identifier\"), owner: self) as? NSTableCellView {\n\t\t\ttcv.textField?.stringValue = \"Input \\(row)\"\n\t\t\treturn tcv\n\t\t}\n\t\telse if tableColumn?.identifier == NSUserInterfaceItemIdentifier(\"ingraph\"),\n\t\t\tlet tcv = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(\"ingraph\"), owner: self) as? Graphico {\n\t\t\ttcv.sparkline.dataSource = inDataSources[row]\n\t\t\treturn tcv\n\t\t}\n\t\telse if tableColumn?.identifier == NSUserInterfaceItemIdentifier(\"outgraph\"),\n\t\t\tlet tcv = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(\"outgraph\"), owner: self) as? Graphico {\n\t\t\ttcv.sparkline.dataSource = outDataSources[row]\n\t\t\treturn tcv\n\t\t}\n\t\telse if tableColumn?.identifier == NSUserInterfaceItemIdentifier(\"cpuGraph\"),\n\t\t\tlet tcv = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(\"cpuGraph\"), owner: self) as? Graphicodot {\n\t\t\ttcv.sparkline.dataSource = cpuDataSources[row]\n\t\t\treturn tcv\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Demos/Samples/macOS Table Demo/macOS_Table_Demo.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-only</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  tvOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n\tvar window: UIWindow?\n\n\n\tfunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n\t\t// Override point for customization after application launch.\n\t\treturn true\n\t}\n\n\tfunc applicationWillResignActive(_ application: UIApplication) {\n\t\t// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n\t\t// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n\t}\n\n\tfunc applicationDidEnterBackground(_ application: UIApplication) {\n\t\t// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n\t}\n\n\tfunc applicationWillEnterForeground(_ application: UIApplication) {\n\t\t// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n\t}\n\n\tfunc applicationDidBecomeActive(_ application: UIApplication) {\n\t\t// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n\t}\n\n\n}\n\n"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json",
    "content": "{\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Middle.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Back.imagestacklayer\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json",
    "content": "{\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Middle.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Back.imagestacklayer\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json",
    "content": "{\n  \"assets\" : [\n    {\n      \"size\" : \"1280x768\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"App Icon - App Store.imagestack\",\n      \"role\" : \"primary-app-icon\"\n    },\n    {\n      \"size\" : \"400x240\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"App Icon.imagestack\",\n      \"role\" : \"primary-app-icon\"\n    },\n    {\n      \"size\" : \"2320x720\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"Top Shelf Image Wide.imageset\",\n      \"role\" : \"top-shelf-image-wide\"\n    },\n    {\n      \"size\" : \"1920x720\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"Top Shelf Image.imageset\",\n      \"role\" : \"top-shelf-image\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"tv-marketing\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv-marketing\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"tv-marketing\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv-marketing\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder.AppleTV.Storyboard\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"AppleTV\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1920\" height=\"1080\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"wu6-TO-1qx\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder.AppleTV.Storyboard\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"AppleTV\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"appleTV\" appearance=\"dark\"/>\n    <dependencies>\n        <deployment identifier=\"tvOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"tvOS_Sparkline_Demo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1920\" height=\"1080\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" spacing=\"37\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kNJ-ib-BOR\">\n                                <rect key=\"frame\" x=\"96\" y=\"60\" width=\"1728\" height=\"836\"/>\n                                <subviews>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Wc6-ho-C6a\" customClass=\"DSFSparklineBarGraphView\" customModule=\"DSFSparkline\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1728\" height=\"128\"/>\n                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"128\" id=\"WOo-Ou-TDR\"/>\n                                        </constraints>\n                                        <userDefinedRuntimeAttributes>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                <color key=\"value\" systemColor=\"systemGreenColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                <integer key=\"value\" value=\"2\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                <integer key=\"value\" value=\"4\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                <integer key=\"value\" value=\"50\"/>\n                                            </userDefinedRuntimeAttribute>\n                                        </userDefinedRuntimeAttributes>\n                                    </view>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eRm-Xm-bRw\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"165\" width=\"1728\" height=\"128\"/>\n                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"128\" id=\"Zqu-tz-rnA\"/>\n                                        </constraints>\n                                        <userDefinedRuntimeAttributes>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                <color key=\"value\" systemColor=\"systemBlueColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                <real key=\"value\" value=\"1\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                <integer key=\"value\" value=\"50\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                <real key=\"value\" value=\"3\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"3,3\"/>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showHighlightRange\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"highlightColor\">\n                                                <color key=\"value\" red=\"0.47684186699999997\" green=\"0.50480759139999998\" blue=\"1\" alpha=\"0.1570424340956704\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"highlightRangeString\" value=\"0,15\"/>\n                                        </userDefinedRuntimeAttributes>\n                                    </view>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mbq-YT-X12\" customClass=\"DSFSparklineLineGraphView\" customModule=\"DSFSparkline\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"330\" width=\"1728\" height=\"128\"/>\n                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"128\" id=\"vIt-w6-fQ2\"/>\n                                        </constraints>\n                                        <userDefinedRuntimeAttributes>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                <color key=\"value\" systemColor=\"systemPurpleColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                <real key=\"value\" value=\"1\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                <integer key=\"value\" value=\"50\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"zeroLineWidth\">\n                                                <real key=\"value\" value=\"0.5\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"zeroLineDashStyleString\" value=\"3,3\"/>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"zeroLineColor\">\n                                                <color key=\"value\" systemColor=\"secondaryLabelColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"centeredAtZeroLine\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"lowerGraphColor\">\n                                                <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                        </userDefinedRuntimeAttributes>\n                                    </view>\n                                    <stackView opaque=\"NO\" contentMode=\"scaleToFill\" horizontalCompressionResistancePriority=\"100\" distribution=\"fillEqually\" spacing=\"8\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ouI-3c-csm\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"495\" width=\"1728\" height=\"128\"/>\n                                        <subviews>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Nas-fi-tod\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"860\" height=\"128\"/>\n                                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"128\" id=\"R6s-rI-6Cn\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemYellowColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"placeholderTextColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"20\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"200\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                            <view contentMode=\"scaleToFill\" horizontalHuggingPriority=\"100\" horizontalCompressionResistancePriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eEe-RW-4pi\" customClass=\"DSFSparklineDotGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"868\" y=\"0.0\" width=\"860\" height=\"128\"/>\n                                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"128\" id=\"Q1v-w6-LYd\"/>\n                                                </constraints>\n                                                <userDefinedRuntimeAttributes>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                        <color key=\"value\" systemColor=\"systemOrangeColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"color\" keyPath=\"unsetGraphColor\">\n                                                        <color key=\"value\" systemColor=\"placeholderTextColor\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"verticalDotCount\">\n                                                        <integer key=\"value\" value=\"20\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                        <integer key=\"value\" value=\"200\"/>\n                                                    </userDefinedRuntimeAttribute>\n                                                </userDefinedRuntimeAttributes>\n                                            </view>\n                                        </subviews>\n                                    </stackView>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xDV-60-4pQ\" customClass=\"DSFSparklineWinLossGraphView\" customModule=\"DSFSparkline\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"660\" width=\"1728\" height=\"75\"/>\n                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"75\" id=\"yGI-An-zVO\"/>\n                                        </constraints>\n                                        <userDefinedRuntimeAttributes>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"graphColor\">\n                                                <color key=\"value\" systemColor=\"systemBlueColor\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"shadowed\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"interpolated\" value=\"YES\"/>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"lineWidth\">\n                                                <integer key=\"value\" value=\"2\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"graphWindowSize\">\n                                                <integer key=\"value\" value=\"50\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"barSpacing\">\n                                                <integer key=\"value\" value=\"3\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"showZeroLine\" value=\"YES\"/>\n                                        </userDefinedRuntimeAttributes>\n                                    </view>\n                                    <stackView opaque=\"NO\" contentMode=\"scaleToFill\" distribution=\"equalCentering\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zvv-Rv-bhG\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"772\" width=\"1728\" height=\"64\"/>\n                                        <subviews>\n                                            <view opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pOH-ou-7cF\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"64\" height=\"64\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"width\" constant=\"64\" id=\"aAR-b7-mVP\"/>\n                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"hLg-XF-gek\"/>\n                                                </constraints>\n                                            </view>\n                                            <view opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J2J-vy-qSp\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"832\" y=\"0.0\" width=\"64\" height=\"64\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"width\" constant=\"64\" id=\"Qch-Zz-CCe\"/>\n                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"Wg8-eM-Nol\"/>\n                                                </constraints>\n                                            </view>\n                                            <view opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ohf-JL-rMA\" customClass=\"DSFSparklinePieGraphView\" customModule=\"DSFSparkline\">\n                                                <rect key=\"frame\" x=\"1664\" y=\"0.0\" width=\"64\" height=\"64\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"64\" id=\"D5R-NI-fYR\"/>\n                                                    <constraint firstAttribute=\"width\" constant=\"64\" id=\"kGv-py-woG\"/>\n                                                </constraints>\n                                            </view>\n                                        </subviews>\n                                    </stackView>\n                                </subviews>\n                            </stackView>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"wu6-TO-1qx\"/>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"kNJ-ib-BOR\" firstAttribute=\"leading\" secondItem=\"wu6-TO-1qx\" secondAttribute=\"leading\" constant=\"16\" id=\"FYN-2a-Vy3\"/>\n                            <constraint firstItem=\"kNJ-ib-BOR\" firstAttribute=\"top\" secondItem=\"wu6-TO-1qx\" secondAttribute=\"top\" id=\"ch9-4g-B55\"/>\n                            <constraint firstItem=\"wu6-TO-1qx\" firstAttribute=\"trailing\" secondItem=\"kNJ-ib-BOR\" secondAttribute=\"trailing\" constant=\"16\" id=\"cvY-oH-7eC\"/>\n                            <constraint firstItem=\"wu6-TO-1qx\" firstAttribute=\"bottom\" relation=\"greaterThanOrEqual\" secondItem=\"kNJ-ib-BOR\" secondAttribute=\"bottom\" id=\"uJl-7h-o7O\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"centeredRedDataSource\" destination=\"mbq-YT-X12\" id=\"CjO-7B-hSA\"/>\n                        <outlet property=\"green\" destination=\"Wc6-ho-C6a\" id=\"Nth-j7-N1B\"/>\n                        <outlet property=\"orange\" destination=\"eEe-RW-4pi\" id=\"0wE-MG-jjH\"/>\n                        <outlet property=\"pie1\" destination=\"pOH-ou-7cF\" id=\"UCY-8i-HfT\"/>\n                        <outlet property=\"pie2\" destination=\"J2J-vy-qSp\" id=\"8ve-dl-flN\"/>\n                        <outlet property=\"pie3\" destination=\"ohf-JL-rMA\" id=\"8Ie-0W-ZbP\"/>\n                        <outlet property=\"purple\" destination=\"Nas-fi-tod\" id=\"VaU-3w-FPz\"/>\n                        <outlet property=\"red\" destination=\"eRm-Xm-bRw\" id=\"Of5-Pv-xkW\"/>\n                        <outlet property=\"winLoss\" destination=\"xDV-60-4pQ\" id=\"PYJ-ah-ycI\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"51\" y=\"65\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"placeholderTextColor\">\n            <color red=\"0.23529411764705882\" green=\"0.23529411764705882\" blue=\"0.2627450980392157\" alpha=\"0.29999999999999999\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"secondaryLabelColor\">\n            <color red=\"0.23529411764705882\" green=\"0.23529411764705882\" blue=\"0.2627450980392157\" alpha=\"0.59999999999999998\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemBlueColor\">\n            <color red=\"0.0\" green=\"0.47843137254901963\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemGreenColor\">\n            <color red=\"0.20392156862745098\" green=\"0.7803921568627451\" blue=\"0.34901960784313724\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemOrangeColor\">\n            <color red=\"1\" green=\"0.58431372549019611\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemPurpleColor\">\n            <color red=\"0.68627450980392157\" green=\"0.32156862745098042\" blue=\"0.87058823529411766\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemYellowColor\">\n            <color red=\"1\" green=\"0.80000000000000004\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UIUserInterfaceStyle</key>\n\t<string>Automatic</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Samples/tvOS Sparkline Demo/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  tvOS Sparkline Demo\n//\n//  Created by Darren Ford on 23/12/19.\n//\n\nimport UIKit\n\nimport DSFSparkline\n\nclass ViewController: UIViewController {\n\t@IBOutlet var green: DSFSparklineDataSourceView!\n\tvar greenDataSource = DSFSparkline.DataSource(range: -11 ... 11)\n\n\t@IBOutlet var red: DSFSparklineLineGraphView!\n\tvar redDataSource = DSFSparkline.DataSource(range: -45 ... 15)\n\n\t@IBOutlet weak var centeredRedDataSource: DSFSparklineLineGraphView!\n\n\t@IBOutlet var purple: DSFSparklineDotGraphView!\n\tvar purpleDataSource = DSFSparkline.DataSource(range: 0 ... 50)\n\n\t@IBOutlet var orange: DSFSparklineDotGraphView!\n\tvar orangeDataSource = DSFSparkline.DataSource(range: 0 ... 50)\n\n\t@IBOutlet var winLoss: DSFSparklineWinLossGraphView!\n\tvar wlSource = DSFSparkline.DataSource(range: -1 ... 1)\n\n\t@IBOutlet var pie1: DSFSparklinePieGraphView!\n\t@IBOutlet var pie2: DSFSparklinePieGraphView!\n\t@IBOutlet var pie3: DSFSparklinePieGraphView!\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\t\t// Do any additional setup after loading the view.\n\n\t\tself.winLoss.dataSource = self.wlSource\n\n\t\tlet randWinLoss: [CGFloat] = (0 ..< 50).map { _ in\n\t\t\tCGFloat(Int.random(in: -1 ... 1))\n\t\t}\n\t\tself.wlSource.set(values: randWinLoss)\n\n\t\tself.green.dataSource = self.greenDataSource\n\t\tself.red.dataSource = self.redDataSource\n\t\tself.centeredRedDataSource.dataSource = self.redDataSource\n\n\t\tself.purple.dataSource = self.purpleDataSource\n\t\tself.orange.dataSource = self.orangeDataSource\n\n\t\tself.pie1.animationStyle = DSFSparkline.AnimationStyle(duration: 2.0)\n\t\tself.pie1.dataSource = DSFSparkline.StaticDataSource([1, 2, 3])\n\n\t\tself.pie2.animationStyle = DSFSparkline.AnimationStyle(duration: 2.0)\n\t\tself.pie2.dataSource = DSFSparkline.StaticDataSource([3, 2, 1])\n\n\t\tself.pie3.animationStyle = DSFSparkline.AnimationStyle(duration: 2.0)\n\t\tself.pie3.dataSource = DSFSparkline.StaticDataSource([1, 7, 4, 9])\n\n\t\tself.updateWithNewValues()\n\t}\n\n\tfunc updateWithNewValues() {\n\t\tDispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in\n\t\t\tguard let `self` = self else { return }\n\t\t\t_ = self.greenDataSource.push(value: CGFloat.random(in: self.greenDataSource.range!))\n\t\t\t_ = self.redDataSource.push(value: CGFloat.random(in: -40 ... 10))\n\t\t\t_ = self.purpleDataSource.push(value: CGFloat.random(in: self.purpleDataSource.range!))\n\t\t\t_ = self.orangeDataSource.push(value: CGFloat.random(in: self.orangeDataSource.range!))\n\n\t\t\t_ = self.wlSource.push(value: CGFloat(Int.random(in: -1 ... 1)))\n\n\t\t\tself.updateWithNewValues()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Simple Wiper Gauge\n//\n//  Created by Darren Ford on 4/1/23.\n//\n\nimport Cocoa\n\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n\t\n\n\n\tfunc applicationDidFinishLaunching(_ aNotification: Notification) {\n\t\t// Insert code here to initialize your application\n\t}\n\n\tfunc applicationWillTerminate(_ aNotification: Notification) {\n\t\t// Insert code here to tear down your application\n\t}\n\n\n}\n\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"32700.99.1234\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"22689\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"Simple Wiper Gauge\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Simple Wiper Gauge\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About Simple Wiper Gauge\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide Simple Wiper Gauge\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit Simple Wiper Gauge\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"Simple Wiper Gauge Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Simple_Wiper_Gauge\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"98r-iN-zZc\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModule=\"Simple_Wiper_Gauge\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xtl-dD-Ib8\" customClass=\"DSFSparklineWiperGaugeGraphView\" customModule=\"DSFSparkline\">\n                                <rect key=\"frame\" x=\"20\" y=\"32\" width=\"440\" height=\"218\"/>\n                            </customView>\n                            <slider verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"et0-IY-OuD\">\n                                <rect key=\"frame\" x=\"18\" y=\"6\" width=\"444\" height=\"20\"/>\n                                <sliderCell key=\"cell\" controlSize=\"small\" continuous=\"YES\" state=\"on\" alignment=\"left\" maxValue=\"1\" doubleValue=\"0.65000000000000002\" tickMarkPosition=\"above\" sliderType=\"linear\" id=\"oJO-z7-INV\"/>\n                                <connections>\n                                    <action selector=\"valueDidUpdate:\" target=\"XfG-lQ-9wD\" id=\"653-HE-j8E\"/>\n                                </connections>\n                            </slider>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"xtl-dD-Ib8\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"A24-DT-aFg\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"et0-IY-OuD\" secondAttribute=\"bottom\" constant=\"8\" id=\"Bh3-ra-GVZ\"/>\n                            <constraint firstItem=\"xtl-dD-Ib8\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"Hke-tg-RMK\"/>\n                            <constraint firstItem=\"et0-IY-OuD\" firstAttribute=\"trailing\" secondItem=\"xtl-dD-Ib8\" secondAttribute=\"trailing\" id=\"aaz-fH-er5\"/>\n                            <constraint firstItem=\"et0-IY-OuD\" firstAttribute=\"leading\" secondItem=\"xtl-dD-Ib8\" secondAttribute=\"leading\" id=\"f92-fI-PIL\"/>\n                            <constraint firstItem=\"et0-IY-OuD\" firstAttribute=\"top\" secondItem=\"xtl-dD-Ib8\" secondAttribute=\"bottom\" constant=\"8\" id=\"fHg-S6-aqn\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"xtl-dD-Ib8\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"kPG-UO-9sp\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"wiperGauge\" destination=\"xtl-dD-Ib8\" id=\"22s-ZJ-RZH\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"655\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/Simple_Wiper_Gauge.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-only</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  Simple Wiper Gauge\n//\n//  Created by Darren Ford on 4/1/23.\n//\n\nimport Cocoa\nimport DSFSparkline\n\nclass ViewController: NSViewController {\n\n\t@IBOutlet weak var wiperGauge: DSFSparklineWiperGaugeGraphView!\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\n\t\twiperGauge.value = 0.65\n\t\t// Do any additional setup after loading the view.\n\t}\n\n\toverride var representedObject: Any? {\n\t\tdidSet {\n\t\t// Update the view, if already loaded.\n\t\t}\n\t}\n\n\t@IBAction func valueDidUpdate(_ sender: NSSlider) {\n\t\twiperGauge.value = CGFloat(sender.doubleValue)\n\t}\n\n}\n\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t2354FF5829651D9600376C3C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2354FF5729651D9600376C3C /* AppDelegate.swift */; };\n\t\t2354FF5A29651D9600376C3C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2354FF5929651D9600376C3C /* ViewController.swift */; };\n\t\t2354FF5C29651D9700376C3C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2354FF5B29651D9700376C3C /* Assets.xcassets */; };\n\t\t2354FF5F29651D9700376C3C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2354FF5D29651D9700376C3C /* Main.storyboard */; };\n\t\t2354FF702965202600376C3C /* DSFSparkline-static in Frameworks */ = {isa = PBXBuildFile; productRef = 2354FF6F2965202600376C3C /* DSFSparkline-static */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t2354FF5429651D9600376C3C /* Simple Wiper Gauge.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Simple Wiper Gauge.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2354FF5729651D9600376C3C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t2354FF5929651D9600376C3C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t2354FF5B29651D9700376C3C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t2354FF5E29651D9700376C3C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t2354FF6029651D9700376C3C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t2354FF6129651D9700376C3C /* Simple_Wiper_Gauge.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Simple_Wiper_Gauge.entitlements; sourceTree = \"<group>\"; };\n\t\t2354FF6829651DA400376C3C /* DSFSparkline */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DSFSparkline; path = ../..; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t2354FF5129651D9600376C3C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2354FF702965202600376C3C /* DSFSparkline-static in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t2354FF4B29651D9600376C3C = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2354FF6829651DA400376C3C /* DSFSparkline */,\n\t\t\t\t2354FF5629651D9600376C3C /* Simple Wiper Gauge */,\n\t\t\t\t2354FF5529651D9600376C3C /* Products */,\n\t\t\t\t2354FF6B29651DC300376C3C /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2354FF5529651D9600376C3C /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2354FF5429651D9600376C3C /* Simple Wiper Gauge.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2354FF5629651D9600376C3C /* Simple Wiper Gauge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2354FF5729651D9600376C3C /* AppDelegate.swift */,\n\t\t\t\t2354FF5929651D9600376C3C /* ViewController.swift */,\n\t\t\t\t2354FF5B29651D9700376C3C /* Assets.xcassets */,\n\t\t\t\t2354FF5D29651D9700376C3C /* Main.storyboard */,\n\t\t\t\t2354FF6029651D9700376C3C /* Info.plist */,\n\t\t\t\t2354FF6129651D9700376C3C /* Simple_Wiper_Gauge.entitlements */,\n\t\t\t);\n\t\t\tpath = \"Simple Wiper Gauge\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2354FF6B29651DC300376C3C /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t2354FF5329651D9600376C3C /* Simple Wiper Gauge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2354FF6429651D9700376C3C /* Build configuration list for PBXNativeTarget \"Simple Wiper Gauge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2354FF5029651D9600376C3C /* Sources */,\n\t\t\t\t2354FF5129651D9600376C3C /* Frameworks */,\n\t\t\t\t2354FF5229651D9600376C3C /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Simple Wiper Gauge\";\n\t\t\tpackageProductDependencies = (\n\t\t\t\t2354FF6F2965202600376C3C /* DSFSparkline-static */,\n\t\t\t);\n\t\t\tproductName = \"Simple Wiper Gauge\";\n\t\t\tproductReference = 2354FF5429651D9600376C3C /* Simple Wiper Gauge.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t2354FF4C29651D9600376C3C /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1230;\n\t\t\t\tLastUpgradeCheck = 1230;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t2354FF5329651D9600376C3C = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 2354FF4F29651D9600376C3C /* Build configuration list for PBXProject \"Simple Wiper Gauge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 2354FF4B29651D9600376C3C;\n\t\t\tproductRefGroup = 2354FF5529651D9600376C3C /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t2354FF5329651D9600376C3C /* Simple Wiper Gauge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t2354FF5229651D9600376C3C /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2354FF5C29651D9700376C3C /* Assets.xcassets in Resources */,\n\t\t\t\t2354FF5F29651D9700376C3C /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t2354FF5029651D9600376C3C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2354FF5A29651D9600376C3C /* ViewController.swift in Sources */,\n\t\t\t\t2354FF5829651D9600376C3C /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t2354FF5D29651D9700376C3C /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t2354FF5E29651D9700376C3C /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t2354FF6229651D9700376C3C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2354FF6329651D9700376C3C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2354FF6529651D9700376C3C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"Simple Wiper Gauge/Simple_Wiper_Gauge.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tINFOPLIST_FILE = \"Simple Wiper Gauge/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.dagronf.dsfsparkline.Simple-Wiper-Gauge\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2354FF6629651D9700376C3C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"Simple Wiper Gauge/Simple_Wiper_Gauge.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 3L6RK3LGGW;\n\t\t\t\tINFOPLIST_FILE = \"Simple Wiper Gauge/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.dagronf.dsfsparkline.Simple-Wiper-Gauge\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t2354FF4F29651D9600376C3C /* Build configuration list for PBXProject \"Simple Wiper Gauge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2354FF6229651D9700376C3C /* Debug */,\n\t\t\t\t2354FF6329651D9700376C3C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2354FF6429651D9700376C3C /* Build configuration list for PBXNativeTarget \"Simple Wiper Gauge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2354FF6529651D9700376C3C /* Debug */,\n\t\t\t\t2354FF6629651D9700376C3C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t2354FF6F2965202600376C3C /* DSFSparkline-static */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = \"DSFSparkline-static\";\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 2354FF4C29651D9600376C3C /* Project object */;\n}\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Demos/Simple Wiper Gauge/Simple Wiper Gauge.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"SwiftImageReadWrite\",\n        \"repositoryURL\": \"https://github.com/dagronf/SwiftImageReadWrite\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"42ace2412279f18bc264bc306e96b51c36e12a33\",\n          \"version\": \"1.9.2\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Darren Ford\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"SwiftImageReadWrite\",\n        \"repositoryURL\": \"https://github.com/dagronf/SwiftImageReadWrite\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"42ace2412279f18bc264bc306e96b51c36e12a33\",\n          \"version\": \"1.9.2\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version: 5.4\n\nimport PackageDescription\n\nlet package = Package(\n\tname: \"DSFSparkline\",\n\tplatforms: [\n\t\t.macOS(.v10_13),\n\t\t.iOS(.v14),\n\t\t.tvOS(.v14)\n\t],\n\tproducts: [\n\t\t.library(name: \"DSFSparkline\", targets: [\"DSFSparkline\"]),\n\t\t.library(name: \"DSFSparkline-static\", type: .static, targets: [\"DSFSparkline\"]),\n\t\t.library(name: \"DSFSparkline-shared\", type: .dynamic, targets: [\"DSFSparkline\"]),\n\t],\n\tdependencies: [\n\t\t.package(url: \"https://github.com/dagronf/SwiftImageReadWrite\", from: \"1.9.2\"),\n\t],\n\ttargets: [\n\t\t.target(\n\t\t\tname: \"DSFSparkline\",\n\t\t\tdependencies: []),\n\t\t.testTarget(\n\t\t\tname: \"DSFSparklineTests\",\n\t\t\tdependencies: [\"DSFSparkline\", \"SwiftImageReadWrite\"]),\n\t]\n)\n"
  },
  {
    "path": "README.md",
    "content": "# Sparklines for macOS, iOS and tvOS\n\nA lightweight sparkline component, supporting Swift, SwiftUI, macCatalyst and Objective-C.\n\n<p align=\"center\">\n    <img src=\"https://img.shields.io/github/v/tag/dagronf/DSFSparkline\" />\n    <img src=\"https://img.shields.io/badge/macOS-10.13+-red\" />\n    <img src=\"https://img.shields.io/badge/iOS-14.0+-blue\" />\n    <img src=\"https://img.shields.io/badge/tvOS-14.0+-orange\" />\n    <img src=\"https://img.shields.io/badge/SwiftUI-1.0+-green\" />\n    <img src=\"https://img.shields.io/badge/macCatalyst-1.0+-purple\" />\n</p>\n\n<p align=\"center\">\n    <img src=\"https://img.shields.io/badge/Swift-5-orange.svg\" />\n    <img src=\"https://img.shields.io/badge/License-MIT-lightgrey\" />\n    <img src=\"https://img.shields.io/badge/pod-compatible-informational\" alt=\"CocoaPods\" />\n    <a href=\"https://swift.org/package-manager\">\n        <img src=\"https://img.shields.io/badge/spm-compatible-brightgreen.svg?style=flat\" alt=\"Swift Package Manager\" />\n    </a>\n</p>\n\n<center>\n<a href=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/reportview.png\">\n<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/reportview.png\" width=\"300\"/></a>\n</center>\n\n## What is a sparkline?\n\nA sparkline is a very small chart, typically drawn without axes or coordinates. It presents the general shape of the variation (typically over time) in some measurement, such as temperature or stock market price, in a simple and highly condensed way. Sparklines are small enough to be embedded in text, or several sparklines may be grouped together as elements of a small multiple. Whereas the typical chart is designed to show as much data as possible, and is set off from the flow of text, sparklines are intended to be succinct, memorable, and located where they are discussed.\n\n[Source: Wikipedia](https://en.wikipedia.org/wiki/Sparkline)\n\n## What ISN'T a sparkline?\n\n`DSFSparkline` **IS NOT** designed to be a full-featured graphing library. It was built to be lightweight, to create small, memorable charts within an app.\n\nIf you need features like labelling, real-time updating, axis-labelling, interactivity, legends or beautiful charts at larger sizes, you might be better served by the [Charts library](https://github.com/danielgindi/Charts), [Core plot](https://github.com/core-plot/core-plot) or [SciChart (paid)](https://www.scichart.com/ios-chart-features/). You can find a whole lot more [here](https://iosexample.com/tag/charts/).\n\n## Features\n\n* Multiple graph styles support, such as line, bar, tablet etc.\n* Support for sparkline customizations, such as zero-line, grid lines, highlighting.\n* Prebuilt NSView/UIView/SwiftUI types for quick integration\n* Independently scalable for sparklines at any size\n* y-range can automatically grow or shrink to encompass the full y-range of data.\n* y-range can be fixed and the sparkline will truncate to the specified range\n* SwiftUI support for all sparkline types\n* NSAttributedString support\n* `IBDesignable` support for prebuilt types so you can see and configure your sparklines in interface builder.\n* Optional drawing of a 'zero line' on the bar and line graphs (thanks [Tito Ciuro](https://github.com/tciuro))\n* Playground support\n\n## TL;DR - Show me something!\n\n<details>\n<summary>Create a retina-scale (144dpi) bitmap with a simple line overlay graph</summary>\n\n```swift\n// A datasource with a simple set of data\nlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\n\nlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\nlet stack = DSFSparklineOverlay.Line()      // Create a line overlay\nstack.dataSource = source                   // Assign the datasource to the overlay\nbitmap.addOverlay(stack)                    // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 25, scale: 2)\n\n// Embed a sparkline in an NSAttributedString\nlet attributedString = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)\n```\n\n<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-simple-small.png\" width=\"50\"/>\n\n</details>\n\n<details>\n<summary>Create a Swift-UI line graph sparkline with zero-line and highlight range overlays</summary>\n\n```swift\nfileprivate let SwiftUIDemoDataSource: DSFSparkline.DataSource = {\n   let d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.5)\n     d.push(values: [\n        0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,\n        0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50\n     ])\n     return d\n  }()\n\nstruct SuperCoolLineSpark: View {\n   // The overlay representing the zero-line for the data source\n   var zeroOverlay: DSFSparklineOverlay = {\n      let zeroLine = DSFSparklineOverlay.ZeroLine()\n      zeroLine.dataSource = SwiftUIDemoDataSource\n      zeroLine.dashStyle = []\n      return zeroLine\n   }()\n\n   // The overlay to draw a highlight between range 0 ..< 0.2\n   var rangeOverlay: DSFSparklineOverlay = {\n      let highlight = DSFSparklineOverlay.RangeHighlight()\n      highlight.dataSource = SwiftUIDemoDataSource\n      highlight.highlightRange = 0.0 ..< 0.2\n      highlight.fill = DSFSparkline.Fill.Color(DSFColor.gray.withAlphaComponent(0.4).cgColor)\n      return highlight\n   }()\n\n   // The actual line graph\n   var lineOverlay: DSFSparklineOverlay = {\n      let lineOverlay = DSFSparklineOverlay.Line()\n      lineOverlay.dataSource = SwiftUIDemoDataSource\n\n      lineOverlay.primaryStrokeColor = DSFColor.systemBlue.cgColor\n      lineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemBlue.withAlphaComponent(0.3).cgColor)\n\n      lineOverlay.secondaryStrokeColor = DSFColor.systemYellow.cgColor\n      lineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemYellow.withAlphaComponent(0.3).cgColor)\n\n      lineOverlay.strokeWidth = 1\n      lineOverlay.markerSize = 4\n      lineOverlay.centeredAtZeroLine = true\n\n      return lineOverlay\n   }()\n\n   var body: some View {\n      DSFSparklineSurface.SwiftUI([\n         rangeOverlay,    // range highlight overlay\n         zeroOverlay,     // zero-line overlay\n         lineOverlay,     // line graph overlay\n      ])\n      .frame(width: 150, height: 40)\n   }\n}\n```\n\n<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/swiftui-demo.png\" width=\"165\"/>\n\n</details>\n\n## Integration\n\nUse Swift Package Manager to integrate `DSFSparkline` into your project\n\nAdd `https://github.com/dagronf/DSFSparkline` to your project.\n\n### Note\n\nWhen adding `DSFSparkline` to one of your projects, you need to choose a **SINGLE** 'package product' to \nlink to your target.  Choosing multiple package products for your project will result in weird, inconsistent link errors.\n\n|  Package Product       |  Description                    |\n|:-----------------------|:--------------------------------|\n| `DSFSparkline`         |  The default style.  If you are just trying this library out, this is the one to choose\n| `DSFSparkline-static`  |  Add `DSFSparkline` as a STATIC library, meaning that all DSFSparkline code is linked directly into your target |\n| `DSFSparkline-shared`  |  Add `DSFSparkline` as a SHARED library, meaning that you can use a single shared framework between multiple targets in your project to save space |\n\n\n<img src=\"./Art/xcode-add-at-target.png\" />\n\n\n## Available graph types\n\n### Line <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-simple-small.png\" width=\"50\"/>\n\nA simple line sparkline. The line can be centered around a zero line to indicate positive and negative values. You can also add (optional) markers to the data points.\n\nYou can custom-draw the markers by supplying a drawing callback block (`markerDrawingBlock`) where you can customize which markers are drawn (for example, just the min and max values) and how they are drawn.\n\n|  Standard  | Centered  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-standard.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-centered.png\" width=\"400\">|\n\n|  Interpolated  | Interpolated Centered  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-interpolated.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-interpolated-centered.png\" width=\"400\">|\n\n|  Standard Markers  | Interpolated Markers |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-markers.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-markers-centered.png\" width=\"400\">|\n\n|  Custom Markers (min/max only)  | Custom Markers (Last 5 values) |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-custom-marker-1.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-custom-marker-2.png\" width=\"400\">|\n\n<details>\n  <summary>Swift example using custom markers</summary>\n  \n```swift\n//\n// A custom marker drawing function that draws the maximum value in green, the minimum value in red\n//\nself.myLineView.markerDrawingBlock = { context, markerFrames in\n   // Get the frames containing the minimum and maximum values\n   if let minMarker = markerFrames.min(by: { (a, b) -> Bool in a.value < b.value }),\n      let maxMarker = markerFrames.min(by: { (a, b) -> Bool in a.value > b.value }) {\n\n      // Draw minimum marker\n\n      context.setFillColor(DSFColor.systemRed.cgColor)\n      context.fill(minMarker.rect)\n      context.setLineWidth(0.5)\n      context.setStrokeColor(DSFColor.white.cgColor)\n      context.stroke(minMarker.rect)\n\n      // Draw maximum marker\n\n      context.setFillColor(DSFColor.systemGreen.cgColor)\n      context.fill(maxMarker.rect)\n\n      context.setLineWidth(0.5)\n      context.setStrokeColor(DSFColor.white.cgColor)\n      context.stroke(maxMarker.rect)\n   }\n}\n```\n</details>\n\n### Bar <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/bar-simple-small.png\" width=\"50\"/>\n\nA simple barchart sparkline. The bar can be centered around a zero line to indicate positive and negative values.\n\n|  Standard  |  Centered  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/bar-standard.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/bar-centered.png\" width=\"400\">|\n\n### Stackline <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stackline-simple-small.png\" width=\"50\"/>\n\nA stackline sparkline is similar to a bar chart except that it doesn't separate out individual columns. The stackline can be centered around a zero line to indicate positive and negative values.\n\n|  Standard  |  Centered  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stackline-standard.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stackline-centered.png\" width=\"400\">|\n\n### Stripes <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stripes-small.png\" width=\"50\"/>\n\nA stripes graph.  A good example of a stripes graph is the 'warming stripes' [climate graph](https://www.climatecentral.org/showyourstripes).\n\nValues from the datasource are mapped to a supplied gradient\n\n|  Standard  |  Integral (pixel boundaries)  |\n|------------|-------------------------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stripes-standard.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stripes-integral.png\" width=\"400\">|\n\n### Dot <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/dot-simple-small.png\" width=\"50\"/>\n\nA dot sparkline reminiscent of Activity Viewer's CPU history graphs\n\n|  Standard  |  Inverted  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/dot-standard.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/dot-inverted.png\" width=\"400\">|\n\n### Win/Loss/Tie <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/win-loss-small.png\" width=\"50\"/>\n\nA win-loss graph, where positive values in the datasource are represented as a 'win', negative values represented as a 'loss', and zero values are a 'tie'.\n\n|  Win/Loss  |  Win/Loss/Tie  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/win-loss.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/win-loss-tie.png\" width=\"400\">|\n\n### Tablet <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/tablet-small.png\" width=\"80\"/>\n\nA tablet graph, where positive values in the datasource are represented as a filled circle, negative values represented as an unfilled circle. The behaviour is identical to the win/loss graph.\n\n|  Standard  |\n|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/tablet.png\" width=\"400\">|\n\n### Pie <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/pie-simple.png\" width=\"18\"/>\n\nA basic pie sparkline\n\n|  Standard  |\n|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/pie.png\" width=\"400\">|\n\n### DataBar <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/databar-simple.png\" width=\"50\"/>\n\nA databar sparkline.  Supports percentage and totals types.\n\n|  Percent  |  Total  |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/databar.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/databar-max.png\" width=\"400\">|\n\n### PercentBar <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/percentbar.png\" width=\"50\"/>\n\nA percentbar sparkline takes a single value (0 ... 1) and draws a horizontal bar chart containing the value with an optional text label.\n\n|    |    |\n|------------|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/percent-bar.png\" width=\"400\">|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/percent-bar-2.png\" width=\"400\">|\n\n### WiperGauge <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/wiper-gauge-simple.png\" width=\"40\"/>\n\nA simple gauge with a single value (0 ... 1). The color displayed in the gauge can be one of\n\n* a single flat color\n* a color mapped from a gradient to the value\n* a color mapped from a color bucket to the value\n\n|  Standard  |\n|------------|\n|<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/wiper-gauge.png\" width=\"400\">|\n\n### Activity Grid <img src=\"./Art/doc/activity-grid-mini.png\" width=\"150\"/>\n\nA Github-style activity grid. Each cell represents a discrete value in a progression with a color\n\n* Configurable horizontal/vertical cell count\n* Configurable cell spacing\n* Configurable fill schemes\n\n|            |            |\n|------------|------------|\n|<img src=\"./Art/doc/activity-grid-1.png\" width=\"400\">|<img src=\"./Art/doc/activity-grid-2.png\" width=\"400\">|\n\n### Circular Progress <img src=\"./Art/doc/circular-radial-3.png\" height=\"18\"/> <img src=\"./Art/doc/circular-radial-4.png\" height=\"18\"/> <img src=\"./Art/doc/circular-radial-5.png\" height=\"18\"/> <img src=\"./Art/doc/circular-radial-6.png\" height=\"18\"/>\n\nA circular progress graph\n\n* Configurable track width\n* Optional track background color\n* Configurable track padding to allow overlaying multiple progress graphs to replicate the health rings.\n* Configurable fill schemes\n\n| Simulated health rings |\n|------------------------|\n|<img src=\"./Art/doc/circular-health-0.0.png\" height=\"48\"/>&nbsp;<img src=\"./Art/doc/circular-health-0.33.png\" height=\"48\"/>&nbsp;<img src=\"./Art/doc/circular-health-0.66.png\" height=\"48\"/>&nbsp;<img src=\"./Art/doc/circular-health-1.0.png\" height=\"48\"/>|\n\n### Circular Gauge <img src=\"./Art/doc/circular-gauge-small-0.0.png\" height=\"25\" /> <img src=\"./Art/doc/circular-gauge-small-0.33.png\" height=\"25\" /> <img src=\"./Art/doc/circular-gauge-small-0.66.png\" height=\"25\" /> <img src=\"./Art/doc/circular-gauge-small-1.0.png\" height=\"25\" />\n\nA circular gauge\n\n* Configurable track/line width\n* Configurable fill/stroke schemes\n* Supports shadows/inner shadows\n* Animatable changes\n\n|      |       |       |       |\n|------|-------|-------|-------|\n| <a href=\"./Art/doc/circular-gauge-basic.png\"> <img src=\"./Art/doc/circular-gauge-basic.png\" height=\"64\" /></a> | <a href=\"./Art/doc/circular-gauge-inner-inout.png\"> <img src=\"./Art/doc/circular-gauge-inner-inout.png\" height=\"64\" /></a> | <a href=\"./Art/doc/circular-gauge-gradient.png\"> <img src=\"./Art/doc/circular-gauge-gradient.png\" height=\"64\" /></a> | <a href=\"./Art/doc/circular-gauge-slightly.png\"> <img src=\"./Art/doc/circular-gauge-slightly.png\" height=\"30\" /></a> |\n\n\n# Demos\n\nYou can find a lot of examples of sparklines in projects in the `Demos/Samples` subfolder, providing examples for macOS (swift and objc), iO, tvOS, macCatalyst and SwiftUI.\n\nThere's also a simple Xcode Playground available in the `Demos/Playground` subfolder where you can play with the different sparkline types\n\n# Building your sparkline\n\n### Using prebuilt views\n\nA prebuilt view is useful to quickly add a sparkline using SwiftUI or via Interface Builder. These views a slightly more limited set of styling and customizations but are much quicker to implement than using overlays directly.\n\nFor the most part, the prebuilt types will be all you need.\n\nIf you've used `DSFSparklines` prior to v4, these are the original view types that you used to display your sparklines.\n\n* **A datasource** - the set of values to draw\n* **A prebuilt view type** - the NSView/UIView/SwiftUI view to draw your sparkline\n\n### Using overlays\n\nThere are three fundamental building blocks for an overlay sparkline. Overlay sparklines are more flexible and configurable than the pre-built views, but are more complex to set up.\n\n* **A surface** - where it will draw\n* **A datasource** - the set of values to draw\n* **One or more overlays** - the 'layers' which render different components of the sparkline\n\n## Surface\n\nA surface represents a destination for a sparkline. This library provides a number of built-in surfaces\n\n* `DSFSparklineSurfaceView` - An `NSView`/`UIView` surface for displaying a sparkline\n* `DSFSparklineSurface.SwiftUI` - A SwiftUI `View` surface.\n* `DSFSparklineSurface.Bitmap` - A `NSImage`/`UIImage`/`CGImage`/`NSAttributedString` surface for creating a bitmap from a sparkline.\n\n## DataSource\n\nA data source provides data for a sparkline. A datasource can be shared between multiple overlays or prebuilt types (see below) to provide different 'views' of the data contained within the source.  And if a `DataSource` is updated, all sparkline ovelays observing that source will be automatically re-rendered.\n\nThere are currently two types of datasource available\n\n### DSFSparkline.DataSource\n\nA DataSource that contains values that can be updated by pushing new values into the source.\n\n<details>\n  <summary>More details</summary>\n\n#### WindowSize\n\nThe DataSource defines a 'windowSize' - the maximum number of values to be drawn on the overlay. As values are pushed into the DataSource, any values that no longer `fit` within the DataSource window are discarded.\n\n* If the window size is reduced, stored data is truncated.\n* If the window size is increased, the data store is padded with zeros\n\n<details>\n  <summary>Code example</summary>\n\n```swift\n/// Swift\ndataSource.windowSize = 30\nassert(dataSource.windowSize == 30)\n```\n\n```objective-c\n/// Objective-C\n[dataSource setWindowSize:30];\nassert([dataSource windowSize] == 30);\n```\n</details>\n\n#### Y-range\n\nThe range defines the upper and lower values to be displayed in the sparkline. Any values pushed into the datasource will be capped when drawn to this range.\n\nIf the range is not set (ie nil), then any overlays will automatically resize to fit the entire range of values within the source.  For example, with values as [1, 2, 3, 4] the range is implicitly set as 1 ... 4. If the values are [-10, 100, 33] the range is implicitly set as -10 ... 100\n\n<details>\n  <summary>Code example</summary>\n\n```swift\n/// Swift\ndataSource.range = -1.0 ... 1.0\n```\n\n```objective-c\n/// Objective-C\n[dataSource setRangeWithLowerBound:-1.0 upperBound:1.0];\n```\n</details>\n\n#### Zero-line value\n\nThe zero-line defines the point the sparkline overlays should consider to be 'zero'. For example, graphs that can be centered (line, bar and stackline) use the zero-line value to define where the graph is centered around.\n\nThe zero-line value defaults to zero.\n\nYou can draw a zero-line for a sparkline by adding a `DSFSparklineOverlay.ZeroLine` to your surface.\n\n<details>\n  <summary>Code example</summary>\n\n```swift\n/// Swift\ndataSource.zeroLineValue = 0.2\n```\n\n```objc\n/// Objective-C\n[dataSource setZeroLineValue:0.2];\n```\n</details>\n\n#### Adding values\n\nYou can push new values into the datasource using the `push` functions. Values in the datasource older than the datasource's `windowSize` are discarded.  \n\nAs values are pushed into the datasource, any overlays assigned this datasource will automatically update.\n\n<details>\n  <summary>Code example</summary>\n\n```swift\n/// Swift\ndataSource.push(value: 4.5)\ndataSource.push(values: [6, 7, 8])\n```\n\n```objective-c\n/// Objective-C\n[dataSource pushWithValue:@(4.5)];\n```\n</details>\n\nYou replace all the values in a datasource the `set` functions. The set function also changes the `windowSize` for the datasource to the size of the values array passed in.\n\nAny overlays assigned this datasource will automatically update.\n\n<details>\n  <summary>Code example</summary>\n\n```swift\n/// Swift\ndatasource.set(values: [\n   0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,\n   0.0, -0.1, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -1.0\n])\n```\n\n```objc\n/// Objective-C\n[datasource setWithValues:\n   @[@(0.0), @(0.1), @(0.2), @(0.3), @(0.4), @(0.5), @(0.6), @(0.7), @(0.8), @(0.9), @(1),\n     @(0.0), @(-0.1), @(-0.2), @(-0.3), @(-0.4), @(-0.5), @(-0.6), @(-0.7), @(-0.8), @(-0.9), @(-1)]];\n```\n\n</details>\n\n\n</details>\n\n### DSFSparkline.StaticDataSource\n\nA datasource that contains a static set of values. Some types of sparkline use a single 'set' of data, providing no historical context.\n\n<details>\n  <summary> More details </summary>\n\n```swift\n/// Swift\nlet dataSource = DSFSparkline.StaticDataSource([1, 2, 3])\n```\n\n```objc\n/// Objective-C\nDSFSparklineStaticDataSource* dataSource = [[DSFSparklineStaticDataSource alloc] init: @[@(1), @(2), @(3)]];\n```\n\n</details>\n\n## Overlays\n\nOverlays represent the individual visual components of a sparkline. You can add as many or as few to your surface in any order. For example, you could overlay two different graph types onto the same surface using the same. And as overlays can share their datasource, all overlays using the same source will automatically update if the data changes (for example, in reponse to a `push`)\n\nFor example, there is an overlay that highlights a y-range of data. Or, if you want some grid lines, you can add them using the gridlines overlay.\n\nYou can add different instances of an overlay to the same sparkline. For example, if you want to add multiple range highlights you add multiple 'highlight' overlays to the sparkline surface.\n\nThe order in which the overlays are added determine where in the z-order that they appear in the sparkline.  For example, you can choose to draw the grid on top of the graph if you want by adding the graph overlay BEFORE you add the grid overlay\n\n<center><img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/overlay-demo.png\" width=\"680\"></center>\n\nThe overlay allows your sparkline to be as complex or as simple as you want.\n\n### Graph types\n\n#### Dynamic\n\nA dynamic graph automatically updates its overlays as values are 'pushed' onto its datasource. As data is added the assigned overlay is automatically updated to reflect the new data.  If more data is added via a push or set the data is added to the datasource, the associated view will automatically update to reflect the new data. Older data that no longer falls within the datasource window is discarded.\n\nThis provides the ability to show a historical data set over the breadth of the graph.\n\n<details>\n  <summary>`DSFSparklineOverlay.Line` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-simple-small.png\" width=\"50\"/><img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/line-simple-small-interpolated.png\" width=\"50\"/> </summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\nlet line = DSFSparklineOverlay.Line()      // Create a line overlay\nline.strokeWidth = 1\nline.primaryFill = primaryFill\nline.dataSource = source                   // Assign the datasource to the overlay\nbitmap.addOverlay(line)                    // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.StackLine` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stackline-simple-small.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface\nlet stack = DSFSparklineOverlay.Stackline()  // Create a stackline overlay\nstack.dataSource = source                    // Assign the datasource to the overlay\nstack.strokeWidth = 1\nstack.primaryFill = primaryFill\nbitmap.addOverlay(stack)                     // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.Bar` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/bar-simple-small.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\nlet bar = DSFSparklineOverlay.Bar()         // Create a bar overlay\nbar.dataSource = source                     // Assign the datasource to the overlay\nbar.primaryFill = primaryFill\nbitmap.addOverlay(bar)                      // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 25, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.Dot` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/dot-simple-small.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()  // Create a bitmap surface\nlet dot = DSFSparklineOverlay.Dot()        // Create a dot graph overlay\ndot = biggersource                         // Assign the datasource to the overlay\nbitmap.addOverlay(dot)                     // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 32, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n\n<details>\n  <summary>`DSFSparklineOverlay.WinLossTie` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/win-loss-small.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()          // Create a bitmap surface\nlet winLossTie = DSFSparklineOverlay.WinLossTie()  // Create a win-loss-tie overlay\nwinLossTie.dataSource = winloss                    // Assign the datasource\nbitmap.addOverlay(winLossTie)                      // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 75, height: 12, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.Tablet` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/tablet-small.png\" width=\"80\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface\nlet stack = DSFSparklineOverlay.Tablet()     // Create a tablet overlay\nstack.dataSource = winloss                   // Assign a datasource to the overlay\nbitmap.addOverlay(stack)                     // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 90, height: 16, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n\n<details>\n  <summary>`DSFSparklineOverlay.Stripes` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/stripes-small.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface\nlet stack = DSFSparklineOverlay.Stripes()    // Create a stripes overlay\nstack.dataSource = .init(values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\nbitmap.addOverlay(stack)                     // And add the overlay to the surface.\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 90, height: 16, scale: 2)\n\n// Do something with 'image'\n```\n</details>\n\n\n#### Static\n\nA static graph has a fixed set of values (for example, a pie chart). The overlays update when a new static data source is assigned to it.\n\n<details>\n  <summary>`DSFSparklineOverlay.Pie` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/pie-simple.png\" width=\"18\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()\nlet pie = DSFSparklineOverlay.Pie()\npie.dataSource = DSFSparkline.StaticDataSource([10, 55, 20])\npie.lineWidth = 0.5\npie.strokeColor = CGColor.black\n\nbitmap.addOverlay(pie)\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 18, height: 18, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.DataBar` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/databar-simple.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()\nlet stack = DSFSparklineOverlay.DataBar()\nstack.dataSource = DSFSparkline.StaticDataSource([10, 20, 30])\nstack.lineWidth = 0.5\nstack.strokeColor = CGColor.black\n\nbitmap.addOverlay(stack)\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 18, scale: 2)!\n\n// Do something with 'image'\n```\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.PercentBar` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/percentbar.png\" width=\"50\"/>  <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/percentbar2.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()\nlet percentBar = DSFSparklineOverlay.PercentBar(value: 0.3)\n\nbitmap.addOverlay(percentBar)\n\n// Generate an image with retina scale\nlet image = bitmap.image(width: 50, height: 18, scale: 2)!\n\n// Do something with 'image'\n```\n\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.WiperGauge` <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/types-new/wiper-gauge-simple.png\" width=\"50\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()\nlet wiperGauge = DSFSparklineOverlay.WiperGauge()\nwiperGauge.value = 0.75\n\nbitmap.addOverlay(wiperGauge)\n\n// Generate an image of the wiper gauge with retina scale\nlet image = bitmap.image(width: 50, height: 25, scale: 2)\n\n// Do something with 'image'\n```\n\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.ActivityGrid` <img src=\"./Art/doc/activity-grid-mini.png\" width=\"100\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()\nlet activityGrid = DSFSparklineOverlay.ActivityGrid()\nactivityGrid.dataSource = DSFSparkline.StaticDataSource(values: [...])\nactivityGrid.verticalCellCount = 1\n\nbitmap.addOverlay(activityGrid)\n\n// Generate an image of the wiper gauge with retina scale\nlet image = bitmap.image(width: 200, height: 14, scale: 2)\n\n// Do something with 'image'\n```\n\n</details>\n\n<details>\n  <summary>`DSFSparklineOverlay.CircularGauge` <img src=\"./Art/doc/circular-gauge-small-0.66.png\" width=\"18\"/></summary>\n  \n```swift\nlet bitmap = DSFSparklineSurface.Bitmap()\nlet gauge = DSFSparklineOverlay.CircularGauge()\ngauge.value = 0.66\n\nbitmap.addOverlay(gauge)\n\n// Generate an image of the wiper gauge with retina scale\nlet image = bitmap.image(width: 40, height: 40, scale: 2)\n\n// Do something with 'image'\n```\n\n</details>\n\n### Component types\n\nA component represents an overlay that isn't a graph in itself.  Examples are grid lines, zero-lines, highlights etc.  A component uses the same datasource so that it aligns with the graph it is associated with.\n\n|  Name  | Description  |\n|------------|------------|\n| `DSFSparklineOverlay.ZeroLine` | Draw a horizontal line at the 'zero-line' position of the sparkline. The zero-line is defined by the datasource and is by default zero, however this can be changed. |\n| `DSFSparklineOverlay.RangeHighlight` | Highlight a range of y-values on the sparkline |\n| `DSFSparklineOverlay.GridLines` | Draw lines at specified y-values on the sparkline |\n\n## Using prebuilt views\n\nDSFSparkline has a number of 'prebuilt' sparkline views available with a more limited scope, designed to be quicker to add to your project.\n\nEvery prebuilt sparkline view has a SwiftUI companion view.\n\n### Available prebuilt types\n\n* `DSFSparklineLineGraphView` / `DSFSparklineLineGraphView.SwiftUI`\n* `DSFSparklineStackLineGraphView` / `DSFSparklineLineGraphView.SwiftUI`\n* `DSFSparklineBarGraphView` / `DSFSparklineBarGraphView.SwiftUI`\n* `DSFSparklineStripesGraphView` / `DSFSparklineStripesGraphView.SwiftUI`\n* `DSFSparklineDotGraphView` / `DSFSparklineDotGraphView.SwiftUI`\n* `DSFSparklineWinLossGraphView` / `DSFSparklineWinLossGraphView.SwiftUI`\n* `DSFSparklineTabletGraphView` / `DSFSparklineTabletGraphView.SwiftUI`\n* `DSFSparklinePieGraphView` / `DSFSparklinePieGraphView.SwiftUI`\n* `DSFSparklineDataBarGraphView` / `DSFSparklineDataBarGraphView.SwiftUI`\n* `DSFSparklinePercentBarGraphView` / `DSFSparklinePercentBarGraphView.SwiftUI`\n* `DSFSparklineWiperGaugeGraphView` / `DSFSparklineWiperGaugeGraphView.SwiftUI`\n* `DSFSparklineActivityGridView` / `DSFSparklineActivityGridView.SwiftUI`\n* `DSFSparklineCircularGaugeView` / `DSFSparklineCircularGaugeView.SwiftUI`\n\n<details>\n  <summary>Sample Swift code</summary>\n \n```swift\n\n// Create the view\nlet sparklineView = DSFSparklineLineGraphView(…)\nsparklineView.graphColor = UIColor.blue\nsparklineView.showZeroLine = true\n\n// Create the datasource and assign to the view\nlet sparklineDataSource = DSFSparklineDataSource(windowSize: 30, range: -1.0 ... 1.0)\nsparklineView.dataSource = sparklineDataSource\n\n…\n\n// Add a single new data element to the sparkline\nsparklineDataSource.push(value: 0.7)                          // view automatically updates with new data\n\n// Add a set of data to the sparkline\nsparklineDataSource.push(values: [0.3, -0.2, 1.0])            // view automatically updates with new data\n\n// Completely replace the sparkline data with a new set of data\nsparklineDataSource.set(values: [0.2, -0.2, 0.0, 0.9, 0.8])   // view automatically resets to new data\n\n```\n  \n</details>\n\n<details>\n  <summary>Sample SwiftUI code</summary>\n  \n```swift\nstruct SparklineView: View {\n\n   let leftDataSource: DSFSparkline.DataSource\n   let rightDataSource: DSFSparkline.DataSource\n   \n   let BigCyanZeroLine = DSFSparkline.ZeroLineDefinition(\n      color: .cyan,\n      lineWidth: 3,\n      lineDashStyle: [4,1,2,1]\n   )\n   \n   var body: some View {\n      HStack {\n         DSFSparklineLineGraphView.SwiftUI(\n            dataSource: leftDataSource,\n            graphColor: DSFColor.red,\n            interpolated: true)\n         DSFSparklineBarGraphView.SwiftUI(\n            dataSource: rightDataSource,\n            graphColor: DSFColor.blue,\n            lineWidth: 2,\n            showZeroLine: true,\n            zeroLineDefinition: BigCyanZeroLine)\n      }\n   }\n}\n```\n\n<a href=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/swifui.png\"><img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/swifui.png\" width=\"100\"></a>\n\n</details>\n\n\n<details>\n<summary>Prebuilt customizations</summary>\n\n## View Types and settings\n\nRepresents the viewable settings and display.  The current view types available are :-\n\n### Common display customizations\n\n| Setting               | Type                   | Description                                             |\n|-----------------------|------------------------|---------------------------------------------------------|\n| `graphColor`          | `NSColor`<br>`UIColor` | The color to use when drawing the sparkline             |\n\n#### Common elements for graphs that can display a zero line (Line/Bar/Stackline)\n\n| Setting               | Type                    | Description                                             |\n|-----------------------|-------------------------|---------------------------------------------------------|\n| `dataSource`          | `DSFDataSource`         | The source of data for the graph                        |\n| `showZeroLine`        | `Bool`                  | Draw a dotted line at the zero line point on the y-axis |\n| `zeroLineColor`       | `NSColor`<br/>`UIColor` | The color of the 'zero line' on the y-axis.             |\n| `zeroLineWidth`       | `CGFloat`               | The width of the 'zero line' on the y-axis              |\n| `zeroLineDashStyle`   | `[CGFloat]`             | The dash pattern to use when drawing the zero line      |\n\n#### Common elements for graphs that can be centered around the zero-line (Line/Bar/Stackline)\n\n| Setting               | Type                    | Description                                                                               |\n|-----------------------|-------------------------|-------------------------------------------------------------------------------------------|\n| `centeredAtZeroLine`  | `Bool`                  | Should the graph be centered at the zero line? |\n| `lowerGraphColor`     | `NSColor`<br/>`UIColor` | The color used to draw values below the zero line. If nil, is the same as the graph color |\n\n### Line graph customizations (`DSFSparklineLineGraphView`)\n\n| Setting           | Type            | Description                      |\n|-------------------|-----------------|----------------------------------|\n| `dataSource`      | `DSFDataSource` | The source of data for the graph |\n| `lineWidth`       | `CGFloat`       | The width of the line            |\n| `interpolation`   | `Bool`          | Interpolate a curve between the points |\n| `lineShading`     | `Bool`          | Shade the area under the line |\n| `shadowed`        | `Bool`          | Draw a shadow under the line |\n| `markerSize`      | `CGFloat`       | (optional) Draw a marker of the specified size at every data point in the graph using the line color at that point |\n| `markerSize`      | `CGFloat`       | (optional) Draw a marker of the specified size at every data point in the graph using the line color at that point |\n| `markerDrawingBlock` | | A callback block to allow custom drawing of markers (if `markerSize` is > 1) |\n\n### Bar graph customizations (`DSFSparklineBarGraphView`)\n\n| Setting      | Type            | Description                      |\n|--------------|-----------------|----------------------------------|\n| `dataSource` | `DSFDataSource` | The source of data for the graph |\n| `lineWidth`  | `CGFloat`       | The width of the line            |\n| `barSpacing` | `CGFloat`       | The spacing between each bar     |\n\n### Stripes graph customizations (`DSFSparklineStripesGraphView`)\n\n| Setting      | Type            | Description                                                         |\n|--------------|-----------------|---------------------------------------------------------------------|\n| `dataSource` | `DSFDataSource` | The source of data for the graph                                    |\n| `integral`   | `Bool`          | If true, draws the bars on pixel boundaries to get nice clean lines |\n| `gradient`   | `DSFGradient`   | The color gradient to use when mapping datasource values to colors. |\n\n### Dot graph customizations (`DSFSparklineDotGraphView`)\n\n| Setting           | Type                   | Description                                        |\n|-------------------|------------------------|----------------------------------------------------|\n| `dataSource`      | `DSFDataSource`        | The source of data for the graph                   |\n| `upsideDown`      | `Bool`                 | If true, draws from the top of the graph downwards |\n| `unsetGraphColor` | `NSColor`<br>`UIColor` | The color to use when drawing the background       |\n\n### Win/Loss graph customizations (`DSFSparklineWinLossGraphView`)\n\n| Setting        | Type                   | Description                       |\n|----------------|------------------------|-----------------------------------|\n| `dataSource`   | `DSFDataSource`        | The source of data for the graph  |\n| `lineWidth`    | `CGFloat`              | The line width for the stroke     |\n| `barSpacing`   | `CGFloat`              | The spacing between each bar      |\n| `winColor`     | `NSColor`<br>`UIColor` | The color to use for a 'win'      |\n| `lossColor`    | `NSColor`<br>`UIColor` | The color to use for a 'loss'     |\n| `tieColor`     | `NSColor`<br>`UIColor` | *(optional)* The color to use for a 'tie'. If nil, tie (0) values are not drawn<br>By default, 'tie' values are not drawn. |\n\n### Tablet graph customizations (`DSFSparklineTabletGraphView`)\n\n| Setting      | Type                   | Description                                      |\n|--------------|------------------------|--------------------------------------------------|\n| `dataSource` | `DSFDataSource`        | The source of data for the graph                 |\n| `lineWidth`  | `CGFloat`              | The line width for the stroke                    |\n| `barSpacing` | `CGFloat`              | The spacing between each bar                     |\n| `winColor`   | `NSColor`<br>`UIColor` | The color to draw the filled circle for a 'win'  |\n| `lossColor`  | `NSColor`<br>`UIColor` | The color to draw the filled circle for a 'loss' |\n\n### Pie graph customizations (`DSFSparklinePieGraphView`)\n\n| Setting             | Type                   | Description                                                                             |\n|---------------------|------------------------|-----------------------------------------------------------------------------------------|\n| `dataSource`        | `[CGFloat]`            | The data to display in the pie chart                                                    |\n| `palette`           | `DSFSparklinePalette`  | The palette to use when drawing the chart                                               |\n| `strokeColor`       | `NSColor`<br>`UIColor` | (optional) The color of the line to draw between each segment. If nil, no line is drawn |\n| `lineWidth`         | `CGFloat`              | The width of the lines to draw between each segment                                     |\n| `animated`          | `Bool`                 | If true, when the data source is set the segments animate into view                     |\n| `animationDuration` | `CGFloat `             | The duration of the animation                                                           |\n\n### Databar graph customizations (`DSFSparklineDataBarGraphView`)\n\n| Setting             | Type                   | Description                                                                                                            |\n|---------------------|------------------------|------------------------------------------------------------------------------------------------------------------------|\n| `dataSource`        | `[CGFloat]`            | The data to display in the pie chart                                                                                   |\n| `maximumTotalValue` | `CGFloat`              | If <= 0 the data represents a percentage of the total, if > 0 represents the rightmost value to the databar            |\n| `palette`           | `DSFSparklinePalette`  | The palette to use when drawing.                                                                                       |\n| `strokeColor`       | `NSColor`<br>`UIColor` | (optional) The color of the line to draw between each segment. If nil, no line is drawn                                |\n| `lineWidth`         | `CGFloat`              | The width of the lines to draw between each segment                                                                    |\n| `unsetColor`        | `NSColor`<br>`UIColor` | (optional) If the maximum value is set, if the segments don't fit the total this color is used as the background color |\n| `animated`          | `Bool`                 | If true, when the data source is set the segments animate into view                                                    |\n| `animationDuration` | `CGFloat`              | The duration of the animation                                                                                          |\n\n### Percent Bar graph customizations (`DSFSparklinePercentBarGraphView`)\n\n| Setting             | Type                   | Description                                                                                                            |\n|---------------------|------------------------|--------------------------------------------------------|\n| `value`        | `CGFloat`            | The value to display in the pie chart |\n| `displayStyle` | `Style` | The style to apply when drawing the graph |\n| `cornerRadius`           | `CGFloat`  | The corner radius for the bar. |\n| `showLabel` | `Bool` | Should we draw a text label on the percent bar? |\n| `underBarColor` | `NSColor`<br>`UIColor` | The background of the bar color for the percent bar chart |\n| `underBarTextColor` | `NSColor`<br>`UIColor` | The color for text displayed on the background |\n| `barColor` | `NSColor`<br>`UIColor` | The bar color for the percent bar chart |\n| `barTextColor` | `NSColor`<br>`UIColor` | The color for text displayed on the bar |\n| `fontName` | `String` | The name of the label font |\n| `fontSize` | `CGFloat` | The size of the label font  |\n| `shouldAnimate` | `Bool` | If true, when the data source is set the segments animate into view |\n| `animationDuration` | `CGFloat` | The duration of the animation |\n| `leftInset`.  | `CGFloat` | The bar's inset from the left of the control |\n| `topInset`    | `CGFloat` | The bar's inset from the top of the control |\n| `rightInset`  | `CGFloat` | The bar's inset from the right of the control |\n| `bottomInset` | `CGFloat` | The bar's inset from the bottom of the control |\n\n</details>\n\n## Screenshots\n\n### In app\n\n| macOS dark | macOS light | iOS |\n|----|----|----|\n| <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_dark.png\" width=\"300\"> | <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_light.png\" width=\"300\"> | <img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_iOS_animated.gif\"> |\n\n### Interface Builder\n\n| macOS | tvOS |\n|----|----|\n|<a href=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_interfacebuilder.png\"><img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_interfacebuilder.png\" width=\"303\"></a>|<a href=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_interfacebuilder-2.png\"><img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_interfacebuilder-2.png\" width=\"420\"></a>|\n\n### SwiftUI\n\n<a href=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/SwiftUI1.jpg\"><img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/SwiftUI1.jpg\" width=\"400\"></a>\n\n### NSAttributedString support\n\n<img src=\"https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/attributed-string.png\" width=\"232\">\n\n### Animated\n\n![](https://github.com/dagronf/dagronf.github.io/raw/master/art/projects/DSFSparkline/DSFSparkline_lots.gif)\n\n## Changes\n\n### `7.0.0`\n\n* Removed support for macOS 10.11, 10.12\n* Removed support for iOS 13, tvOS 13\n* Removed CocoaPods support (if you need Cocoapods, stick with v6).\n\n### `6.0.0`\n\n* Added CircularGauge, CircularProgress sparkline types\n* Removed support for `@IBDesignable` and `@IBInspectable` from the NSView/UIView implementations, as Xcode has indicated that it will be dropping support in the near future\n\n### `5.2.0`\n\n* Added grid-lines support for pre-built views (line, bar, stack) (NSView/UIView/SwiftUI)\n\n### `5.1.0`\n\n* Added Activity Grid\n\n### `5.0.0`\n\n* Fixed [occasional clipping](https://github.com/dagronf/DSFSparkline/issues/13) on interpolated line graphs.\n\n### `4.6.0`\n\n* Added WiperGauge sparkline type\n\n### `4.3.0`\n\n* Added the ability to custom-draw markers for the 'line' sparkline type [(raised issue)](https://github.com/dagronf/DSFSparkline/issues/6)\n* Fixed a minor issue where insetting certain graph types to remove clipping (line with markers, bar) would mean that zeroline, highlight overlays and grids would be appear to be very slightly off.\n\n### `4.2.0`\n\n* Added 'percent bar' sparkline type.\n\n### `4.1.2`\n\n* Fixed compile issue [Cannot find type 'NSTextAttachment' in scope\" crashes when using SwiftPackage](https://github.com/dagronf/DSFSparkline/issues/5)\n\n### `4.1.1`\n\n* Fixed gradient bucket count issue. \n* Added AttributedString SwiftUI demo to the ReportView demo. Demo uses [The SwiftUI Lab Attributed String](https://swiftui-lab.com/attributed-strings-with-swiftui/) with AppKit bug fix for width calculation.\n\n### `4.1.0`\n\n* Embed sparklines in NSAttributedString.\n\n### `4.0.0`\n\nSubstantial re-architect of the drawing code (that used to be directly in the views) into overlays and surfaces that are far more flexible (for example, being able to draw a sparkline bitmap without having to create a view)\n\nThe previous view/swiftui types are still available - they have been rebuilt on using the new overlay scheme and are referred to in documentation as 'prebuilt' types. This allowed backwards compatibility with previous versions of the library.  Note however that given that the prebuilt views have been re-written there is a possibility of slight visual differences.\n\n### `3.7.0`\n\n* Added stripe graph\n\n### `3.6.1`\n\n* Fixed animations on iOS/tvOS\n\n### `3.6.0`\n\n* Added pie chart, databar chart.\n* Added ability to show data markers for line graphs\n\n### `3.5.2`\n\n* Fixed Objective-C Demo app\n* Added `snapshot` method to the base sparkline view class to produce an NSImage/UIImage version of the sparkline for embedded sparklines in text etc.\n\n### `3.5.1`\n\n* Fixed version in podspec\n\n### `3.5.0`\n\n* Added stackline sparkline type\n* Added win/loss/tie sparkline type\n* Added tablet sparkline type\n\n### `3.4.0`\n\n* Added support for centering line and bar graphs around their zero-line value.\n\n### `3.3.0`\n\n* Fixed issue where iOS background wasn't being drawn correctly in some cases.\n* Fixed rare crash where a line graph with < 2 points would crash.\n\n### `3.2.0`\n\n* Changed the zero-line definition class to `DSFSparklineZeroLineDefinition` for clarity.\n* More documentation, especially around SwiftUI. Attempted to make the documentation clearer around drawing parameters.\n\n### `3.1.0`\n\n* Add the ability to customize the zero-line display ([Tito Ciuro](https://github.com/tciuro))\n* Changed `showZero` to `showZeroLine` for consistency with the new zero-line display values\n\n### `3.0.0`\n\n* Add the ability to set the 'zero' line value. Defaults to zero for backwards compatibility.\n\nYou can set where the 'zero' line draws via the `zeroLineValue` on the datasource.\n\n### `2.0.0`\n\n* The primary views have been renamed with a `View` postfix. So\n\n   `DSFSparklineLineGraph` -> `DSFSparklineLineGraphView`\n   \n   `DSFSparklineBarGraph` -> `DSFSparklineBarGraphView`\n   \n   `DSFSparklineDotGraph` -> `DSFSparklineDotGraphView`\n\n* Renamed `SLColor` and `SLView` to `DSFColor` and `DSFView` for module naming consistency.\n\n* I removed `windowSize` from the core `DSFSparklineDataSourceView`. `windowSize` is related to data, and should never have been part of the UI definition.  I've provided a replacement purely for `IBDesignable` support called `graphWindowSize` which should only be called from Interface Builder.  If you want to set the windowSize from your xib file, set the `graphWindowSize` inspectable.\n\n\tIf you see warnings in the log like \n`2020-12-07 18:22:51.619867+1100 iOS Sparkline Demo[75174:1459637] Failed to set (windowSize) user defined inspected property on (DSFSparkline.DSFSparklineBarGraphView): [<DSFSparkline.DSFSparklineBarGraphView 0x7fe2eb10f2b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key windowSize.\n`\nit means that you have a `windowSize` value set in your .xib file.  Remove it and set the `graphWindowSize` value instead.\n\n* For the Bar type, `lineWidth` and `barSpacing` now represent the pixel spacing between bars and the pixel width for the line.  You may find that your line spacing and bar spacing are now incorrect if you have set fractional values for these in the past (for example, if you set lineWidth = 0.5).  The reason for this change is to aid drawing lines on pixel boundaries and avoid antialiasing.\n\n* Fix for zero line being upside-down\n\n## License\n\nMIT. Use it for anything you want, just attribute my work. Let me know if you do use it somewhere, I'd love to hear about it!\n\n```\nMIT License\n\nCopyright (c) 2025 Darren Ford\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n"
  },
  {
    "path": "Sources/DSFSparkline/DSFSparklines.h",
    "content": "//\n//  DSFSparklines.h\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/6/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#import <Cocoa/Cocoa.h>\n\n//! Project version number for DSFSparklines.\nFOUNDATION_EXPORT double DSFSparklinesVersionNumber;\n\n//! Project version string for DSFSparklines.\nFOUNDATION_EXPORT const unsigned char DSFSparklinesVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <DSFSparklines/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Sources/DSFSparkline/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2019 Darren Ford. All rights reserved.</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/DSFSparkline/datasource/DSFSparkline+DataSource.swift",
    "content": "//\n//  DSFSparkline+DataSource.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic extension DSFSparkline {\n\n\t/// A datasource for a sparkline\n\t@objc(DSFSparklineDataSource) class DataSource: NSObject {\n\n\t\tpublic static let DefaultWindowSize: UInt = 10\n\n\t\t/// Notification sent when the content of the data source changes\n\t\t@objc(DSFSparklineDataSourceDataChangedNotification)\n\t\tstatic let DataChangedNotification = NSNotification.Name(\"DSFSparklineDataSource.DataChanged\")\n\n\t\tprivate let sparkline: SparklineWindow<CGFloat>\n\n\t\t@objc public override init() {\n\t\t\tself.sparkline = SparklineWindow<CGFloat>(windowSize: DataSource.DefaultWindowSize)\n\t\t\tsuper.init()\n\t\t}\n\n\n\t\t/// Create a data source\n\t\t/// - Parameters:\n\t\t///   - windowSize: The size of the window to use\n\t\t///   - range: (optional) the clamped y-range of data to display. Values outside this range are clamped\n\t\t///   - zeroLineValue: the zero-line value for the source. Defaults to zero (0)\n\t\tpublic init(windowSize: UInt = DataSource.DefaultWindowSize,\n\t\t\t\t\t\trange: ClosedRange<CGFloat>? = nil,\n\t\t\t\t\t\tzeroLineValue: CGFloat = 0) {\n\t\t\tself.sparkline = SparklineWindow<CGFloat>(windowSize: windowSize)\n\t\t\tself.sparkline.yRange = range\n\t\t\tself.sparkline.zeroLineValue = zeroLineValue\n\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Create a datasource from a series of values\n\t\t/// - Parameters:\n\t\t///   - values: The values to initially assign to the datasource\n\t\t///   - range: (optional) The maximum range to represent.\n\t\tpublic convenience init(values: [CGFloat], range: ClosedRange<CGFloat>? = nil) {\n\t\t\tself.init(windowSize: UInt(values.count), range: range)\n\t\t\tself.set(values: values)\n\t\t}\n\t}\n}\n\npublic extension DSFSparkline.DataSource {\n\toverride var description: String {\n\t\t\"\"\"\n\t\tDataSource: windowSize: \\(sparkline.windowSize), zeroLine: \\(sparkline.zeroLineValue), range: \\(String(describing: sparkline.yRange)), emptyCount: \\(sparkline.emptyValueCount))\n\t\t\tdata: \\(sparkline.raw)\n\t\t\tnorm: \\(sparkline.normalized)\n\t\t\"\"\"\n\t}\n}\n\n// MARK: - Value handling\n\npublic extension DSFSparkline.DataSource {\n\n\t/// The series of data points with the most recent being the last array entry\n\t@objc var data: [CGFloat] {\n\t\tself.sparkline.raw\n\t}\n\n\t/// Return the raw values in the data source scaled from 0.0 -> 1.0\n\t@objc var normalized: [CGFloat] {\n\t\tself.sparkline.normalized\n\t}\n\n\t/// The number of data points to display in the sparkline\n\t@objc var windowSize: UInt {\n\t\tget {\n\t\t\tself.sparkline.windowSize\n\t\t}\n\t\tset {\n\t\t\tself.sparkline.windowSize = newValue\n\t\t\tself.notifyDataChange()\n\t\t}\n\t}\n\n\t/// The number of unfilled buckets in the sparkline\n\t@objc var emptyValueCount: UInt {\n\t\treturn self.sparkline.emptyValueCount\n\t}\n\n\t/// The 'zero' line for drawing the horizontal line. Should be in the range lowerBound ..< upperBound\n\t@objc var zeroLineValue: CGFloat {\n\t\tget {\n\t\t\tself.sparkline.zeroLineValue\n\t\t}\n\t\tset {\n\t\t\tself.sparkline.zeroLineValue = newValue\n\t\t\tself.notifyDataChange()\n\t\t}\n\t}\n\n\t// Is the value at the specified offset in the data source BELOW the zero-line value?\n\t@inlinable func valueAtOffsetIsBelowZeroline(_ offset: Int) -> Bool {\n\t\treturn self.data[offset] < self.zeroLineValue\n\t}\n}\n\n\npublic extension DSFSparkline.DataSource {\n\t\n\t/// Add a new value. If there are more values than the window size, the oldest value is discarded\n\t@discardableResult\n\t@objc func push(value: CGFloat) -> Bool {\n\t\tdefer {\n\t\t\tself.notifyDataChange()\n\t\t}\n\t\treturn self.sparkline.push(value: value)\n\t}\n\n\t/// Add a vector of new values. Equivalent to push(values[0]), push(values[1]), push(values[2]) etc.\n\t@objc func push(values: [CGFloat]) {\n\t\tself.sparkline.push(values: values)\n\t\tself.notifyDataChange()\n\t}\n\n\t/// Set the sparkline data to the specified values. The window size is changed to reflect the extent of the input data\n\t@objc func set(values: [CGFloat]) {\n\t\tself.sparkline.set(values: values)\n\t\tself.notifyDataChange()\n\t}\n\n\t/// Reset the data to the lower bound for all data points in the window\n\t@objc func reset() {\n\t\tself.sparkline.reset()\n\t\tself.notifyDataChange()\n\t}\n}\n\n// MARK: - Range support (Swift)\n\npublic extension DSFSparkline.DataSource {\n\n\t/// The current minimum/maximum range for the values, or nil if there is no range specified\n\tvar range: ClosedRange<CGFloat>? {\n\t\tget {\n\t\t\tself.sparkline.yRange\n\t\t}\n\t\tset {\n\t\t\tself.sparkline.yRange = newValue\n\t\t\tself.notifyDataChange()\n\t\t}\n\t}\n}\n\n// MARK: - Range support (Objc)\n\npublic extension DSFSparkline.DataSource {\n\n\t/// Returns the lower bound for the current set of values.  If no values are present, returns CGFloat.greatestFiniteMagnitude\n\t@objc var lowerBound: CGFloat {\n\t\treturn self.sparkline.yRange?.lowerBound ?? CGFloat.greatestFiniteMagnitude\n\t}\n\n\t/// Returns the upper bound for the current set of values.  If no values are present, returns CGFloat.greatestFiniteMagnitude\n\t@objc var upperBound: CGFloat {\n\t\treturn self.sparkline.yRange?.upperBound ?? CGFloat.greatestFiniteMagnitude\n\t}\n\n\t/// Set a range using discrete upper and lower bounds\n\t@objc func setRange(lowerBound: CGFloat, upperBound: CGFloat) {\n\t\tassert(lowerBound < upperBound)\n\t\tself.sparkline.yRange = lowerBound ... upperBound\n\t\tself.notifyDataChange()\n\t}\n\n\t/// Set a range using discrete upper and lower bounds, drawing a line at the 'zero' point within the range\n\t@objc func setRange(lowerBound: CGFloat, upperBound: CGFloat, zeroLinePoint: CGFloat) {\n\t\tassert(lowerBound <= zeroLinePoint && zeroLinePoint <= upperBound)\n\t\tself.sparkline.yRange = lowerBound ... upperBound\n\t\tself.sparkline.zeroLineValue = zeroLinePoint\n\t\tself.notifyDataChange()\n\t}\n\n\t/// Remove the range restrictions for the data source\n\t@objc func resetRange() {\n\t\tself.range = nil\n\t\tself.notifyDataChange()\n\t}\n}\n\n// MARK: - Internal\n\nextension DSFSparkline.DataSource {\n\n\t/// The number of items added since last reset\n\tvar counter: UInt {\n\t\treturn self.sparkline.counter\n\t}\n\n\t// Normalize the specified value within 0.0 ... 1.0 for the current data\n\tfunc normalize(value: CGFloat) -> CGFloat {\n\t\treturn self.sparkline.normalize(value: value)\n\t}\n\n\t// Normalize the zero-line value within 0.0 ... 1.0 for the current data\n\tvar normalizedZeroLineValue: CGFloat {\n\t\treturn self.normalize(value: self.zeroLineValue)\n\t}\n\n\tfileprivate func notifyDataChange() {\n\t\tNotificationCenter.default.post(name: DSFSparkline.DataSource.DataChangedNotification, object: self)\n\t}\n}\n\npublic extension DSFSparkline.DataSource {\n\n\t/// Return the vertical fractional position within the data window that represents\n\t/// zero for the current set of data.\n\tfunc fractionalZeroPosition() -> CGFloat {\n\t\treturn fractionalPosition(for: 0.0)\n\t}\n\n\t/// Return the vertical fractional position within the data window that represents\n\t/// the zero line value for the current set of data.\n\tfunc fractionalPosition(for value: CGFloat) -> CGFloat {\n\t\tlet result: CGFloat\n\t\tif let r = self.range {\n\t\t\t// If a fixed range is specified, calculate the zero line from the specified range\n\t\t\tlet full = r.upperBound - r.lowerBound\t\t// full range width\n\t\t\tresult = abs(value - r.lowerBound) / full\n\t\t}\n\t\telse {\n\t\t\t// If no fixed range is specified, calculate the zero line position using the current range of the data.\n\t\t\tresult = self.normalize(value: value)\n\t\t}\n\n\t\t// Clamp to 0.0 -> 1.0\n\t\treturn min(max(result, 0.0), 1.0)\n\t}\n}\n\n// In order to clean up some of the code, I've moved the declaration of the data source into a\n// DSFSparkline 'namespace' to match with the new DSFSparkline.StaticDataSource type\n//\n// A simple name change (DSFSparklineDataSource -> DSFSparkline.DataSource) in your code will fix this issue\n@available(*, deprecated, message: \"Move to using DSFSparkline.DataSource instead (simple name change)\")\npublic typealias DSFSparklineDataSource = DSFSparkline.DataSource\n"
  },
  {
    "path": "Sources/DSFSparkline/datasource/DSFSparkline+StaticDataSource.swift",
    "content": "//\n//  DSFSparkline+StaticDataSource.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\npublic extension DSFSparkline {\n\t/// A simple data source containing an array of values.\n\t@objc(DSFSparklineStaticDataSource) class StaticDataSource: NSObject {\n\t\t/// The datasource values\n\t\tlet values: [CGFloat]\n\n\t\t/// The minimum value in the data source, excluding .infinite values\n\t\tlet minValue: CGFloat\n\t\t/// The maximum value in the data source, excluding .infinite values\n\t\tlet maxValue: CGFloat\n\n\t\t/// The total of all the values within the datasource, excluding .infinite values\n\t\t@objc public let total: CGFloat\n\n\t\t/// The allowable range of values for this source. If nil, there are no bounds for the source\n\t\tpublic let valueBounds: ClosedRange<CGFloat>?\n\n\t\t/// Create an empty data source\n\t\t@objc override public convenience init() {\n\t\t\tself.init([])\n\t\t}\n\n\t\t/// Create a data source with the specified values\n\t\t/// - Parameter values: The datasource values\n\t\t@objc public init(_ values: [CGFloat]) {\n\t\t\tself.values = values\n\t\t\tself.valueBounds = nil\n\n\t\t\tlet nonInfiniteValues = values.filter { !$0.isInfinite }\n\t\t\tself.minValue = nonInfiniteValues.min() ?? 0.0\n\t\t\tself.maxValue = nonInfiniteValues.max() ?? 1.0\n\t\t\tself.total = nonInfiniteValues.reduce(0) { $0 + $1 }\n\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Create a static data source with values and upper/lower bounds values\n\t\t/// - Parameters:\n\t\t///   - values: The values to be displayed\n\t\t///   - lowerBound: The lower bounds of the data\n\t\t///   - upperBound: The upper bounds of the data\n\t\t@objc public convenience init(_ values: [CGFloat], lowerBound: CGFloat, upperBound: CGFloat) {\n\t\t\tassert(lowerBound < upperBound)\n\t\t\tself.init(values, range: lowerBound ... upperBound)\n\t\t}\n\n\t\t/// Create a static data source with values and upper/lower bounds values\n\t\t/// - Parameters:\n\t\t///   - values: The values to be displayed\n\t\t///   - range: The allowable range for each value\n\t\tpublic init(_ values: [CGFloat], range: ClosedRange<CGFloat>) {\n\t\t\tself.valueBounds = range\n\n\t\t\tlet clampedValues = values.map { $0.isInfinite ? .infinity : $0.clamped(to: range) }\n\t\t\tself.values = clampedValues\n\n\t\t\tlet nonInfiniteValues = clampedValues.filter { !$0.isInfinite }\n\t\t\tself.total = nonInfiniteValues.reduce(0) { $0 + $1 }\n\t\t\tself.minValue = nonInfiniteValues.min() ?? 0.0\n\t\t\tself.maxValue = nonInfiniteValues.max() ?? 1.0\n\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Return the fractional (0 ... 1) value for the specified value, or .infinity if the value is infinite\n\t\t/// - Parameter value: The value to convert to a fractional value within the range of the datasource\n\t\t/// - Returns: A fractional value, or nil when value == .infinity\n\t\t@objc public func fractionalValue(for value: CGFloat) -> CGFloat {\n\t\t\tif value == .infinity { return .infinity }\n\t\t\tif let r = valueBounds {\n\t\t\t\tlet v = value.clamped(to: r)\n\t\t\t\treturn (v - r.lowerBound) / (r.upperBound - r.lowerBound)\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (value - self.minValue) / (self.maxValue - self.minValue)\n\t\t\t}\n\t\t}\n\n\t\t/// Return the fractional (0 ... 1) value for the specified value\n\t\t/// - Parameter index: The indexed offset of the datasource to retrieve the fractional value for\n\t\t/// - Returns:\n\t\t///    * If the index is outside the scope of the data source, returns `.nan`\n\t\t///    * If the value at the index is infinite, returns `.infinity`\n\t\t///    * If the value at the index is not infinite, returns the fractional value\n\t\tpublic func fractionalValue(at index: Int) -> CGFloat {\n\t\t\tguard index < self.values.count else { return .nan }\n\t\t\treturn self.fractionalValue(for: self.values[index])\n\t\t}\n\t}\n}\n\npublic extension DSFSparkline.StaticDataSource {\n\toverride var description: String {\n\t\t\"\"\"\n\t\tStaticDataSource: count: \\(values.count), totalValue: \\(self.total)\n\t\t\tvalues: \\(self.values)\n\t\t\"\"\"\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/datasource/data-core/SparklineData.swift",
    "content": "//\n//  SparklineData.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 22/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\nclass SparklineData<T> where T: BinaryFloatingPoint {\n\n\tvar yRange: ClosedRange<T>? = nil {\n\t\tdidSet {\n\t\t\tself.normalized = self.normalize()\n\t\t}\n\t}\n\n\tvar yMin: T? { return self.yRange?.lowerBound ?? self.yData.min() }\n\tvar yMax: T? { return self.yRange?.upperBound ?? self.yData.max() }\n\n\tvar yData: [T] = [] {\n\t\tdidSet {\n\t\t\tself.normalized = self.normalize()\n\t\t}\n\t}\n\n\tpublic private(set) var normalized: [T] = []\n\n\tinit(range: ClosedRange<T>? = nil) {\n\t\tself.yRange = range\n\t}\n\n\t/// Return a normalized (scaled 0.0 -> 1.0) of the supplied value\n\tfunc normalize(value: T) -> T {\n\t\tguard let min = yMin, let max = self.yMax else {\n\t\t\treturn 0.0\n\t\t}\n\t\tlet diff = (max - min)\n\t\tif diff == 0 {\n\t\t\treturn 0.0\n\t\t}\n\n\t\treturn ((value - min) / diff)\n\t}\n\n\t/// Return a normalized (scaled 0.0 -> 1.0) of the current set of data\n\tprivate func normalize() -> [T] {\n\n\t\tguard let min = yMin, let max = self.yMax else {\n\t\t\treturn []\n\t\t}\n\n\t\t// Move the data to 0.0 -> 1.0 scale\n\t\tlet diff = (max - min)\n\t\tif diff == 0 {\n\t\t\treturn Array<T>(repeating: 0.0, count: yData.count)\n\t\t}\n\n\t\treturn yData.map { val in\n\t\t\t((val - min) / diff)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/datasource/data-core/SparklineWindow.swift",
    "content": "//\n//  SparklineWindow.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n/// The sparkline 'window' represents the data window to be displayed in the graph\n/// It is meant to represent the _data_ for the graph, not the way that the graph draws.\nclass SparklineWindow<T> where T: BinaryFloatingPoint {\n\n\tprivate let NormalizedRange: ClosedRange<T> = 0.0 ... 1.0\n\tprivate let data: SparklineData<T>\n\n\t/// Optional fixed range for the data being displayed\n\tpublic var yRange: ClosedRange<T>? {\n\t\tget {\n\t\t\tself.data.yRange\n\t\t}\n\t\tset {\n\t\t\tself.data.yRange = newValue\n\t\t}\n\t}\n\n\t/// The number of items added since last reset\n\tvar counter: UInt = 0\n\n\t/// Raw values\n\tvar raw: [T] { return self.data.yData }\n\n\t/// The normalized data (range 0.0 -> 1.0) depending on the range\n\tvar normalized: [T] { return self.data.normalized }\n\n\t/// The size of the sparkline data window\n\tvar windowSize: UInt {\n\t\tget {\n\t\t\treturn UInt(self.data.yData.count)\n\t\t}\n\t\tset {\n\t\t\tlet sz = self.data.yData.count\n\t\t\tif newValue > sz {\n\t\t\t\tlet inserter = Array<T>(repeating: self.data.yRange?.lowerBound ?? 0.0, count: Int(newValue) - sz)\n\t\t\t\tself.data.yData.insert(contentsOf: inserter, at: 0)\n\t\t\t}\n\t\t\telse if newValue < sz {\n\t\t\t\tself.data.yData.removeSubrange(0 ..< sz - Int(newValue))\n\t\t\t}\n\t\t}\n\t}\n\n\t/// The number if of 'empty' buckets in the current window\n\tvar emptyValueCount: UInt {\n\t\tif self.counter > self.windowSize {\n\t\t\treturn 0\n\t\t}\n\t\treturn self.windowSize - self.counter\n\t}\n\n\t/// The 'zero' line for drawing the horizontal line.\n\tvar zeroLineValue: T = 0.0\n\n\t/// Create a sparkline data window with an optional data range\n\t/// - Parameters:\n\t///   - windowSize: The number of data points to be kept in the spark line\n\t///   - dataRange: The max/min values\n\tinit(windowSize: UInt, dataRange: ClosedRange<T>? = nil) {\n\t\tassert(windowSize > 0)\n\t\tself.data = SparklineData<T>(range: dataRange)\n\t\tself.data.yData = Array<T>(repeating: dataRange?.lowerBound ?? 0.0, count: Int(windowSize))\n\t}\n\n\t/// Normalize a value to the current range of the sparkline\n\t/// - Parameter value: the value to normalize\n\t/// - Return a value 0.0 -> 1.0\n\tpublic func normalize(value: T) -> T {\n\t\treturn self.data.normalize(value: value).clamped(to: NormalizedRange)\n\t}\n\n\t/// Push a new value into the sparkline. If the value is outside a specified range, then\n\t/// - Parameter value: The value to push into the sparkline\n\t/// - Return whether the\n\t@discardableResult\n\tpublic func push(value: T) -> Bool {\n\t\tlet plotValue: T\n\t\tif let r = self.data.yRange, !r.contains(value) {\n\t\t\tplotValue = min(r.upperBound, max(r.lowerBound, value))\n\t\t\tSwift.print(\"WARN: Value \\(value) outside specified range \\(r), truncating to \\(plotValue)\")\n\t\t}\n\t\telse {\n\t\t\tplotValue = value\n\t\t}\n\n\t\tvar temp = self.data.yData\n\t\ttemp.removeFirst()\n\t\ttemp.append(plotValue)\n\t\tself.data.yData = temp\n\n\t\tself.counter += 1\n\n\t\treturn true\n\t}\n\n\tpublic func push(values: [T]) {\n\n\t\tself.counter += UInt(values.count)\n\n\t\tvar temp = self.data.yData\n\n\t\t// The difference between\n\t\tlet diff = temp.count - values.count\n\t\tif diff < 0 {\n\t\t\t// There are more data points than the window size\n\t\t\ttemp = values\n\t\t\ttemp.removeFirst(abs(diff))\n\t\t}\n\t\telse if diff == 0 {\n\t\t\ttemp = values\n\t\t}\n\t\telse {\n\t\t\ttemp.removeFirst(min(values.count, temp.count))\n\t\t\ttemp.append(contentsOf: values)\n\t\t}\n\t\tself.data.yData = temp\n\t}\n\n\tpublic func set(values: [T]) {\n\t\tif let yRange = self.data.yRange {\n\t\t\tself.data.yData = values.map { $0.clamped(to: yRange) }\n\t\t}\n\t\telse {\n\t\t\tself.data.yData = values\n\t\t}\n\t\tself.counter = UInt(values.count)\n\t}\n\n\tpublic func reset() {\n\t\tself.counter = 0\n\t\tself.data.yData = Array<T>(repeating: self.data.yRange?.lowerBound ?? 0.0,\n\t\t\t\t\t\t\t\t\t\t\tcount: Int(self.windowSize))\n\t}\n}\n\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/core/DSFSparklineOverlay+Centerable.swift",
    "content": "//\n//  DSFSparklineOverlay+Centerable.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t/// A graph that can be centered around the datasource's zero-line.\n\t///\n\t/// You don't generally create this class yourself, you inherit from it if your overlay type can be\n\t/// centered around the zero-line of the data.\n\t@objc(DSFSparklineOverlayCenterableGraph) class Centerable: DSFSparklineOverlay.DataSource {\n\t\t/// Should the graph be centered at the zero line defined in the datasource?\n\t\t@objc public var centeredAtZeroLine: Bool = false {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t// MARK: - Primary\n\n\t\t/// The primary color for the sparkline\n\t\t@objc public var primaryStrokeColor: CGColor? = .black {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The primary fill color for the sparkline\n\t\t@objc public var primaryFill: DSFSparklineFillable? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t// MARK: - Secondary\n\n\t\t/// The color used to draw lines below the zero-line (if centeredAtZeroLine=true)\n\t\t@objc public var secondaryStrokeColor: CGColor? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The fill color to use for parts of the graph below the zero-line (if centeredAtZeroLine=true)\n\t\t@objc public var secondaryFill: DSFSparklineFillable? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t// MARK: - Initializers\n\n\t\t@objc public init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\toverride public init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.centeredAtZeroLine = orig.centeredAtZeroLine\n\t\t\tself.primaryStrokeColor = orig.primaryStrokeColor\n\t\t\tself.primaryFill = orig.primaryFill?.copyFill()\n\t\t\tself.secondaryStrokeColor = orig.secondaryStrokeColor\n\t\t\tself.secondaryFill = orig.secondaryFill?.copyFill()\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/core/DSFSparklineOverlay+DataSource.swift",
    "content": "//\n//  DSFSparklineOverlay+DataSource.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\n\t/// An overlay that contains a DSFSparklineDataSource.\n\t///\n\t/// Generally you don't create one of these yourself, you subclass it\n\t@objc(DSFSparklineDataSourceOverlay) class DataSource : DSFSparklineOverlay {\n\t\t/// The datasource for displaying the overlay\n\t\t@objc public var dataSource: DSFSparkline.DataSource? {\n\t\t\tdidSet {\n\t\t\t\t// Update our observer to detect changes to data in this new DataSource\n\t\t\t\tself.updateDataObserver()\n\n\t\t\t\t// And tell any listeners that the datasource was changed\n\t\t\t\tself.dataSourceContentDidChange()\n\t\t\t}\n\t\t}\n\n\t\t// Listen for changes in the data and update appropriately\n\t\tprivate var dataObserver: NSObjectProtocol?\n\n\t\t// Update the observer to point to a new datasource\n\t\tprivate func updateDataObserver() {\n\t\t\tself.dataObserver = nil\n\t\t\tif let datasource = self.dataSource {\n\t\t\t\tself.dataObserver = NotificationCenter.default.addObserver(\n\t\t\t\t\tforName: DSFSparkline.DataSource.DataChangedNotification,\n\t\t\t\t\tobject: datasource,\n\t\t\t\t\tqueue: nil, using: { [weak self] _ in\n\t\t\t\t\t\tself?.dataSourceContentDidChange()\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t/// Overridable to allow overlays to be notified when the content of the data source changes\n\t\tinternal func dataSourceContentDidChange() {\n\t\t\tself.setNeedsDisplay()\n\t\t}\n\n\t\t// MARK: Initializers\n\n\t\t@objc public init(dataSource: DSFSparkline.DataSource? = nil) {\n\t\t\tself.dataSource = dataSource\n\t\t\tsuper.init()\n\t\t}\n\n\t\toverride public init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.dataObserver = orig.dataObserver\n\t\t\tself.dataSource = orig.dataSource\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tsuper.init(coder: coder)\n\t\t}\n\n\t\tdeinit {\n\t\t\tself.dataObserver = nil\n\t\t\tself.dataSource = nil\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/core/DSFSparklineOverlay+StaticDataSource.swift",
    "content": "//\n//  DSFSparklineOverlay+StaticDataSource.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t/// A data source that displays a static set of data, like for a pie chart\n\t@objc(DSFSparklineOverlayStaticDataSource) class StaticDataSource: DSFSparklineOverlay {\n\t\t/// The data to be displayed in this graph\n\t\t///\n\t\t/// The values become a percentage of the total value stored within the\n\t\t/// dataStore, and as such each value ends up being drawn as a fraction of the total.\n\t\t/// So for example, if you want the pie chart to represent the number of red cars vs. number of\n\t\t/// blue cars, you just set the values directly.\n\t\t@objc public var dataSource = DSFSparkline.StaticDataSource() {\n\t\t\tdidSet {\n\t\t\t\tself.staticDataSourceDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// Datasource values\n\t\t@objc public var values: [CGFloat] {\n\t\t\tget { self.dataSource.values }\n\t\t\tset { self.dataSource = .init(newValue) }\n\t\t}\n\n\t\t@objc public override init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\toverride public init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.dataSource = orig.dataSource\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\t/// Overridable to allow overlays to be notified when the data source is changed\n\t\tfunc staticDataSourceDidChange() {\n\t\t\t// Do nothing\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/core/DSFSparklineOverlay.swift",
    "content": "//\n//  DSFSparklineOverlay.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\n/// The core sparkline overlay class.\n///\n/// All sparkline renderers must inherit from this class\n@objc public class DSFSparklineOverlay: CALayer {\n\toverride public init() {\n\t\tsuper.init()\n\t\tself.configure()\n\t}\n\n\toverride public init(layer: Any) {\n\t\tsuper.init(layer: layer)\n\t\tself.configure()\n\t}\n\n\trequired init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tprivate func configure() {\n\t\tself.anchorPoint = CGPoint(x: 0, y: 0)\n\t\tself.isOpaque = false\n\n\t\t// Disable the implicit animations on the layer to stop the fade when data changes\n\t\tlet newActions = [\n\t\t\t\"onOrderIn\": NSNull(),\n\t\t\t\"onOrderOut\": NSNull(),\n\t\t\t\"sublayers\": NSNull(),\n\t\t\t\"contents\": NSNull(),\n\t\t\t\"bounds\": NSNull(),\n\t\t]\n\n\t\tself.actions = newActions\n\t}\n\n\t/// Return the minimum edge insets required to fit the graph within the specified rect\n\t///\n\t/// An example of this is a line graph with markers - if a data point is at zero, the marker will be clipped when drawn.\n\t/// Overriding this var allows a graph to inset the drawing when required to handle clipping edge cases, while making\n\t/// sure that grid lines, highlights etc. arrange themselves correctly draw within the range of the reduced graph size.\n\tinternal func edgeInsets(for rect: CGRect) -> DSFEdgeInsets {\n\t\treturn .zero\n\t}\n\n\t/// To be overridden by sub-classes to draw their content into the provided context\n\t/// - Parameters:\n\t///   - context: The context to draw into\n\t///   - bounds: The bounds in which to draw (which may NOT be the same as the bounds for the context!)\n\t///   - scale: The scale for the current drawing context (eg. retina == 2)\n\tinternal func drawGraph(context _: CGContext, bounds _: CGRect, scale _: CGFloat) {\n\t\tfatalError(\"must be implemented in overridden classes\")\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-components/DSFSparklineOverlay+GridLines.swift",
    "content": "//\n//  DSFSparklineOverlay+GridLines.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\t/// An overlay that draws grid lines at specified vertical points on the sparkline\n\t@objc(DSFSparklineOverlayGridLines) class GridLines: DSFSparklineOverlay.DataSource {\n\t\t/// The color of the dotted line at the zero point on the y-axis\n\t\t@objc public var strokeColor: CGColor {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The width of the dotted line at the zero point on the y-axis\n\t\t@objc public var strokeWidth: CGFloat {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The line style for the dotted line. Use [] to specify a solid line.\n\t\t@objc public var dashStyle: [CGFloat] = [1, 1] {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The y-values within the range of the datasource for the lines\n\t\t@objc public var floatValues: [CGFloat] = [] {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public init(dataSource: DSFSparkline.DataSource? = nil,\n\t\t\t\t\t\t\t\tfloatValues: [CGFloat] = [],\n\t\t\t\t\t\t\t\tstrokeColor: CGColor = DSFColor.gray.cgColor,\n\t\t\t\t\t\t\t\tstrokeWidth: CGFloat = 1.0,\n\t\t\t\t\t\t\t\tdashStyle: [CGFloat] = [1.0, 1.0])\n\t\t{\n\t\t\tself.floatValues = floatValues\n\t\t\tself.strokeColor = strokeColor\n\t\t\tself.strokeWidth = strokeWidth\n\t\t\tself.dashStyle = dashStyle\n\n\t\t\tsuper.init(dataSource: dataSource)\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.floatValues = orig.floatValues\n\t\t\tself.strokeColor = orig.strokeColor.copy() ?? .black\n\t\t\tself.strokeWidth = orig.strokeWidth\n\t\t\tself.dashStyle = orig.dashStyle\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\t@available(*, unavailable)\n\t\trequired init?(coder _: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawGridLines(context: context, bounds: bounds, scale: scale)\n\t\t}\n\t}\n}\n\nextension DSFSparklineOverlay.GridLines {\n\tfunc drawGridLines(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard\n\t\t\tself.floatValues.count > 0,\n\t\t\tlet dataSource = self.dataSource\n\t\telse {\n\t\t\treturn\n\t\t}\n\n\t\tcontext.setLineWidth(self.strokeWidth)\n\t\tcontext.setStrokeColor(self.strokeColor)\n\t\tcontext.setLineDash(phase: 0.0, lengths: self.dashStyle)\n\n\t\tself.floatValues.forEach { value in\n\t\t\tlet fractional = dataSource.fractionalPosition(for: value)\n\t\t\tlet zeroPos = bounds.minY + bounds.height - (fractional * bounds.height).rounded(.towardZero)\n\t\t\tcontext.strokeLineSegments(between: [CGPoint(x: bounds.minX, y: zeroPos),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t CGPoint(x: bounds.maxX, y: zeroPos)])\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-components/DSFSparklineOverlay+RangeHighlight.swift",
    "content": "//\n//  DSFSparklineOverlay+RangeHighlight.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\n\t/// An overlay that draws a color range on the sparkline\n\t@objc(DSFSparklineOverlayRangeHighlight) class RangeHighlight: DSFSparklineOverlay.DataSource {\n\n\t\tstatic public let defaultFill =\n\t\t\tDSFSparkline.Fill.Color(CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t  components: [0.5, 0.5, 0.5, 0.5])!)\n\n\t\t/// The color to fill the specified range\n\t\t@objc public var fill: DSFSparklineFillable = RangeHighlight.defaultFill {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The highlight range for the graph\n\t\tpublic var highlightRange: Range<CGFloat>? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// objective-c compatible highlight range setting\n\t\t@objc public func setHighlightRange(lowerBound: CGFloat, upperBound: CGFloat) {\n\t\t\tself.highlightRange = lowerBound ..< upperBound\n\t\t}\n\n\t\tpublic init(dataSource: DSFSparkline.DataSource? = nil,\n\t\t\t\t\t\trange: Range<CGFloat>? = nil,\n\t\t\t\t\t\tfill: DSFSparklineFillable = RangeHighlight.defaultFill) {\n\t\t\tself.highlightRange = range\n\t\t\tself.fill = fill\n\n\t\t\tsuper.init(dataSource: dataSource)\n\t\t}\n\n\t\t@objc public init(lowerBound: CGFloat, upperBound: CGFloat,\n\t\t\t\t\t\t\t\tfill: DSFSparklineFillable = RangeHighlight.defaultFill) {\n\t\t\tself.highlightRange = lowerBound ..< upperBound\n\t\t\tself.fill = fill\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.highlightRange = orig.highlightRange\n\t\t\tself.fill = orig.fill.copyFill()\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tguard let dataSource = self.dataSource,\n\t\t\t\t\tlet range = self.highlightRange else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet lb = 1.0 - dataSource.normalize(value: range.lowerBound)\n\t\t\tlet l = (lb * bounds.height) + bounds.minY\n\t\t\tlet ub = 1.0 - dataSource.normalize(value: range.upperBound)\n\t\t\tlet u = (ub * bounds.height) + bounds.minY\n\t\t\tlet destRect = CGRect(x: bounds.minX, y: u, width: bounds.width, height: l - u)\n\t\t\tcontext.clip(to: destRect)\n\t\t\t\n\t\t\tself.fill.fill(context: context, bounds: bounds)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-components/DSFSparklineOverlay+ZeroLine.swift",
    "content": "//\n//  DSFSparklineOverlay+ZeroLine.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\n\t@objc(DSFSparklineOverlayZeroLine) class ZeroLine: DSFSparklineOverlay.DataSource {\n\n\t\t/// The color of the dotted line at the zero point on the y-axis\n\t\t@objc public var strokeColor: CGColor {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The width of the dotted line at the zero point on the y-axis\n\t\t@objc public var strokeWidth: CGFloat {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The line style for the dotted line. Use [] to specify a solid line.\n\t\t@objc public var dashStyle: [CGFloat] = [1, 1] {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public init(dataSource: DSFSparkline.DataSource? = nil,\n\t\t\t\t\t\t\t\tstrokeColor: CGColor = DSFColor.gray.cgColor,\n\t\t\t\t\t\t\t\tstrokeWidth: CGFloat = 1.0,\n\t\t\t\t\t\t\t\tdashStyle: [CGFloat] = [1.0, 1.0]) {\n\t\t\tself.strokeColor = strokeColor\n\t\t\tself.strokeWidth = strokeWidth\n\t\t\tself.dashStyle = dashStyle\n\n\t\t\tsuper.init(dataSource: dataSource)\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.strokeColor = orig.strokeColor.copy() ?? .black\n\t\t\tself.strokeWidth = orig.strokeWidth\n\t\t\tself.dashStyle = orig.dashStyle\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tguard let dataSource = self.dataSource else { return }\n\n\t\t\tlet frac = dataSource.fractionalPosition(for: dataSource.zeroLineValue)\n\t\t\tlet zeroPos = bounds.height - (frac * bounds.height) + bounds.minY\n\n\t\t\tcontext.setLineWidth(self.strokeWidth)\n\t\t\tcontext.setStrokeColor(self.strokeColor)\n\t\t\tcontext.setLineDash(phase: 0.0, lengths: self.dashStyle)\n\t\t\tcontext.strokeLineSegments(\n\t\t\t\tbetween: [CGPoint(x: bounds.minX, y: zeroPos), CGPoint(x: bounds.width + bounds.minX, y: zeroPos)])\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+ActivityGrid.swift",
    "content": "//\n//  DSFSparklineOverlay+ActivityGrid.swift\n//  DSFSparklines\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\t/// A GitHub-style activity grid.\n\t@objc(DSFSparklineOverlayActivityGrid) class ActivityGrid: DSFSparklineOverlay.StaticDataSource {\n\t\t/// The number of vertical cells in a column\n\t\t@objc @LayerInvalidating(.display) public var verticalCellCount: Int = 7\n\n\t\t/// The number of horizontal cells in the grid.\n\t\t///\n\t\t/// If `horizontalCellCount` == 0, cells will be added to fill the entire width of the view\n\t\t@objc @LayerInvalidating(.display) public var horizontalCellCount: Int = 0\n\n\t\t/// The layout style for the grid\n\t\t@objc @LayerInvalidating(.display) public var layoutStyle: DSFSparkline.ActivityGrid.LayoutStyle = .github\n\n\t\t// MARK: Cell style\n\n\t\t/// The cell's drawing style\n\t\t@objc @LayerInvalidating(.display) public var cellStyle: DSFSparkline.ActivityGrid.CellStyle = .init()\n\n\t\t// MARK: Individual cell style setters/getters\n\n\t\t/// The color scheme to use when fill cells\n\t\t@objc public var cellFillScheme: DSFSparkline.ValueBasedFill {\n\t\t\tget { self.cellStyle.fillScheme }\n\t\t\tset { self.cellStyle = self.cellStyle.modify(fillScheme: newValue) }\n\t\t}\n\n\t\t/// The dimension of each cell\n\t\t@objc public var cellDimension: CGFloat {\n\t\t\tget { self.cellStyle.cellDimension }\n\t\t\tset { self.cellStyle = self.cellStyle.modify(cellDimension: newValue) }\n\t\t}\n\n\t\t/// The spacing between each of the cells\n\t\t@objc public var cellSpacing: CGFloat {\n\t\t\tget { self.cellStyle.cellSpacing }\n\t\t\tset { self.cellStyle = self.cellStyle.modify(cellSpacing: newValue) }\n\t\t}\n\n\t\t/// The color for the border of the cell\n\t\t@objc public var cellBorderColor: CGColor? {\n\t\t\tget { self.cellStyle.borderColor }\n\t\t\tset { self.cellStyle = self.cellStyle.modify(borderColor: newValue) }\n\t\t}\n\n\t\t/// The cell's border width\n\t\t@objc public var cellBorderWidth: CGFloat {\n\t\t\tget { self.cellStyle.borderWidth }\n\t\t\tset { self.cellStyle = self.cellStyle.modify(borderWidth: newValue) }\n\t\t}\n\n\t\t/// The cell's corner radius\n\t\t@objc public var cellCornerRadius: CGFloat {\n\t\t\tget { self.cellStyle.cornerRadius }\n\t\t\tset { self.cellStyle = self.cellStyle.modify(cornerRadius: newValue) }\n\t\t}\n\n\t\t/// Called when the activity cells are updated\n\t\t@objc public var cellsDidUpdateBlock: (() -> Void)?\n\n\t\t// MARK: Drawing and updates\n\n\t\t/// Called when the content of the data source changes\n\t\toverride func staticDataSourceDidChange() {\n\t\t\tsuper.staticDataSourceDidChange()\n\t\t\tself.setNeedsDisplay()\n\t\t}\n\n\t\t/// Draws the graph\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself._cells.removeAll()\n\t\t\tswitch self.layoutStyle {\n\t\t\tcase .github:\n\t\t\t\tself.drawGithubStyle(context: context, bounds: bounds, scale: scale)\n\t\t\tcase .defrag:\n\t\t\t\tself.drawDefragStyle(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\n\t\t\tself.cellsDidUpdateBlock?()\n\t\t}\n\n\t\tpublic var cells: [CGRect] { _cells }\n\n\t\t// MARK: Private\n\t\tprivate var _cells: [CGRect] = []\n\t}\n}\n\npublic extension DSFSparklineOverlay.ActivityGrid {\n\t/// Returns the index within the datasource of the value at the given point\n\t/// - Parameter point: The point within the activity grid to test\n\t/// - Returns: The data source index for the point, or -1 if\n\t///            1. no cell was hit, or\n\t///            2. The cell was a skip cell (ie. its value is `.infinity`, or\n\t///            3. the cell hit was outside of bounds of the data source\n\t@objc func indexAtPoint(_ point: CGPoint) -> Int {\n\t\tif let index: Int = self._cells.firstIndex(where: { $0.contains(point) }) {\n\t\t\tif index < self.dataSource.values.count,\n\t\t\t\tself.dataSource.values[index] == .infinity\n\t\t\t{\n\t\t\t\t// It's an existing cell, but it's a skip cell\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\treturn index\n\t\t}\n\t\treturn -1\n\t}\n\n\t/// Return the cell frame for the given index\n\t/// - Parameter index: The index\n\t/// - Returns: The cell bounds for the given index\n\t@objc func cellFrame(for index: Int) -> CGRect {\n\t\tif index < self._cells.count {\n\t\t\treturn self._cells[index]\n\t\t}\n\n\t\t// If we get here, the indexed cell was not visible on screen\n\t\treturn .zero\n\t}\n}\n\n// MARK: - Sizing\n\nextension DSFSparklineOverlay.ActivityGrid {\n\t/// The expected height given the current settings\n\t@objc public var intrinsicHeight: CGFloat {\n\t\tif verticalCellCount <= 0 {\n\t\t\treturn DSFView.noIntrinsicMetric\n\t\t}\n\t\treturn (CGFloat(self.verticalCellCount) * (self.cellStyle.cellDimension + self.cellStyle.cellSpacing)) + self.cellStyle.cellSpacing\n\t}\n\n\t/// Minimum width for displaying the current values without padding\n\t@objc public var intrinsicWidth: CGFloat {\n\t\tif horizontalCellCount <= 0 {\n\t\t\tif verticalCellCount <= 0 {\n\t\t\t\treturn DSFView.noIntrinsicMetric\n\t\t\t}\n\t\t\tvar columnCount = self.dataSource.values.count / self.verticalCellCount\n\t\t\tif (self.dataSource.values.count % self.verticalCellCount) > 0 {\n\t\t\t\tcolumnCount += 1\n\t\t\t}\n\t\t\treturn (CGFloat(columnCount) * (self.cellStyle.cellDimension + self.cellStyle.cellSpacing)) + self.cellStyle.cellSpacing\n\t\t}\n\t\telse {\n\t\t\t// Fixed horizontal count\n\t\t\treturn (CGFloat(horizontalCellCount) * (self.cellStyle.cellDimension + self.cellStyle.cellSpacing)) + self.cellStyle.cellSpacing\n\t\t}\n\t}\n\n\t/// Intrinsic size for the grid\n\t@objc public var intrinsicSize: CGSize { CGSize(width: self.intrinsicWidth, height: self.intrinsicHeight) }\n}\n\nextension DSFSparklineOverlay.ActivityGrid {\n\tprivate func drawGithubStyle(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tlet style = self.cellStyle\n\t\tvar xOffset = bounds.width - style.cellSpacing - style.cellDimension\n\t\tvar dataOffset = 0\n\t\twhile xOffset > 0 {\n\t\t\t(0 ..< verticalCellCount).reversed().forEach { index in\n\t\t\t\tlet cell = CGRect(\n\t\t\t\t\tx: xOffset,\n\t\t\t\t\ty: CGFloat(index) * (style.cellDimension + style.cellSpacing) + style.cellSpacing,\n\t\t\t\t\twidth: style.cellDimension,\n\t\t\t\t\theight: style.cellDimension\n\t\t\t\t)\n\t\t\t\tself.drawCell(context: context, inRect: cell, index: dataOffset)\n\t\t\t\tdataOffset += 1\n\t\t\t}\n\t\t\txOffset -= (self.cellStyle.cellDimension + self.cellStyle.cellSpacing)\n\t\t}\n\t}\n\n\tprivate func drawDefragStyle(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tvar dataOffset = 0\n\t\tvar yOffset = self.cellStyle.cellSpacing\n\t\tlet style = self.cellStyle\n\t\tlet sp = Int((bounds.width - style.cellSpacing) / (style.cellSpacing + style.cellDimension))\n\t\tlet horizontalCellCount = self.horizontalCellCount == 0 ? sp : self.horizontalCellCount\n\n\t\tvar xOffset = 0\n\t\twhile yOffset <= (bounds.height - style.cellSpacing - style.cellDimension) {\n\t\t\twhile xOffset < horizontalCellCount {\n\t\t\t\tlet cell = CGRect(\n\t\t\t\t\tx: style.cellSpacing + (CGFloat(xOffset) * (style.cellSpacing + style.cellDimension)),\n\t\t\t\t\ty: yOffset,\n\t\t\t\t\twidth: style.cellDimension,\n\t\t\t\t\theight: style.cellDimension\n\t\t\t\t)\n\t\t\t\tself.drawCell(context: context, inRect: cell, index: dataOffset)\n\n\t\t\t\txOffset += 1\n\t\t\t\tdataOffset += 1\n\t\t\t}\n\t\t\txOffset = 0\n\t\t\tyOffset += self.cellStyle.cellDimension + self.cellStyle.cellSpacing\n\t\t}\n\t}\n}\n\nprivate extension DSFSparklineOverlay.ActivityGrid {\n\tfunc drawCell(context: CGContext, inRect cell: CGRect, index: Int) {\n\t\tlet style = self.cellStyle\n\n\t\t// Store the cell information so we can access it later\n\t\tself._cells.append(cell)\n\n\t\t// The fractional value for the index\n\t\tlet fracValue = self.dataSource.fractionalValue(at: index)\n\n\t\tif fracValue.isInfinite {\n\t\t\t// Treat an infinite value as a skip cell. Draw nothing\n\t\t\treturn\n\t\t}\n\t\t\n\t\tlet fraction = fracValue.isNaN ? 0.0 : fracValue\n\t\tlet color = style.fillScheme.color(atFraction: fraction)\n\n\t\tcontext.addPath(\n\t\t\tCGPath(\n\t\t\t\troundedRect: cell,\n\t\t\t\tcornerWidth: style.cornerRadius,\n\t\t\t\tcornerHeight: style.cornerRadius,\n\t\t\t\ttransform: nil\n\t\t\t)\n\t\t)\n\t\tcontext.setFillColor(color)\n\t\tcontext.fillPath()\n\n\t\tif let c = self.cellStyle.borderColor {\n\t\t\tcontext.addPath(\n\t\t\t\tCGPath(\n\t\t\t\t\troundedRect: cell,\n\t\t\t\t\tcornerWidth: style.cornerRadius,\n\t\t\t\t\tcornerHeight: style.cornerRadius,\n\t\t\t\t\ttransform: nil\n\t\t\t\t)\n\t\t\t)\n\t\t\tcontext.setFillColor(.clear)\n\t\t\tcontext.setStrokeColor(c)\n\t\t\tcontext.setLineWidth(style.borderWidth)\n\t\t\tcontext.strokePath()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Bar.swift",
    "content": "//\n//  DSFSparklineOverlay+Bar.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\n\t/// A bar graph overlay\n\t@objc(DSFSparklineOverlayBar) class Bar: Centerable {\n\n\t\t/// The width for the line drawn on the graph (in pixels)\n\t\t@objc public var strokeWidth: UInt = 1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\t\t/// The spacing between each bar (in pixels)\n\t\t@objc public var barSpacing: UInt = 1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Draw a shadow under the line\n\t\t@objc public var shadow: NSShadow? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\tpublic override init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\toverride public init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.strokeWidth = orig.strokeWidth\n\t\t\tself.barSpacing = orig.barSpacing\n\t\t\tself.shadow = orig.shadow?.copy() as? NSShadow\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\t\t\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\t\t\n\t\tinternal override func edgeInsets(for rect: CGRect) -> DSFEdgeInsets {\n\t\t\tguard let dataSource = self.dataSource else { return .zero }\n\n\t\t\tlet integralRect = bounds.integral\n\t\t\tlet componentWidth = Int(integralRect.width) / Int(dataSource.windowSize)\n\n\t\t\t// The left offset in order to center X the full range\n\t\t\tlet intOffset = Int(bounds.minX) + (Int(bounds.width) - (componentWidth * Int(dataSource.windowSize))) / 2\n\t\t\tlet xOffset = CGFloat(intOffset)\n\t\t\tlet yOffset = CGFloat(self.strokeWidth)\n\n\t\t\treturn DSFEdgeInsets(top: yOffset, left: xOffset, bottom: yOffset, right: xOffset)\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tif self.centeredAtZeroLine {\n\t\t\t\tself.drawCenteredBarGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.drawBarGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t}\n\t}\n}\n\nextension DSFSparklineOverlay.Bar {\n\n\tprivate func drawBarGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\n\t\tguard let dataSource = self.dataSource else { return }\n\n\t\tlet integralRect = bounds.integral\n\n\t\t// This represents the _full_ width of a bar within the graph, including the spacing.\n\t\tlet componentWidth = Int(integralRect.width) / Int(dataSource.windowSize)\n\n\t\t// The width of the BAR component\n\t\tlet barWidth = componentWidth - Int(barSpacing)\n\n\t\t// The left offset in order to center X\n\t\tlet xOffset: Int = Int(bounds.minX) + (Int(bounds.width) - (componentWidth * Int(dataSource.windowSize))) / 2\n\n\t\t// The available height range\n\t\tlet range: ClosedRange<CGFloat> = 0 ... integralRect.maxY\n\n\t\tlet normy = dataSource.normalized\n\t\tlet xDiff = bounds.width / CGFloat(normy.count)\n\t\tlet points = normy.enumerated().map {\n\t\t\tCGPoint(x: CGFloat($0.offset) * xDiff,\n\t\t\t\t\t  y: ($0.element * (integralRect.height - 1) + integralRect.minY).clamped(to: range))\n\t\t}\n\n\t\tcontext.usingGState { outer in\n\n\t\t\touter.setRenderingIntent(.relativeColorimetric)\n\t\t\touter.interpolationQuality = .none\n\t\t\touter.setShouldAntialias(false)\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = xOffset + (Int(dataSource.counter) * componentWidth)\n\t\t\t\tlet clipRect = bounds.divided(atDistance: CGFloat(pos), from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect)\n\t\t\t}\n\n\t\t\tvar bars: [CGRect] = []\n\t\t\tfor point in points.enumerated() {\n\t\t\t\tlet yVal = Int(point.element.y.rounded(.down))\n\t\t\t\tlet r = CGRect(x: xOffset + point.offset * componentWidth,\n\t\t\t\t\t\t\t\t\ty: Int(integralRect.minY) + Int(integralRect.height) - yVal,\n\t\t\t\t\t\t\t\t\twidth: barWidth,\n\t\t\t\t\t\t\t\t\theight: yVal - Int(self.strokeWidth))\n\t\t\t\tbars.append(r.integral)\n\t\t\t}\n\n\t\t\tlet path = CGMutablePath()\n\t\t\tpath.addRects(bars)\n\n\t\t\tif let primaryFill = self.primaryFill {\n\t\t\t\touter.usingGState { fillCtx in\n\t\t\t\t\tfillCtx.addPath(path)\n\t\t\t\t\tfillCtx.clip()\n\t\t\t\t\tprimaryFill.fill(context: fillCtx, bounds: bounds)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif let stroke = self.primaryStrokeColor {\n\t\t\t\touter.usingGState { strokeCtx in\n\n\t\t\t\t\tif let shadow = self.shadow {\n\t\t\t\t\t\tstrokeCtx.setShadow(shadow)\n\t\t\t\t\t}\n\n\t\t\t\t\tstrokeCtx.addPath(path)\n\t\t\t\t\tstrokeCtx.setLineWidth(1.0 / scale * CGFloat(self.strokeWidth))\n\t\t\t\t\tstrokeCtx.setStrokeColor(stroke)\n\t\t\t\t\tstrokeCtx.drawPath(using: .stroke)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate func drawCenteredBarGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\n\t\tguard let dataSource = self.dataSource else { return }\n\n\t\tlet drawRect = bounds\n\t\tlet height = drawRect.height - 1\n\n\t\tlet normy = dataSource.normalized\n\t\tlet xDiff = bounds.width / CGFloat(normy.count)\n\n\t\tlet centre = dataSource.normalizedZeroLineValue\n\t\tlet centroid = (1 - centre) * (drawRect.height - 1)\n\n\t\tcontext.usingGState { outer in\n\n\t\t\touter.setRenderingIntent(.relativeColorimetric)\n\t\t\touter.interpolationQuality = .none\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = CGFloat(dataSource.counter) * xDiff + 1\n\t\t\t\tlet clipRect = bounds.divided(atDistance: pos, from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect)\n\t\t\t}\n\n\t\t\tlet split = self.bounds.divided(atDistance: centroid, from: .minYEdge)\n\t\t\tlet positiveRegion: CGRect = split.slice\n\t\t\tlet negativeRegion: CGRect = split.remainder\n\n\t\t\tvar positivePath: [CGRect] = []\n\t\t\tvar negativePath: [CGRect] = []\n\n\t\t\tfor value in normy.enumerated() {\n\t\t\t\tlet x = bounds.minX + CGFloat(value.offset) * xDiff\n\t\t\t\tif value.element >= centre {\n\t\t\t\t\tlet yy = bounds.minY + ((centre - value.element) * height)\n\t\t\t\t\tlet r = CGRect(\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: centroid,\n\t\t\t\t\t\twidth: xDiff - 1 - (CGFloat(self.barSpacing)),\n\t\t\t\t\t\theight: yy\n\t\t\t\t\t)\n\t\t\t\t\tpositivePath.append(r.integral)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet yy = bounds.minY + ((value.element - centre) * height)\n\t\t\t\t\tlet r = CGRect(\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: centroid + 1,\n\t\t\t\t\t\twidth: xDiff - 1 - (CGFloat(self.barSpacing)),\n\t\t\t\t\t\theight: -yy - CGFloat(self.strokeWidth) + 1\n\t\t\t\t\t)\n\t\t\t\t\tnegativePath.append(r.integral)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\touter.setShouldAntialias(false)\n\n\t\t\tif !positivePath.isEmpty {\n\t\t\t\tlet path = CGMutablePath()\n\t\t\t\tpath.addRects(positivePath)\n\n\t\t\t\tif let primaryFill = self.primaryFill {\n\t\t\t\t\touter.usingGState { fillCtx in\n\t\t\t\t\t\tfillCtx.addPath(path)\n\t\t\t\t\t\tfillCtx.clip()\n\t\t\t\t\t\tprimaryFill.fill(context: fillCtx, bounds: positiveRegion)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif let stroke = self.primaryStrokeColor {\n\t\t\t\t\touter.usingGState { strokeCtx in\n\t\t\t\t\t\tstrokeCtx.addPath(path)\n\t\t\t\t\t\tstrokeCtx.setLineWidth(1.0 / scale * CGFloat(self.strokeWidth))\n\t\t\t\t\t\tstrokeCtx.setStrokeColor(stroke)\n\t\t\t\t\t\tstrokeCtx.strokePath()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !negativePath.isEmpty {\n\t\t\t\tlet path = CGMutablePath()\n\t\t\t\tpath.addRects(negativePath)\n\n\t\t\t\tif let secondaryFill = self.secondaryFill {\n\t\t\t\t\touter.usingGState { fillCtx in\n\t\t\t\t\t\tfillCtx.addPath(path)\n\t\t\t\t\t\tfillCtx.clip()\n\t\t\t\t\t\tsecondaryFill.fill(context: fillCtx, bounds: negativeRegion)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif let stroke = self.secondaryStrokeColor {\n\t\t\t\t\touter.usingGState { strokeCtx in\n\t\t\t\t\t\tstrokeCtx.addPath(path)\n\t\t\t\t\t\tstrokeCtx.setLineWidth(1.0 / scale * CGFloat(self.strokeWidth))\n\t\t\t\t\t\tstrokeCtx.setStrokeColor(stroke)\n\t\t\t\t\t\tstrokeCtx.strokePath()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+CircularGauge.swift",
    "content": "//\n//  DSFSparklineOverlay+CircularGauge.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport QuartzCore\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\t/// A circular gauge\n\t@objc(DSFSparklineOverlayCircularGauge) class CircularGauge: DSFSparklineOverlay {\n\t\t/// The default track style\n\t\t@objc public static let DefaultTrackStyle = DSFSparklineOverlay.CircularGauge.TrackStyle(\n\t\t\twidth: 10,\n\t\t\tfillColor: DSFSparkline.Fill.Color(red: 0, green: 0, blue: 0, alpha: 0.2)\n\t\t)\n\n\t\t/// The default value style\n\t\t@objc public static let DefaultLineStyle = DSFSparklineOverlay.CircularGauge.TrackStyle(\n\t\t\twidth: 7,\n\t\t\tfillColor: DSFSparkline.Fill.Color(red: 0, green: 0, blue: 0, alpha: 1)\n\t\t)\n\n\t\t/// The value assigned to the percent bar. A value between 0.0 and 1.0\n\t\t@objc public var value: CGFloat = 0 {\n\t\t\twillSet {\n\t\t\t\tanimationTransition = DSFSparkline.AnimationTransition(start: _value, stop: newValue)\n\t\t\t}\n\t\t\tdidSet {\n\t\t\t\tif isAnimated {\n\t\t\t\t\tstartAnimateIn()\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself._value = self.value.clamped(to: 0 ... 1)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate var _value: CGFloat = 0 {\n\t\t\tdidSet { self.setNeedsDisplay() }\n\t\t}\n\n\t\t/// The style to use when drawing the gauge's track\n\t\t@objc public var trackStyle: TrackStyle = TrackStyle(\n\t\t\twidth: 5,\n\t\t\tfillColor: DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 0, alpha: 0.2)\n\t\t)\n\n\t\t/// The style to use when drawing the gauge's value\n\t\t@objc public var lineStyle: TrackStyle = TrackStyle(\n\t\t\twidth: 3,\n\t\t\tfillColor: DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 0)\n\t\t)\n\n\t\t/// The animation style to apply\n\t\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil\n\t\tprivate var isAnimated: Bool { animationStyle != nil }\n\n\t\toverride func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tCATransaction.withDisabledActions { [weak self] in\n\t\t\t\tself?.drawCircularGauge(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t}\n\n\t\t// MARK: Animation\n\n\t\tprivate var animator = ArbitraryAnimator() //\n\t\tprivate var animationTransition: DSFSparkline.AnimationTransition?\n\t}\n}\n\nextension DSFSparklineOverlay.CircularGauge {\n\tfunc startAnimateIn() {\n\t\tguard let animStyle = animationStyle else { fatalError() }\n\t\t// Stop any animation that is currently active\n\t\tself.animator.progressBlock = nil\n\t\tself.animator.stop()\n\n\t\tself.animator.animationFunction = animStyle.function.function\n\t\tself.animator.duration = animStyle.duration\n\t\tself.animator.progressBlock = { [weak self] progress in\n\t\t\tguard let `self` = self, let a = self.animationTransition else { return }\n\t\t\t_value = a.start + (a.stop - a.start) * progress\n\t\t}\n\t\tself.animator.start()\n\t}\n}\n\npublic extension DSFSparklineOverlay.CircularGauge {\n\t/// A circular gauge track style\n\t@objc(DSFSparklineOverlayCircularGaugeTrackStyle) class TrackStyle: NSObject {\n\t\t/// The width of the track\n\t\t@objc public var width: CGFloat\n\t\t/// The fill style to use\n\t\t@objc public var fillColor: DSFSparklineFillable\n\t\t/// The stroke width\n\t\t@objc public var strokeWidth: CGFloat\n\t\t/// The stroke color\n\t\t@objc public var strokeColor: CGColor?\n\t\t/// The shadow to use\n\t\t@objc public var shadow: DSFSparkline.Shadow?\n\t\t/// The line's cap style\n\t\t@objc public var lineCap: CGLineCap\n\n\t\t/// Create\n\t\t@objc public init(\n\t\t\twidth: CGFloat,\n\t\t\tfillColor: DSFSparklineFillable,\n\t\t\tstrokeWidth: CGFloat = 0.0,\n\t\t\tstrokeColor: CGColor? = nil,\n\t\t\tshadow: DSFSparkline.Shadow? = nil,\n\t\t\tlineCap: CGLineCap = .round\n\t\t) {\n\t\t\tself.width = width\n\t\t\tself.fillColor = fillColor\n\t\t\tself.strokeWidth = strokeWidth\n\t\t\tself.strokeColor = strokeColor\n\t\t\tself.shadow = shadow\n\t\t\tself.lineCap = lineCap\n\t\t\tsuper.init()\n\t\t}\n\t}\n}\n\nprivate extension DSFSparklineOverlay.CircularGauge {\n\tfunc drawCircularGauge(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tvar drawRect = bounds\n\t\tif drawRect.width != drawRect.height {\n\t\t\tlet m = min(drawRect.width, drawRect.height)\n\t\t\tdrawRect = CGRect(\n\t\t\t\tx: drawRect.minX + ((drawRect.width - m) / 2),\n\t\t\t\ty: drawRect.minY + ((drawRect.height - m) / 2),\n\t\t\t\twidth: m,\n\t\t\t\theight: m\n\t\t\t)\n\t\t}\n\t\tlet baseRect = drawRect\n\n\t\t// Inset so that the line drawing doesn't crop at the edges\n\t\tlet inset: CGFloat = {\n\t\t\tvar inset = max(trackStyle.width + trackStyle.strokeWidth, lineStyle.width + lineStyle.strokeWidth)\n\t\t\tlet trackW = trackStyle.shadow?.requiredShadowInset ?? 0\n\t\t\tlet valueW = lineStyle.shadow?.requiredShadowInset ?? 0\n\t\t\tinset += max(trackW, valueW)\n\t\t\treturn inset\n\t\t}()\n\n\t\tdrawRect = drawRect.insetBy(dx: inset / 2, dy: inset / 2)\n\n\t\tlet centerPoint = CGPoint(x: drawRect.midX, y: drawRect.midY)\n\t\tlet radius: CGFloat = drawRect.width > drawRect.height ? (drawRect.height / 2.0) : (drawRect.width / 2.0)\n\n\t\t// The track\n\t\tself.drawComponent(\n\t\t\tcontext: context,\n\t\t\tbounds: baseRect,\n\t\t\tcenterPoint: centerPoint,\n\t\t\tradius: radius,\n\t\t\tvalue: 1,\n\t\t\tstyle: trackStyle\n\t\t)\n\n\t\t// The value\n\t\tself.drawComponent(\n\t\t\tcontext: context,\n\t\t\tbounds: baseRect,\n\t\t\tcenterPoint: centerPoint,\n\t\t\tradius: radius,\n\t\t\tvalue: _value,\n\t\t\tstyle: lineStyle\n\t\t)\n\t}\n}\n\nprivate extension DSFSparklineOverlay.CircularGauge {\n\tfunc drawComponent(\n\t\tcontext: CGContext,\n\t\tbounds: CGRect,\n\t\tcenterPoint: CGPoint,\n\t\tradius: CGFloat,\n\t\tvalue: CGFloat,\n\t\tstyle: TrackStyle\n\t) {\n\t\tlet pth = CGMutablePath()\n\t\tpth.addArc(\n\t\t\tcenter: centerPoint,\n\t\t\tradius: radius,\n\t\t\tstartAngle: Angle.degrees(135).radians,\n\t\t\tendAngle: Angle.degrees(135 + (270 * value)).radians,\n\t\t\tclockwise: false\n\t\t)\n\n\t\tlet act = pth.copy(\n\t\t\tstrokingWithWidth: style.width,\n\t\t\tlineCap: style.lineCap,\n\t\t\tlineJoin: .round,\n\t\t\tmiterLimit: 1.0\n\t\t)\n\n\t\tif let shadow = style.shadow {\n\t\t\tif shadow.isInner {\n\t\t\t\tcontext.usingGState { ctx in\n\t\t\t\t\t// Draw the track\n\t\t\t\t\tctx.addPath(act)\n\t\t\t\t\tctx.clip()\n\t\t\t\t\tstyle.fillColor.fill(context: ctx, bounds: bounds)\n\n\t\t\t\t\t// Overlay the inner shadow\n\t\t\t\t\tctx.drawInnerShadow(\n\t\t\t\t\t\tin: act,\n\t\t\t\t\t\tshadowColor: shadow.color,\n\t\t\t\t\t\toffset: shadow.offset,\n\t\t\t\t\t\tblurRadius: shadow.blurRadius\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontext.usingGState { ctx in\n\n\t\t\t\t\tctx.addRect(bounds)\n\t\t\t\t\tctx.addPath(act)\n\t\t\t\t\tctx.clip(using: .evenOdd)\n\n\t\t\t\t\tctx.setShadow(shadow.shadow)\n\t\t\t\t\tctx.addPath(act)\n\t\t\t\t\tctx.setFillColor(shadow.color!)\n\t\t\t\t\tctx.fillPath()\n\t\t\t\t}\n\n\t\t\t\tcontext.usingGState { ctx in\n\t\t\t\t\tctx.addPath(act)\n\t\t\t\t\tctx.clip()\n\t\t\t\t\tstyle.fillColor.fill(context: ctx, bounds: bounds)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tcontext.usingGState { ctx in\n\t\t\t\tctx.addPath(act)\n\t\t\t\tctx.clip()\n\t\t\t\tstyle.fillColor.fill(context: ctx, bounds: bounds)\n\t\t\t}\n\t\t}\n\n\t\tif let s = style.strokeColor {\n\t\t\tcontext.usingGState { ctx in\n\t\t\t\tctx.addPath(act)\n\t\t\t\tctx.setStrokeColor(s)\n\t\t\t\tctx.setLineWidth(style.strokeWidth)\n\t\t\t\tctx.setLineCap(.round)\n\t\t\t\tctx.strokePath()\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+CircularProgress.swift",
    "content": "//\n//  DSFSparklineOverlay+CircularProgress.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport QuartzCore\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\n\t/// A circular progress sparkline\n\t@objc(DSFSparklineOverlayCircularProgress) class CircularProgress: DSFSparklineOverlay {\n\n\t\t/// The value assigned to the percent bar. A value between 0.0 and 1.0\n\t\t@objc public var value: CGFloat = 0.25 {\n\t\t\tdidSet {\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// Default track width\n\t\t@objc public static let DefaultTrackWidth: CGFloat = 10.0\n\n\t\t/// The width of the circular ring track\n\t\t@objc public var trackWidth: CGFloat = CircularProgress.DefaultTrackWidth {\n\t\t\tdidSet {\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// The padding (inset) for drawing the ring\n\t\t@objc public var padding: CGFloat = 0.0 {\n\t\t\tdidSet {\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// Default fill style\n\t\t@objc public static let DefaultFillStyle = DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1)\n\n\n\t\t/// The fill style for the progress track\n\t\t@objc public var fillStyle: DSFSparklineFillable = CircularProgress.DefaultFillStyle {\n\t\t\tdidSet {\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// Default track color\n\t\t@objc public static let DefaultTrackColor = CGColor(gray: 0.5, alpha: 0.1)\n\n\t\t/// The color of the track background\n\t\t@objc public var trackColor: CGColor = CircularProgress.DefaultTrackColor {\n\t\t\tdidSet {\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// The icon appearing in the track at the top of the ring\n\t\t@objc public var icon: CGImage? = nil {\n\t\t\tdidSet {\n\t\t\t\tself._flippedIcon = icon?.flipped()\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\t\tprivate var _flippedIcon: CGImage? = nil\n\n\t\toverride init() {\n\t\t\tsuper.init()\n\t\t\tself.drawsAsynchronously = true\n\t\t}\n\n\t\tinit(value: CGFloat, trackWidth: CGFloat, fillStyle: DSFSparklineFillable, trackColor: CGColor = CircularProgress.DefaultTrackColor) {\n\t\t\tself.value = value\n\t\t\tself.trackWidth = trackWidth\n\t\t\tself.fillStyle = fillStyle\n\t\t\tself.trackColor = trackColor\n\t\t\tsuper.init()\n\t\t\tself.drawsAsynchronously = true\n\t\t}\n\t\t\n\t\tpublic override init(layer: Any) {\n\t\t\tif let layer = layer as? CircularProgress {\n\t\t\t\tself.value = layer.value\n\t\t\t\tself.trackWidth = layer.trackWidth\n\t\t\t\tself.fillStyle = layer.fillStyle\n\t\t\t\tself.trackColor = layer.trackColor.copy()!\n\t\t\t\tself.padding = layer.padding\n\t\t\t\tself.icon = layer.icon?.copy()\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfatalError()\n\t\t\t}\n\t\t\tsuper.init(layer: layer)\n\t\t\tself.drawsAsynchronously = true\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawCircularProgressGraph(context: context, bounds: bounds, scale: scale)\n\t\t}\n\n\t\tprivate let fullCircle = 2.0 * CGFloat.pi\n\t}\n}\n\nprivate extension DSFSparklineOverlay.CircularProgress {\n\tfunc valueDidChange() {\n\t\tself.setNeedsDisplay()\n\t}\n\n\tfunc drawCircularProgressGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tActivityRing.drawRing(\n\t\t\tin: context,\n\t\t\tdestination: bounds,\n\t\t\tvalue: self.value,\n\t\t\tpadding: self.padding,\n\t\t\ttrackWidth: self.trackWidth,\n\t\t\tfillStyle: self.fillStyle,\n\t\t\ttrackColor: self.trackColor,\n\t\t\ticon: self._flippedIcon\n\t\t)\n\t}\n}\n\n\n////\n\nprivate class ActivityRing {\n\n\tstatic func drawRing(\n\t\tin ctx: CGContext,\n\t\tdestination: CGRect = .zero,\n\t\tvalue: CGFloat,\n\t\tpadding: CGFloat,\n\t\ttrackWidth: CGFloat,\n\t\tfillStyle: DSFSparklineFillable,\n\t\ttrackColor: CGColor,\n\t\ticon: CGImage?\n\t) {\n\t\tassert(value >= 0.0)\n\t\tguard destination.isEmpty == false else { return }\n\n\t\tlet _fullCircle = 2.0 * CGFloat.pi\n\n\t\tvar drawRect = destination\n\n\t\tif drawRect.width != drawRect.height {\n\t\t\tlet m = min(drawRect.width, drawRect.height)\n\t\t\tdrawRect = CGRect(\n\t\t\t\tx: drawRect.minX + ((drawRect.width - m) / 2),\n\t\t\t\ty: drawRect.minY + ((drawRect.height - m) / 2),\n\t\t\t\twidth: m,\n\t\t\t\theight: m\n\t\t\t)\n\t\t}\n\n\t\t// Inset by the padding amount\n\t\tdrawRect = drawRect.insetBy(dx: padding, dy: padding)\n\n\t\tguard drawRect.isEmpty == false else {\n\t\t\treturn\n\t\t}\n\n\t\tlet centerPoint = CGPoint(x: drawRect.midX, y: drawRect.midY)\n\t\tlet dimension = drawRect.width > drawRect.height ? drawRect.height : drawRect.width\n\t\tlet radius: CGFloat = drawRect.width > drawRect.height ? (drawRect.height - trackWidth) / 2.0 : (drawRect.width - trackWidth) / 2.0\n\n\t\t//\n\t\t// Clip to the activity track\n\t\t//\n\n\t\tlet pth = CGMutablePath()\n\t\tpth.addArc(center: centerPoint, radius: radius, startAngle: 0, endAngle: _fullCircle, clockwise: false)\n\t\tlet act = pth.copy(strokingWithWidth: trackWidth, lineCap: .round, lineJoin: .round, miterLimit: 1.0)\n\t\tctx.addPath(act)\n\t\tctx.clip()\n\n\t\t//\n\t\t// Fill the background track\n\t\t//\n\n\t\tctx.usingGState { ctx in\n\t\t\tctx.setFillColor(trackColor)\n\t\t\tctx.fill([drawRect])\n\t\t}\n\n\t\t//\n\t\t// Draw the ring\n\t\t//\n\n\t\tvar offset: CGFloat = 0\n\t\tdo {\n\t\t\tlet colorSpace = CGColorSpaceCreateDeviceRGB()\n\t\t\tlet bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)\n\t\t\tlet fill = CGContext(\n\t\t\t\tdata: nil,\n\t\t\t\twidth: Int(dimension),\n\t\t\t\theight: Int(dimension),\n\t\t\t\tbitsPerComponent: 8,\n\t\t\t\tbytesPerRow: 0,\n\t\t\t\tspace: colorSpace,\n\t\t\t\tbitmapInfo: bitmapInfo.rawValue\n\t\t\t)!\n\n\t\t\t// The full angle sweep (which may be > 1)\n\t\t\tlet totalAngle = _fullCircle * value\n\n\t\t\twhile offset <= totalAngle {\n\n\t\t\t\tlet fractionalValue = totalAngle == 0 ? 0 : (offset / totalAngle)\n\t\t\t\tlet c = fillStyle.color(at: fractionalValue)\n\n\t\t\t\tlet x = radius + (radius * cos(offset - (CGFloat.pi * 0.5)))\n\t\t\t\tlet y = radius + (radius * sin(offset - (CGFloat.pi * 0.5)))\n\t\t\t\toffset += 0.01\n\n\t\t\t\tlet p = CGPath(\n\t\t\t\t\tellipseIn: CGRect(x: x - 0.1, y: y - 0.1, width: trackWidth + 0.2, height: trackWidth + 0.2),\n\t\t\t\t\ttransform: nil)\n\n\t\t\t\tfill.addPath(p)\n\t\t\t\tfill.setFillColor(c)\n\t\t\t\tfill.fillPath()\n\t\t\t}\n\n\t\t\t/// An image containing the drawn ring\n\t\t\tlet ringImage = fill.makeImage()!\n\t\t\tctx.draw(ringImage, in: drawRect, byTiling: false)\n\t\t}\n\n\t\t//\n\t\t// Draw a circle at the end\n\t\t//\n\n\t\tif value >= 0.92 {\n\t\t\tctx.usingGState { ctx in\n\t\t\t\tlet x = drawRect.minX + (radius + (radius * cos(offset - (CGFloat.pi * 0.5))))\n\t\t\t\tlet y = drawRect.minY + (radius + (radius * sin(offset - (CGFloat.pi * 0.5))))\n\n\t\t\t\tlet cp = CGPath(\n\t\t\t\t\tellipseIn: CGRect(x: x - 0.1, y: y - 0.1, width: trackWidth + 0.2, height: trackWidth + 0.2),\n\t\t\t\t\ttransform: nil\n\t\t\t\t)\n\t\t\t\tctx.addPath(cp)\n\t\t\t\tctx.setFillColor(fillStyle.color(at: 1.0))\n\n\t\t\t\tlet shadowAngle = offset + 0.1\n\t\t\t\tlet sx = drawRect.minX + (radius + (radius * cos(shadowAngle - (CGFloat.pi * 0.5))))\n\t\t\t\tlet sy = drawRect.minY + (radius + (radius * sin(shadowAngle - (CGFloat.pi * 0.5))))\n\t\t\t\tctx.setShadow(\n\t\t\t\t\toffset: CGSize(width: sx - x, height: sy - y),\n\t\t\t\t\tblur: dimension / 25,\n\t\t\t\t\tcolor: .black.copy(alpha: 0.4)\n\t\t\t\t)\n\n\t\t\t\tctx.fillPath()\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\t// Draw the icon\n\t\t//\n\n\t\tif let icon = icon {\n\t\t\tlet x = drawRect.minX + (radius + (radius * cos(-(CGFloat.pi * 0.5))))\n\t\t\tlet y = drawRect.minY + (radius + (radius * sin(-(CGFloat.pi * 0.5))))\n\n\t\t\tlet iconRect = CGRect(x: x, y: y, width: trackWidth, height: trackWidth).insetBy(dx: 2, dy: 2)\n\t\t\tctx.draw(icon, in: iconRect, byTiling: false)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+DataBar.swift",
    "content": "//\n//  DSFSparklineOverlay+DataBar.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\n\t@objc(DSFSparklineOverlayDataBar) class DataBar: DSFSparklineOverlay.StaticDataSource {\n\n\t\t/// The maximum _total_ value. If the datasource values total is greater than this value, it clips the display\n\t\t@objc public var maximumTotalValue: CGFloat = -1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The 'undrawn' color for the graph.\n\t\t///\n\t\t/// If a maximum total value is defined, and the datasource doesn't completely fill the total, then\n\t\t/// the empty section of the databar is drawn using this color.\n\t\t@objc public var unsetColor: CGColor? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The stroke color for the line(s) to be drawn between each segment of the databar.\n\t\t@objc public var strokeColor: CGColor? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The width of the stroke line to be drawn between each segment of the databar.  if 0, no stroke is drawn\n\t\t@objc public var lineWidth: CGFloat = 0.5 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The palette to use when drawing the databar\n\t\t@objc public var palette = DSFSparkline.Palette.shared {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t// MARK: Animation support\n\n\t\t/// The animation style\n\t\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil\n\n\t\tprivate var animated: Bool { animationStyle != nil }\n\n\t\t// MARK: Initializers\n\n\t\t@objc public override init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\toverride public init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.maximumTotalValue = orig.maximumTotalValue\n\t\t\tself.unsetColor = orig.unsetColor\n\t\t\tself.strokeColor = orig.strokeColor\n\t\t\tself.lineWidth = orig.lineWidth\n\t\t\tself.palette = orig.palette.copyPalette()\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\t// MARK: Data change\n\n\t\toverride func staticDataSourceDidChange() {\n\t\t\tsuper.staticDataSourceDidChange()\n\n\t\t\tif self.animated {\n\t\t\t\tself.startAnimateIn()\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.fractionComplete = 1.0\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawDataBarGraph(context: context, bounds: bounds, scale: scale)\n\t\t}\n\n\t\t// MARK: - Privates\n\n\t\tinternal var animator = ArbitraryAnimator()\n\t\tinternal var fractionComplete: CGFloat = 0\n\t}\n}\n\nprivate extension DSFSparklineOverlay.DataBar {\n\n\tfunc startAnimateIn() {\n\t\tguard let anim = self.animationStyle else { fatalError() }\n\t\t// Stop any animation that is currently active\n\t\tself.animator.progressBlock = nil\n\t\tself.animator.stop()\n\n\t\tself.fractionComplete = 0\n\n\t\tself.animator.animationFunction = anim.function.function\n\t\tself.animator.duration = anim.duration\n\t\tself.animator.progressBlock = { [weak self] progress in\n\t\t\tself?.fractionComplete = CGFloat(progress)\n\t\t\tself?.setNeedsDisplay()\n\t\t}\n\n\t\tself.animator.start()\n\t}\n\n}\n\nprivate extension DSFSparklineOverlay.DataBar {\n\tfunc drawDataBarGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tif fractionComplete == 0 { return }\n\n\t\tlet total = self.maximumTotalValue > 0 ? self.maximumTotalValue : self.dataSource.total\n\n\t\tlet rect = bounds.integral\n\t\tvar position: CGFloat = rect.minX\n\t\tlet delta: CGFloat = (rect.width / total) * self.fractionComplete\n\n\t\tcontext.clip(to: rect)\n\n\t\tif self.maximumTotalValue > 0, let unsetColor = self.unsetColor {\n\t\t\tlet cbheight = max(2, rect.height / 6)\n\t\t\tlet center = rect.midY\n\t\t\tlet centerBar = CGRect(x: rect.minX, y: center - (cbheight / 2), width: rect.width, height: cbheight)\n\t\t\tlet pth = CGPath(roundedRect: centerBar,\n\t\t\t\t\t\t\t\t  cornerWidth: cbheight / 2, cornerHeight: cbheight / 2, transform: nil)\n\n\t\t\tcontext.usingGState { state in\n\t\t\t\tstate.addPath(pth)\n\t\t\t\tstate.setFillColor(unsetColor)\n\t\t\t\tstate.fillPath()\n\t\t\t}\n\t\t}\n\n\t\tfor segment in self.dataSource.values.enumerated() {\n\t\t\tcontext.usingGState { state in\n\n\t\t\t\tstate.setFillColor(self.palette.cgColorAtOffset(segment.offset))\n\n\t\t\t\tlet width = segment.element * delta\n\n\t\t\t\tlet path = CGPath(rect: CGRect(x: position, y: rect.minY, width: width, height: rect.height), transform: nil)\n\t\t\t\tstate.addPath(path)\n\t\t\t\tstate.fillPath()\n\n\t\t\t\tif segment.offset > 0, let strokeColor = self.strokeColor {\n\t\t\t\t\tstate.usingGState { separator in\n\t\t\t\t\t\tseparator.setStrokeColor(strokeColor)\n\t\t\t\t\t\tseparator.setLineWidth(self.lineWidth)\n\t\t\t\t\t\tseparator.move(to: CGPoint(x: position, y: rect.minY))\n\t\t\t\t\t\tseparator.addLine(to: CGPoint(x: position, y: rect.maxY))\n\n\t\t\t\t\t\tseparator.strokePath()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tposition = position + width\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Dot.swift",
    "content": "//\n//  DSFSparklineOverlay+Dot.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t/// A dot graph\n\t@objc(DSFSparklineOverlayDot) class Dot: DSFSparklineOverlay.DataSource {\n\t\t/// The number of vertical buckets to break the input data up into\n\t\t@objc public var verticalDotCount: UInt = 10 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to use when a 'dot' within the bar is on\n\t\t@objc public var onColor: CGColor = .black {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to use when a 'dot' within the bar is off\n\t\t@objc public var offColor: CGColor? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Are the values drawn from the top down?\n\t\t@objc public var upsideDown: Bool = false {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.verticalDotCount = orig.verticalDotCount\n\t\t\tself.onColor = orig.onColor.copy() ?? .black\n\t\t\tself.offColor = orig.offColor?.copy()\n\t\t\tself.upsideDown = orig.upsideDown\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawDotGraph(context: context, bounds: bounds, scale: scale)\n\t\t}\n\t}\n}\n\nextension DSFSparklineOverlay.Dot {\n\tprivate func drawDotGraph(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard let dataSource = self.dataSource else { return }\n\n\t\tlet drawRect = bounds\n\n\t\tlet height = drawRect.height\n\t\tlet dotHeight = floor(height / CGFloat(self.verticalDotCount))\n\n\t\tlet xOffset: CGFloat = bounds.width.truncatingRemainder(dividingBy: dotHeight) / 2.0\n\t\tlet yOffset: CGFloat = bounds.height.truncatingRemainder(dividingBy: dotHeight) / 2.0\n\n\t\tvar position = drawRect.width - dotHeight - xOffset\n\n\t\t// Map normalized values to box positions\n\t\tlet normalizedBoxed: [UInt] = dataSource.normalized.reversed().map { dataPoint in\n\t\t\tlet floatBoxPos = CGFloat(self.verticalDotCount) * dataPoint\n\t\t\treturn UInt(floatBoxPos.rounded(.awayFromZero))\n\t\t}\n\n\t\tvar pv: [CGRect] = []\n\t\tvar uv: [CGRect] = []\n\n\t\tfor dataPoint in normalizedBoxed {\n\t\t\tlet boxCount = dataPoint\n\n\t\t\tfor c in 0 ..< self.verticalDotCount {\n\t\t\t\tlet pos = self.upsideDown\n\t\t\t\t\t? (CGFloat(c) * dotHeight) + yOffset\n\t\t\t\t\t: height - (CGFloat(c) * dotHeight) - dotHeight - yOffset\n\t\t\t\tlet r = CGRect(x: position, y: pos, width: dotHeight, height: dotHeight)\n\t\t\t\tlet ri = r.insetBy(dx: 0.5, dy: 0.5)\n\n\t\t\t\tif c < boxCount {\n\t\t\t\t\tpv.append(ri)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuv.append(ri)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Move left.  If we've hit the lower bound, then stop\n\t\t\tposition -= dotHeight\n\t\t\tif position < 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif pv.count > 0 {\n\t\t\tcontext.usingGState { state in\n\t\t\t\tlet path = CGMutablePath()\n\t\t\t\tpath.addRects(pv)\n\t\t\t\tstate.addPath(path)\n\t\t\t\tstate.setFillColor(self.onColor)\n\t\t\t\tstate.drawPath(using: .fill)\n\t\t\t}\n\t\t}\n\n\t\tif uv.count > 0, let offColor = self.offColor {\n\t\t\tcontext.usingGState { state in\n\t\t\t\tlet path = CGMutablePath()\n\t\t\t\tpath.addRects(uv)\n\t\t\t\tstate.addPath(path)\n\t\t\t\tstate.setFillColor(offColor)\n\t\t\t\tstate.drawPath(using: .fill)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Line.swift",
    "content": "//\n//  Copyright © 2025 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\t/// A line graph sparkline\n\t@objc(DSFSparklineOverlayLine) class Line: Centerable {\n\n\t\t/// The width for the line drawn on the graph\n\t\t@objc public var strokeWidth: CGFloat = 1.5 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Interpolate a curve between the points\n\t\t@objc public var interpolated: Bool = false {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Draw a shadow under the line\n\t\t@objc public var shadow: NSShadow? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The size of the markers to draw. If the markerSize is less than 0, markers will not draw\n\t\t@objc public var markerSize: CGFloat = -1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t// MARK: - Markers\n\n\t\t/// Representation of a marker within the sparkline\n\t\t@objc(DSFSparklineOverlayLineMarker) public class Marker: NSObject {\n\t\t\t/// The raw data value for the marker\n\t\t\t@objc public let value: CGFloat\n\t\t\t/// The rect representing the marker\n\t\t\t@objc public let rect: CGRect\n\t\t\t/// If the graph is a centering graph, is this marker considered to be positive or negative?\n\t\t\t@objc public let isPositiveValue: Bool\n\t\t\t@objc public init(value: CGFloat, rect: CGRect, isPositiveValue: Bool) {\n\t\t\t\tself.value = value\n\t\t\t\tself.rect = rect\n\t\t\t\tself.isPositiveValue = isPositiveValue\n\t\t\t}\n\t\t}\n\n\t\t/// Marker drawing callback\n\t\t/// - Parameters:\n\t\t///   - context: The drawing context\n\t\t///   - markerFrames: The Marker definitions for all of the markers within the current sparkline in left-to-right order\n\t\tpublic typealias MarkerDrawingBlock = (_ context: CGContext, _ markerFrames: [Marker]) -> Void\n\n\t\t/// An optional drawing function for custom drawing markers.\n\t\t///\n\t\t/// The `markerSize` value is used to determine the frameSize of each marker.\n\t\t/// If `markerSize` is less than 1, this block will not be called.\n\t\t///\n\t\t/// Note that this function is called very frequently so make sure its performant!\n\t\t@objc public lazy var markerDrawingBlock: MarkerDrawingBlock? = nil\n\n\t\t// Return the drawing function to use when drawing markers\n\t\tprivate var actualMarkerDrawingBlock: MarkerDrawingBlock {\n\t\t\treturn self.markerDrawingBlock ?? self.DefaultMarkerDrawingBlock\n\t\t}\n\n\t\t// Convert the default marker drawing function to a block\n\t\tprivate lazy var DefaultMarkerDrawingBlock: MarkerDrawingBlock = { context, markers in\n\t\t\tDSFSparklineOverlay.Line.DefaultMarkerDrawingFunc(what: self, context: context, markers: markers)\n\t\t}\n\n\t\tpublic override init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.strokeWidth = orig.strokeWidth\n\t\t\tself.interpolated = orig.interpolated\n\t\t\tself.shadow = orig.shadow?.copy() as? NSShadow\n\t\t\tself.markerSize = orig.markerSize\n\t\t\tsuper.init(layer: layer)\n\t\t\tself.markerDrawingBlock = orig.markerDrawingBlock\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tdeinit {\n\t\t\tself.markerDrawingBlock = nil\n\t\t}\n\n\t\t// MARK: - Draw handling\n\n\t\t// Override the edge insets to make sure our line graph fits\n\t\toverride internal func edgeInsets(for rect: CGRect) -> DSFEdgeInsets {\n\t\t\t// If there's a shadow, inset by the maximum shadow offset + blur radius\n\t\t\tlet shadowOffset: CGFloat = {\n\t\t\t\tif let s = shadow {\n\t\t\t\t\treturn max(s.shadowOffset.width, s.shadowOffset.height) + s.shadowBlurRadius\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\t// Standard inset taking into account marker sizes and shadow offsets\n\t\t\tlet inset = (self.markerSize > 0 ? self.markerSize / 2 : self.strokeWidth) + shadowOffset\n\n\t\t\t// Interpolation inset\n\t\t\tvar interpolationInset: CGFloat = 0\n\t\t\tif self.interpolated {\n\t\t\t\t// Hermite curve matching can overshoot. Until I can find/implement a better curve algorithm that\n\t\t\t\t// doesn't overshoot, we'll increase the height inset by a percentage of the height.\n\t\t\t\t// The following number is somewhat magic - based on worst cast overshoot and some visual testing\n\t\t\t\tlet rrr = self.currentPath().boundingBoxOfPath\n\t\t\t\tif rrr.minY < 0 {\n\t\t\t\t\tinterpolationInset = abs(rrr.minY) / 1.3\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn DSFEdgeInsets(\n\t\t\t\ttop: inset + interpolationInset,\n\t\t\t\tleft: inset,\n\t\t\t\tbottom: inset + interpolationInset,\n\t\t\t\tright: inset\n\t\t\t)\n\t\t}\n\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tif self.centeredAtZeroLine {\n\t\t\t\tself.drawCenteredGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.drawLineGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// MARK: - Default marker drawing\n\nprivate extension DSFSparklineOverlay.Line {\n\n\t// Default marker drawing\n\tstatic func DefaultMarkerDrawingFunc(what: Line, context ctx: CGContext, markers: [Marker]) {\n\t\tguard let primaryStrokeColor = what.primaryStrokeColor else { return }\n\n\t\tlet positiveMarkers = markers.filter { $0.isPositiveValue }\n\t\tlet negativeMarkers = markers.filter { $0.isPositiveValue == false }\n\n\t\t// draw positives. For a non-centered graph, all values are 'positive'\n\t\tif positiveMarkers.count > 0 {\n\t\t\tctx.usingGState { pCtx in\n\t\t\t\tlet path = CGMutablePath()\n\t\t\t\tpositiveMarkers.forEach { marker in\n\t\t\t\t\tpath.addPath(CGPath(ellipseIn: marker.rect, transform: nil))\n\t\t\t\t}\n\t\t\t\tpCtx.addPath(path)\n\t\t\t\tpCtx.setFillColor(primaryStrokeColor)\n\t\t\t\tif let shadow = what.shadow {\n\t\t\t\t\tpCtx.setShadow(shadow)\n\t\t\t\t}\n\t\t\t\tpCtx.fillPath()\n\t\t\t}\n\t\t}\n\n\t\t// draw negatives\n\t\tif negativeMarkers.count > 0 {\n\t\t\tlet strokeColor = what.secondaryStrokeColor ?? primaryStrokeColor\n\t\t\tctx.usingGState { nCtx in\n\t\t\t\tlet path = CGMutablePath()\n\t\t\t\tnegativeMarkers.forEach { marker in\n\t\t\t\t\tpath.addPath(CGPath(ellipseIn: marker.rect, transform: nil))\n\t\t\t\t}\n\t\t\t\tnCtx.addPath(path)\n\t\t\t\tnCtx.setFillColor(strokeColor)\n\t\t\t\tif let shadow = what.shadow {\n\t\t\t\t\tnCtx.setShadow(shadow)\n\t\t\t\t}\n\t\t\t\tnCtx.fillPath()\n\t\t\t}\n\t\t}\n\t}\n}\n\n// MARK: - Sparkline drawing\n\nprivate extension DSFSparklineOverlay.Line {\n\tfunc currentPath() -> CGPath {\n\t\tguard let dataSource = self.dataSource else { return CGPath(rect: .zero, transform: nil) }\n\t\tlet normy = dataSource.normalized\n\t\tlet xDiff = bounds.width / CGFloat(normy.count - 1)\n\t\tlet points = normy.enumerated().map {\n\t\t\tCGPoint(\n\t\t\t\tx: CGFloat($0.offset) * xDiff + bounds.minX,\n\t\t\t\ty: bounds.height + bounds.minY - ($0.element * bounds.height)\n\t\t\t)\n\t\t}\n\t\treturn CGPath.pathWithPoints(points, smoothed: self.interpolated)\n\t}\n}\n\nprivate extension DSFSparklineOverlay.Line {\n\tfunc drawLineGraph(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard let dataSource = self.dataSource,\n\t\t\t\tdataSource.counter != 0 else\n\t\t{\n\t\t\t// There's no line if there's either no data or just a single point\n\t\t\t// https://github.com/dagronf/DSFSparkline/issues/3#issuecomment-770324047\n\t\t\treturn\n\t\t}\n\n\t\tlet normy = dataSource.normalized\n\t\tlet xDiff = bounds.width / CGFloat(normy.count - 1)\n\t\tlet points = normy.enumerated().map {\n\t\t\tCGPoint(x: CGFloat($0.offset) * xDiff + bounds.minX,\n\t\t\t\t\t  y: bounds.height + bounds.minY - ($0.element * bounds.height))\n\t\t}\n\n\t\tlet path = CGPath.pathWithPoints(points, smoothed: self.interpolated)\n\n\t\tvar markersBounds: [CGRect] = []\n\t\tif self.markerSize > 0 {\n\t\t\tpoints.forEach { point in\n\t\t\t\tlet w = self.markerSize / 2\n\t\t\t\tlet r = CGRect(x: point.x - w, y: point.y - w, width: self.markerSize, height: self.markerSize)\n\t\t\t\tmarkersBounds.append(r)\n\t\t\t}\n\t\t}\n\n\t\tcontext.usingGState { outer in\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = bounds.minX + (CGFloat(dataSource.counter) * xDiff)\n\t\t\t\tlet clipRect = self.bounds.divided(atDistance: pos, from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect)\n\t\t\t}\n\n\t\t\tif let fill = self.primaryFill {\n\t\t\t\touter.usingGState { ctx in\n\n\t\t\t\t\t// Note that when using interpolated curves that the `bounds.maxY` value may NOT be zero as we've\n\t\t\t\t\t// scaled the curved graph down to reduce curve clipping. The primary fill needs to extend\n\t\t\t\t\t// down to the _full_ height of the graph or else we end up with a non-filled section at the lower\n\t\t\t\t\t// part of the graph.\n\t\t\t\t\tlet clipper = path.mutableCopy()!\n\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.maxX, y: points.last!.y))\n\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.maxX, y: self.bounds.maxY))\n\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.minX, y: self.bounds.maxY))\n\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.minX, y: points.first!.y))\n\t\t\t\t\tclipper.closeSubpath()\n\n\t\t\t\t\tctx.addPath(clipper)\n\t\t\t\t\tctx.clip()\n\t\t\t\t\tfill.fill(context: ctx, bounds: self.bounds)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif let strokeColor = self.primaryStrokeColor {\n\t\t\t\touter.usingGState { ctx in\n\t\t\t\t\tctx.addPath(path)\n\t\t\t\t\tctx.setStrokeColor(strokeColor)\n\t\t\t\t\tctx.setLineWidth(self.strokeWidth)\n\n\t\t\t\t\tif let shadow = self.shadow {\n\t\t\t\t\t\tctx.setShadow(shadow)\n\t\t\t\t\t}\n\t\t\t\t\tctx.setLineJoin(.round)\n\t\t\t\t\tctx.setLineCap(.round)\n\t\t\t\t\tctx.strokePath()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/// Draw the markers\n\t\t\tif !markersBounds.isEmpty {\n\t\t\t\touter.usingGState { ctx in\n\t\t\t\t\t// For the standard line, all values are 'positive'\n\t\t\t\t\tlet markers = zip(dataSource.data, markersBounds).map { Marker(value: $0.0, rect: $0.1, isPositiveValue: true) }\n\t\t\t\t\tself.actualMarkerDrawingBlock(ctx, markers)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunc drawCenteredGraph(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard let dataSource = self.dataSource,\n\t\t\t\tdataSource.counter != 0 else\n\t\t{\n\t\t\t// There's no line if there's either no data or just a single point\n\t\t\t// https://github.com/dagronf/DSFSparkline/issues/3#issuecomment-770324047\n\t\t\treturn\n\t\t}\n\n\t\t// Map the graph points within the updated bounds\n\t\tlet normy = dataSource.normalized\n\t\tlet xDiff = bounds.width / CGFloat(normy.count - 1)\n\t\tlet points = normy.enumerated().map {\n\t\t\tCGPoint(x: CGFloat($0.offset) * xDiff + bounds.minX,\n\t\t\t\t\t  y: bounds.height + bounds.minY - ($0.element * bounds.height))\n\t\t}\n\n\t\t// Calculate the graph centroid\n\t\tlet frac = dataSource.fractionalPosition(for: dataSource.zeroLineValue)\n\t\tlet centroid = bounds.height - (frac * bounds.height) + bounds.minY\n\n\t\tvar markers: [Marker] = []\n\n\t\tif self.markerSize > 0 {\n\t\t\tpoints.enumerated().forEach { point in\n\t\t\t\tlet w = self.markerSize / 2\n\t\t\t\tlet r = CGRect(x: point.element.x - w, y: point.element.y - w,\n\t\t\t\t\t\t\t\t\twidth: self.markerSize, height: self.markerSize)\n\n\t\t\t\tmarkers.append(\n\t\t\t\t\tMarker(\n\t\t\t\t\t\tvalue: dataSource.data[point.offset],\n\t\t\t\t\t\trect: r,\n\t\t\t\t\t\tisPositiveValue: !dataSource.valueAtOffsetIsBelowZeroline(point.offset)))\n\t\t\t}\n\t\t}\n\n\t\tlet path = CGPath.pathWithPoints(points, smoothed: self.interpolated).mutableCopy()!\n\n\t\tfor which in 0 ... 1 {\n\n\t\t\t// If the data source doesn't have enough data to fill the graph, then clip to the last x value\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = CGFloat(dataSource.counter) * xDiff\n\t\t\t\tlet clipRect = self.bounds.divided(atDistance: pos, from: .maxXEdge).slice\n\t\t\t\tcontext.clip(to: clipRect)\n\t\t\t}\n\n\t\t\tcontext.usingGState { inner in\n\n\t\t\t\t// We want to clip the drawing to the _full_ Y range, so that if an interpolated line graph is\n\t\t\t\t// scaled to avoid clipping we don't end up with blank spaces at the top and bottom of the graph.\n\t\t\t\tlet split = self.bounds.divided(atDistance: centroid, from: .minYEdge)\n\n\t\t\t\tlet activeRegion = (which == 0) ? split.slice : split.remainder\n\t\t\t\tinner.clip(to: activeRegion)\n\n\t\t\t\t// Fill color\n\t\t\t\tlet fillItem = (which == 0) ? self.primaryFill : self.secondaryFill\n\n\t\t\t\tif let fill = fillItem {\n\t\t\t\t\tinner.usingGState { ctx in\n\n\t\t\t\t\t\t// Note that when using interpolated curves that the `bounds.maxY` value may NOT be zero as we've\n\t\t\t\t\t\t// scaled the curved graph down to reduce curve clipping. The primary fill needs to extend\n\t\t\t\t\t\t// down to the _full_ height of the graph or else we end up with a non-filled section at the lower\n\t\t\t\t\t\t// part of the graph.\n\t\t\t\t\t\tlet altY = which == 0 ? self.bounds.maxY : self.bounds.minY\n\n\t\t\t\t\t\tlet clipper = path.mutableCopy()!\n\t\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.maxX, y: points.last!.y))\n\t\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.maxX, y: altY))\n\t\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.minX, y: altY))\n\t\t\t\t\t\tclipper.addLine(to: CGPoint(x: bounds.minX, y: points.first!.y))\n\t\t\t\t\t\tclipper.closeSubpath()\n\n\t\t\t\t\t\tctx.addPath(clipper)\n\t\t\t\t\t\tctx.clip()\n\t\t\t\t\t\tfill.fill(context: ctx, bounds: activeRegion)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet whichColor = (which == 0) ? self.primaryStrokeColor : self.secondaryStrokeColor\n\n\t\t\t\tif let stroke = whichColor {\n\t\t\t\t\tinner.usingGState { ctx in\n\t\t\t\t\t\tctx.addPath(path)\n\t\t\t\t\t\tctx.setStrokeColor(stroke)\n\t\t\t\t\t\tctx.setLineWidth(self.strokeWidth)\n\t\t\t\t\t\tif let shadow = self.shadow {\n\t\t\t\t\t\t\tctx.setShadow(shadow)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.setLineJoin(.round)\n\t\t\t\t\t\tctx.setLineCap(.round)\n\t\t\t\t\t\tctx.strokePath()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Draw the markers\n\n\t\tif self.markerSize > 0 {\n\t\t\tcontext.usingGState { ctx in\n\t\t\t\tself.actualMarkerDrawingBlock(ctx, markers)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+PercentBar.swift",
    "content": "//\n//  DSFSparklineOverlay+PercentBar.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 16/3/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\nimport SwiftUI\n\npublic extension DSFSparkline {\n\t@objc class PercentBar: NSObject {\n\t\t/// Percent Bar style class. Assigned values should be in the range 0 ... 1\n\t\t@objc(DSFSparklinePercentBarStyle) public class Style: NSObject {\n\t\t\t// MARK: Public\n\n\t\t\t/// The corner radius for the bar/underbar\n\t\t\t@objc public var cornerRadius: CGFloat = 4\n\n\t\t\t/// The graph background color\n\t\t\t@objc public var underBarColor = CGColor.DefaultWhite\n\t\t\t/// The color of text when drawn on the background\n\t\t\t@objc public var underBarTextColor = CGColor.DefaultBlack\n\n\t\t\t/// The color of the value bar\n\t\t\t@objc public var barColor = CGColor.DefaultBlack\n\t\t\t/// The color of text when drawn on top of the bar\n\t\t\t@objc public var barTextColor = CGColor.DefaultWhite\n\n\t\t\t/// The formatter to use\n\t\t\t@objc public var numberFormatter = Style.DefaultFormatter\n\n\t\t\t/// The font to use\n\t\t\t@objc public var font = DSFFont.systemFont(ofSize: 12.0)\n\n\t\t\t/// How much to inset the value bar from the bounds of the control\n\t\t\t@objc public var barEdgeInsets = DSFEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)\n\n\t\t\t/// Should we display a text percentage value on the bar?\n\t\t\t@objc public var showLabel: Bool = true\n\n\t\t\t@objc public func label(for value: CGFloat) -> String {\n\t\t\t\treturn self.numberFormatter.string(from: NSNumber(value: Double(value))) ?? \"\"\n\t\t\t}\n\n\t\t\t// MARK: Private\n\n\t\t\tfileprivate static let DefaultFormatter: NumberFormatter = {\n\t\t\t\tlet f = NumberFormatter()\n\t\t\t\tf.numberStyle = .percent\n\t\t\t\tf.minimumFractionDigits = 0\n\t\t\t\tf.maximumFractionDigits = 0\n\t\t\t\treturn f\n\t\t\t}()\n\n\t\t\t// Convenience\n\t\t\tfileprivate var fontSize: CGFloat { return self.font.pointSize }\n\t\t}\n\t}\n}\n\npublic extension DSFSparklineOverlay {\n\t/// A percent bar sparkline\n\t@objc(DSFSparklineOverlayPercentBar) class PercentBar: DSFSparklineOverlay {\n\t\t/// The value assigned to the percent bar. A value between 0.0 and 1.0\n\t\t@objc public var value: CGFloat = 0.0 {\n\t\t\tdidSet {\n\t\t\t\tself.valueDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// The value that is displayed in the control.  This is the clamped version of `value`\n\t\t@objc public private(set) var displayValue: CGFloat = 0.0\n\n\t\t/// The style to apply to the percent bar\n\t\t@objc public var displayStyle = DSFSparkline.PercentBar.Style() {\n\t\t\tdidSet {\n\t\t\t\tself.displayStyleDidChange()\n\t\t\t}\n\t\t}\n\n\t\t/// Animation style\n\t\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil\n\n\t\tinternal var animated: Bool { animationStyle != nil }\n\n\t\t/// Creator\n\t\t@objc public init(style: DSFSparkline.PercentBar.Style = DSFSparkline.PercentBar.Style(), value: CGFloat) {\n\t\t\tsuper.init()\n\n\t\t\tself.addSublayer(self.fractionLayer)\n\t\t\tself.addSublayer(self.textLayer)\n\n\t\t\tself.cornerRadius = style.cornerRadius\n\n\t\t\tself.fractionLayer.zPosition = -3\n\t\t\tself.fractionLayer.cornerRadius = self.displayStyle.cornerRadius\n\n\t\t\tself.textLayer.contentsScale = 2\n\n\t\t\tself.displayStyle = style\n\n\t\t\tself.displayStyleDidChange()\n\n\t\t\tself.value = value\n\t\t\tself.valueDidChange()\n\n\t\t\tself.setNeedsLayout()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.value = orig.value\n\t\t\tself.displayValue = orig.displayValue\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\t@available(*, unavailable)\n\t\trequired init?(coder _: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\toverride internal func drawGraph(context _: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\t\t// Do nothing.  All the content is handled by layers\n\t\t\treturn\n\t\t}\n\n\t\t// MARK: Layers\n\n\t\tprivate let textLayer = LCTextLayer() // Text layer\n\t\tprivate let fractionLayer = CAShapeLayer() // Bar layer\n\n\t\t// MARK: Value helpers\n\n\t\tprivate var previousValue: CGFloat = 0.0 // The previously assigned fractional value (for animation)\n\n\t\t// MARK: Animation\n\n\t\tprivate var animator = ArbitraryAnimator() //\n\t\tprivate var fractionComplete: CGFloat = 0\n\t}\n}\n\nextension DSFSparklineOverlay.PercentBar {\n\toverride public func layoutSublayers() {\n\t\tsuper.layoutSublayers()\n\t\tself.layoutGraph()\n\t}\n\n\tprivate func layoutGraph() {\n\t\tCATransaction.withDisabledActions {\n\t\t\tlet diff = self.displayValue - self.previousValue\n\t\t\tlet fDiff = diff * self.fractionComplete\n\n\t\t\tlet complete = fDiff + self.previousValue\n\n\t\t\tlet nb = bounds.inset(by: self.displayStyle.barEdgeInsets)\n\t\t\tlet divide = nb.divided(atDistance: complete * bounds.width,\n\t\t\t\t\t\t\t\t\t\t\tfrom: .minXEdge)\n\n\t\t\tlet setRect = divide.slice\n\n\t\t\tself.fractionLayer.frame = setRect\n\n\t\t\tif self.displayStyle.showLabel {\n\t\t\t\tlet textSz = self.textLayer.textBounds(\n\t\t\t\t\tfor: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)).width\n\t\t\t\tlet leftRect = setRect.insetBy(dx: 3, dy: 0)\n\n\t\t\t\tif textSz > leftRect.width {\n\t\t\t\t\tself.textLayer.frame = divide.remainder.insetBy(dx: 3, dy: 0)\n\t\t\t\t\tself.textLayer.alignmentMode = .left\n\t\t\t\t\tself.textLayer.foregroundColor = self.displayStyle.underBarTextColor\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.textLayer.frame = leftRect\n\t\t\t\t\tself.textLayer.alignmentMode = .right\n\t\t\t\t\tself.textLayer.foregroundColor = self.displayStyle.barTextColor\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nprivate extension DSFSparklineOverlay.PercentBar {\n\tfunc valueDidChange() {\n\t\t// Store the previous value for our animation\n\t\tself.previousValue = self.displayValue\n\t\t// Make sure our internal fraction value is always 0 ... 1\n\t\tself.displayValue = self.value.clamped(to: 0 ... 1)\n\t\t// Recreate the text for the label\n\t\tself.updateLabel()\n\t\t// And notify that data changed\n\t\tself.dataDidChange()\n\t}\n\n\tfunc updateLabel() {\n\t\tlet label = self.displayStyle.label(for: self.displayValue)\n\t\tCATransaction.withDisabledActions {\n\t\t\tself.textLayer.string = label\n\t\t}\n\t}\n\n\tfunc dataDidChange() {\n\t\tif self.animated {\n\t\t\tself.startAnimateIn()\n\t\t}\n\t\telse {\n\t\t\tself.fractionComplete = 1.0\n\t\t\tself.setNeedsDisplay()\n\t\t}\n\t}\n\n\tfunc startAnimateIn() {\n\t\tguard let anim = self.animationStyle else { fatalError() }\n\t\t// Stop any animation that is currently active\n\t\tself.animator.progressBlock = nil\n\n\t\tself.animator.stop()\n\t\tself.fractionComplete = 0\n\n\t\tself.animator.animationFunction = anim.function.function\n\t\tself.animator.duration = anim.duration\n\t\tself.animator.progressBlock = { [weak self] progress in\n\t\t\tself?.fractionComplete = CGFloat(progress)\n\t\t\tself?.setNeedsLayout()\n\t\t}\n\t\tself.animator.start()\n\t}\n\n\tfunc displayStyleDidChange() {\n\t\tCATransaction.withDisabledActions {\n\t\t\tself.cornerRadius = self.displayStyle.cornerRadius\n\t\t\tself.backgroundColor = self.displayStyle.underBarColor\n\n\t\t\tself.fractionLayer.backgroundColor = self.displayStyle.barColor\n\t\t\tself.fractionLayer.cornerRadius = self.displayStyle.cornerRadius\n\n\t\t\tself.textLayer.isHidden = !self.displayStyle.showLabel\n\t\t\tself.textLayer.font = CTFontCreateWithFontDescriptor(self.displayStyle.font.fontDescriptor, 0, nil)\n\t\t\tself.textLayer.fontSize = self.displayStyle.fontSize\n\t\t}\n\t\tself.setNeedsDisplay()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Pie.swift",
    "content": "//\n//  DSFSparklineOverlay+Pie.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t/// A pie graph\n\t@objc(DSFSparklineOverlayPie) class Pie: DSFSparklineOverlay.StaticDataSource {\n\t\t/// The palette to use when drawing the pie chart\n\t\t@objc public var palette = DSFSparkline.Palette.shared {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The stroke color for the pie chart\n\t\t@objc public var strokeColor: CGColor? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The width of the stroke line\n\t\t@objc public var lineWidth: CGFloat = 0.5 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Should the pie chart animate in?\n\t\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil\n\n\t\t// Should we animate?\n\t\tprivate var animated: Bool { animationStyle != nil }\n\n\t\t/// Create\n\t\t@objc public override init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.palette = orig.palette.copyPalette()\n\t\t\tself.strokeColor = orig.strokeColor?.copy()\n\t\t\tself.lineWidth = orig.lineWidth\n\t\t\tself.animationStyle = orig.animationStyle\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\toverride func staticDataSourceDidChange() {\n\t\t\tsuper.staticDataSourceDidChange()\n\t\t\tif self.animated {\n\t\t\t\tself.startAnimateIn()\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.fractionComplete = 1.0\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawPieGraph(context: context, bounds: bounds, scale: scale)\n\t\t}\n\n\t\t// MARK: - Privates\n\n\t\tinternal var animator = ArbitraryAnimator()\n\t\tinternal var fractionComplete: CGFloat = 0\n\t}\n}\n\nprivate extension DSFSparklineOverlay.Pie {\n\tfunc startAnimateIn() {\n\t\tguard let anim = self.animationStyle else { fatalError() }\n\n\t\t// Stop any animation that is currently active\n\t\tself.animator.stop()\n\n\t\tself.fractionComplete = 0\n\n\t\tself.animator.animationFunction = anim.function.function\n\t\tself.animator.duration = anim.duration\n\n\t\tself.animator.progressBlock = { [weak self] progress in\n\t\t\tself?.fractionComplete = CGFloat(progress)\n\t\t\tself?.setNeedsDisplay()\n\t\t}\n\n\t\tself.animator.start()\n\t}\n}\n\nprivate extension DSFSparklineOverlay.Pie {\n\n\tfunc drawPieGraph(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tif fractionComplete == 0 {\n\t\t\treturn\n\t\t}\n\n\t\tlet rect = bounds.insetBy(dx: 1, dy: 1)\n\n\t\t// radius is the half the frame's width or height (whichever is smallest)\n\t\tlet radius = min(rect.width, rect.height) * 0.5\n\n\t\t// center of the view\n\t\tlet viewCenter = CGPoint(x: rect.midX, y: rect.midY)\n\n\t\t// the starting angle is -90 degrees (top of the circle, as the context is flipped). By default, 0 is the right hand side of the circle, with the positive angle being in an anti-clockwise direction (same as a unit circle in maths).\n\t\tvar startAngle = -CGFloat.pi * 0.5\n\n\t\tfor segment in self.dataSource.values.enumerated() { // loop through the values array\n\t\t\tcontext.usingGState { state in\n\n\t\t\t\t// set fill color to the segment color\n\t\t\t\tstate.setFillColor(self.palette.cgColorAtOffset(segment.offset))\n\n\t\t\t\t// update the end angle of the segment\n\t\t\t\tlet fraEndAngle = startAngle + (2 * .pi * (segment.element / self.dataSource.total)) * fractionComplete\n\n\t\t\t\t// move to the center of the pie chart\n\t\t\t\tstate.move(to: viewCenter)\n\n\t\t\t\t// add arc from the center for each segment (anticlockwise is specified for the arc, but as the view flips the context, it will produce a clockwise arc)\n\t\t\t\tstate.addArc(center: viewCenter, radius: radius, startAngle: startAngle, endAngle: fraEndAngle, clockwise: false)\n\n\t\t\t\tstate.drawPath(using: .fill)\n\n\t\t\t\t// update starting angle of the next segment to the ending angle of this segment\n\t\t\t\tstartAngle = fraEndAngle // endAngle\n\t\t\t}\n\t\t}\n\n\t\t// We draw the strokes AFTER we draw ALL the segment fills to avoid unpleasant rendering\n\n\t\tif let stroke = self.strokeColor {\n\t\t\tvar startAngle = -CGFloat.pi * 0.5\n\n\t\t\tcontext.setStrokeColor(stroke)\n\t\t\tcontext.setLineWidth(self.lineWidth)\n\n\t\t\tfor segment in self.dataSource.values.enumerated() { // loop through the values array\n\t\t\t\tcontext.usingGState { state in\n\n\t\t\t\t\t// update the end angle of the segment\n\t\t\t\t\tlet fraEndAngle = startAngle + (2 * .pi * (segment.element / self.dataSource.total)) * fractionComplete\n\n\t\t\t\t\t// move to the center of the pie chart\n\t\t\t\t\tstate.move(to: viewCenter)\n\n\t\t\t\t\t// add arc from the center for each segment (anticlockwise is specified for the arc, but as the view flips the context, it will produce a clockwise arc)\n\t\t\t\t\tstate.addArc(center: viewCenter, radius: radius, startAngle: startAngle, endAngle: fraEndAngle, clockwise: false)\n\n\t\t\t\t\tstate.drawPath(using: .stroke)\n\n\t\t\t\t\t// update starting angle of the next segment to the ending angle of this segment\n\t\t\t\t\tstartAngle = fraEndAngle // endAngle\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Stackline.swift",
    "content": "//\n//  Copyright © 2025 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\t/// A stackline graph\n\t@objc(DSFSparklineOverlayStackline) class Stackline: Centerable {\n\t\t/// The width for the line drawn on the graph\n\t\t@objc public var strokeWidth: CGFloat = 1.5 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Interpolate a curve between the points\n\t\t@objc public var barSpacing: UInt = 1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// Draw a shadow under the line\n\t\t@objc public var shadow: NSShadow? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public override init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.strokeWidth = orig.strokeWidth\n\t\t\tself.barSpacing = orig.barSpacing\n\t\t\tself.shadow = orig.shadow?.copy() as? NSShadow\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tif self.centeredAtZeroLine {\n\t\t\t\tself.drawCenteredStackLineGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.drawStackLineGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t}\n\t}\n}\n\nextension DSFSparklineOverlay.Stackline {\n\tprivate func drawStackLineGraph(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard let dataSource = self.dataSource else {\n\t\t\treturn\n\t\t}\n\n\t\tlet integralRect = bounds.integral\n\t\tlet integralHeight: CGFloat = integralRect.height\n\n\t\t// This represents the _full_ width of a bar within the graph, including the spacing.\n\t\tlet componentWidth = Int(integralRect.width) / Int(dataSource.windowSize)\n\n\t\t// The left offset in order to center X\n\t\tlet xOffset: Int = (Int(bounds.width) - (componentWidth * Int(dataSource.windowSize))) / 2\n\n\t\t// The available height range\n\t\tlet range: ClosedRange<CGFloat> = 1 ... max(1, integralRect.maxY)\n\n\t\t// The normalized (0 -> 1) data points\n\t\tlet normalized = dataSource.normalized\n\n\t\tlet points: [CGPoint] = normalized.enumerated().map {\n\t\t\tlet xVal = xOffset + ($0.offset * componentWidth)\n\t\t\tlet yVal = (integralHeight - ($0.element * integralHeight)).clamped(to: range)\n\t\t\treturn CGPoint(x: xVal, y: Int(yVal))\n\t\t}\n\n\t\tlet ordered = points.enumerated()\n\n\t\tlet emptyBuckets = Int(dataSource.emptyValueCount)\n\t\tlet available = Array(ordered.dropFirst(emptyBuckets))\n\n\t\tif available.count == 0 {\n\t\t\t// Nothing to do!\n\t\t\treturn\n\t\t}\n\n\t\tcontext.usingGState { outer in\n\n\t\t\touter.setRenderingIntent(.relativeColorimetric)\n\t\t\touter.interpolationQuality = .none\n\t\t\touter.setShouldAntialias(false)\n\n\t\t\tlet linePath = CGMutablePath()\n\t\t\tfor point in available {\n\t\t\t\tlet currentPoint = point.element\n\n\t\t\t\tif linePath.isEmpty {\n\t\t\t\t\t// First point\n\t\t\t\t\tlinePath.move(to: currentPoint)\n\t\t\t\t\tlinePath.addLine(to: currentPoint.offsettingX(by: CGFloat(componentWidth)))\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlinePath.addLine(to: currentPoint)\n\t\t\t\t\tlinePath.addLine(to: point.element.offsettingX(by: CGFloat(componentWidth)))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif linePath.isEmpty {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\touter.usingGState { fillCtx in\n\n\t\t\t\tlet fillPath = linePath.mutableCopy()!\n\t\t\t\tlet bounds = fillPath.boundingBox\n\n\t\t\t\tfillPath.addLine(to: CGPoint(x: bounds.maxX, y: integralRect.maxY))\n\t\t\t\tfillPath.addLine(to: CGPoint(x: bounds.minX, y: integralRect.maxY))\n\t\t\t\tfillPath.closeSubpath()\n\n\t\t\t\tfillCtx.addPath(fillPath)\n\t\t\t\tfillCtx.clip()\n\t\t\t\tself.primaryFill?.fill(context: fillCtx, bounds: integralRect)\n\t\t\t}\n\n\t\t\tif let stroke = self.primaryStrokeColor {\n\t\t\t\touter.addPath(linePath)\n\t\t\t\touter.setStrokeColor(stroke)\n\t\t\t\touter.setLineWidth(self.strokeWidth)\n\n\t\t\t\tif let shadow = self.shadow {\n\t\t\t\t\touter.setShadow(shadow)\n\t\t\t\t}\n\n\t\t\t\touter.strokePath()\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate func drawCenteredStackLineGraph(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard let dataSource = self.dataSource else {\n\t\t\treturn\n\t\t}\n\n\t\tlet integralRect = bounds.integral\n\t\tlet integralHeight: CGFloat = integralRect.height\n\n\t\t// This represents the _full_ width of a bar within the graph, including the spacing.\n\t\tlet componentWidth = Int(integralRect.width) / Int(dataSource.windowSize)\n\n\t\t// The left offset in order to center X\n\t\tlet xOffset: Int = (Int(bounds.width) - (componentWidth * Int(dataSource.windowSize))) / 2\n\n\t\t// The available height range\n\t\tlet range: ClosedRange<CGFloat> = 1 ... max(1, integralRect.maxY)\n\n\t\t// The normalized (0 -> 1) data points\n\t\tlet normalized = dataSource.normalized\n\n\t\tlet points: [CGPoint] = normalized.enumerated().map {\n\t\t\tlet xVal = xOffset + ($0.offset * componentWidth)\n\t\t\tlet yVal = (integralHeight - ($0.element * integralHeight)).clamped(to: range)\n\t\t\treturn CGPoint(x: xVal, y: Int(yVal))\n\t\t}\n\n\t\tlet ordered = points.enumerated()\n\n\t\tlet emptyBuckets = Int(dataSource.emptyValueCount)\n\t\tlet available = Array(ordered.dropFirst(emptyBuckets))\n\n\t\tif available.count == 0 {\n\t\t\t// Nothing to do!\n\t\t\treturn\n\t\t}\n\n\t\tlet centroid = (1 - dataSource.normalizedZeroLineValue) * (integralHeight - 1)\n\n\t\tlet first = available.first!\n\t\tif first.offset != 0 {\n\t\t\tvar clip = bounds\n\t\t\tclip.origin.x = first.element.x\n\t\t\tclip.size.width -= first.element.x\n\t\t\tcontext.clip(to: clip)\n\t\t}\n\n\t\tcontext.usingGState { outer in\n\n\t\t\touter.setRenderingIntent(.relativeColorimetric)\n\t\t\touter.interpolationQuality = .none\n\t\t\touter.setShouldAntialias(false)\n\n\t\t\tlet linePath = CGMutablePath()\n\t\t\tlinePath.move(to: CGPoint(x: integralRect.minX - 1, y: centroid))\n\t\t\tlinePath.addLine(to: CGPoint(x: integralRect.minX - 1, y: available.first!.element.y))\n\n\t\t\tfor point in available {\n\t\t\t\tlet currentPoint = point.element\n\t\t\t\tlinePath.addLine(to: currentPoint)\n\t\t\t\tlinePath.addLine(to: point.element.offsettingX(by: CGFloat(componentWidth)))\n\t\t\t}\n\n\t\t\tlinePath.addLine(to: CGPoint(x: integralRect.maxX + 1, y: available.last!.element.y))\n\t\t\tlinePath.addLine(to: CGPoint(x: integralRect.maxX + 1, y: centroid))\n\n\t\t\tif linePath.isEmpty {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet outerClip = integralRect.insetBy(dx: CGFloat(xOffset), dy: 0)\n\t\t\touter.clip(to: outerClip)\n\n\t\t\touter.usingGState { clipped in\n\n\t\t\t\tlet split = outerClip.divided(atDistance: centroid, from: .minYEdge)\n\n\t\t\t\tfor which in 0 ... 1 {\n\t\t\t\t\tclipped.usingGState { inner in\n\n\t\t\t\t\t\tlet whichRegion = (which == 0) ? split.slice : split.remainder\n\t\t\t\t\t\tinner.clip(to: whichRegion)\n\n\t\t\t\t\t\tlet fillItem = (which == 0) ? self.primaryFill : self.secondaryFill\n\n\t\t\t\t\t\tif let fill = fillItem {\n\t\t\t\t\t\t\tinner.usingGState { fillCtx in\n\t\t\t\t\t\t\t\tfillCtx.addPath(linePath)\n\t\t\t\t\t\t\t\tfillCtx.clip()\n\t\t\t\t\t\t\t\tfill.fill(context: fillCtx, bounds: whichRegion)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet whichStroke = (which == 0) ? self.primaryStrokeColor : self.secondaryStrokeColor\n\n\t\t\t\t\t\tif let strokeColor = whichStroke {\n\t\t\t\t\t\t\tinner.addPath(linePath)\n\t\t\t\t\t\t\tinner.setStrokeColor(strokeColor)\n\t\t\t\t\t\t\tinner.setLineWidth(self.strokeWidth)\n\n\t\t\t\t\t\t\tif let shadow = self.shadow {\n\t\t\t\t\t\t\t\tinner.setShadow(shadow)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tinner.strokePath()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Stripes.swift",
    "content": "//\n//  DSFSparklineOverlay+Stripes.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t@objc(DSFSparklineOverlayStripes) class Stripes: DSFSparklineOverlay.DataSource {\n\n\t\t// A default gradient pattern\n\t\tstatic let defaultGradient = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemRed.cgColor, location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemOrange.cgColor, location: 1 / 5),\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemYellow.cgColor, location: 2 / 5),\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemGreen.cgColor, location: 3 / 5),\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemBlue.cgColor, location: 4 / 5),\n\t\t\tDSFSparkline.GradientBucket.Post(color: DSFColor.systemPurple.cgColor, location: 5 / 5),\n\t\t])\n\n\t\t/// The width of the stroke for the tablet\n\t\t@objc public var integral: Bool = true {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The spacing (in pixels) between each bar\n\t\t@objc public var barSpacing: UInt = 1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color gradient to use when rendering.\n\t\t///\n\t\t/// Note that transparent gradients display strangely and not as I would expect them to.\n\t\t/// Stick with solid colors in your gradient for the current time.\n\t\t@objc public var gradient: DSFSparkline.GradientBucket = Stripes.defaultGradient {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.integral = orig.integral\n\t\t\tself.barSpacing = orig.barSpacing\n\t\t\tself.gradient = orig.gradient.copyGradientBucket()\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tif self.integral {\n\t\t\t\tself.drawStripeGraph(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.drawStripeGraphFloat(context: context, bounds: bounds, scale: scale)\n\t\t\t}\n\t\t}\n\t}\n}\n\nprivate extension DSFSparklineOverlay.Stripes {\n\tfunc drawStripeGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tguard let dataSource = self.dataSource else {\n\t\t\treturn\n\t\t}\n\n\t\tlet integralRect = bounds.integral\n\n\t\t// This represents the _full_ width of a bar within the graph, including the spacing.\n\t\tlet componentWidth = Int(integralRect.width) / Int(dataSource.windowSize)\n\n\t\t// The width of the BAR component\n\t\tlet barWidth = componentWidth - Int(barSpacing)\n\n\t\t// The left offset in order to center X\n\t\tlet xOffset: Int = Int(self.bounds.minX) + (Int(bounds.width) - (componentWidth * Int(dataSource.windowSize))) / 2\n\n\t\tlet normalizedPoints = dataSource.normalized\n\n\t\tcontext.usingGState { outer in\n\n\t\t\touter.setRenderingIntent(.perceptual)\n\t\t\touter.interpolationQuality = .default\n\t\t\touter.setShouldAntialias(false)\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = xOffset + (Int(dataSource.counter) * componentWidth)\n\t\t\t\tlet clipRect = bounds.divided(atDistance: CGFloat(pos), from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect)\n\t\t\t}\n\n\t\t\tfor value in normalizedPoints.enumerated() {\n\t\t\t\touter.usingGState { inner in\n\t\t\t\t\tlet color = gradient.color(at: value.element)\n\t\t\t\t\tinner.setFillColor(color)\n\t\t\t\t\tlet r = CGRect(x: CGFloat(xOffset + value.offset * componentWidth),\n\t\t\t\t\t\t\t\t\t\ty: integralRect.minX,\n\t\t\t\t\t\t\t\t\t\twidth: CGFloat(barWidth) + (1.0 / scale),\n\t\t\t\t\t\t\t\t\t\theight: integralRect.height)\n\t\t\t\t\tinner.fill(r)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate func drawStripeGraphFloat(context: CGContext, bounds: CGRect, scale _: CGFloat) {\n\t\tguard let dataSource = self.dataSource else {\n\t\t\treturn\n\t\t}\n\n\t\tlet drawRect = bounds\n\n\t\t// This represents the _full_ width of a bar within the graph, including the spacing.\n\t\tlet componentWidth = drawRect.width / CGFloat(dataSource.windowSize)\n\n\t\t// The width of the BAR component\n\t\tlet barWidth = componentWidth - CGFloat(barSpacing)\n\n\t\tlet normalizedPoints = dataSource.normalized\n\n\t\tcontext.usingGState { outer in\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = CGFloat(dataSource.counter) * componentWidth\n\t\t\t\tlet clipRect = bounds.divided(atDistance: CGFloat(pos), from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect)\n\t\t\t}\n\n\t\t\tfor value in normalizedPoints.enumerated() {\n\t\t\t\touter.usingGState { inner in\n\t\t\t\t\tlet color = gradient.color(at: value.element)\n\t\t\t\t\tinner.setFillColor(color)\n\t\t\t\t\tlet r = CGRect(\n\t\t\t\t\t\tx: bounds.minX + CGFloat(value.offset) * componentWidth - (barSpacing == 0 ? 0.5 : 0),\n\t\t\t\t\t\ty: drawRect.minY,\n\t\t\t\t\t\twidth: barWidth + (barSpacing == 0 ? 0.5 : 0),\n\t\t\t\t\t\theight: drawRect.height\n\t\t\t\t\t)\n\t\t\t\t\tinner.addRect(r)\n\t\t\t\t\tinner.drawPath(using: .fill)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+Tablet.swift",
    "content": "//\n//  DSFSparklineOverlay+Tablet.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t/// A tablet-style graph.\n\t@objc(DSFSparklineOverlayTablet) class Tablet: DSFSparklineOverlay.DataSource {\n\n\t\tstatic let greenStroke = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 1])!\n\t\tstatic let redStroke = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 1])!\n\n\t\tstatic let greenFill = DSFSparkline.Fill.Color(CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 0.3])!)\n\t\tstatic let redFill = DSFSparkline.Fill.Color(CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 0.3])!)\n\n\n\t\t/// The width of the stroke for the tablet\n\t\t@objc public var lineWidth: CGFloat = 1.0 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The spacing (in pixels) between each tablet\n\t\t@objc public var tabletSpacing: CGFloat = 1.0 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the win tablets\n\t\t@objc public var winStrokeColor: CGColor = Tablet.greenStroke {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'win' boxes\n\t\t@objc public var winFill: DSFSparklineFillable? = Tablet.greenFill {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the win tablets\n\t\t@objc public var lossStrokeColor: CGColor = Tablet.redStroke {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'win' boxes\n\t\t@objc public var lossFill: DSFSparklineFillable? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.lineWidth = orig.lineWidth\n\t\t\tself.tabletSpacing = orig.tabletSpacing\n\t\t\tself.winStrokeColor = orig.winStrokeColor\n\t\t\tself.winFill = orig.winFill?.copyFill()\n\t\t\tself.lossStrokeColor = orig.lossStrokeColor\n\t\t\tself.lossFill = orig.lossFill?.copyFill()\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawTabletGraph(context: context, bounds: bounds, scale: scale)\n\t\t}\n\t}\n}\n\nprivate extension DSFSparklineOverlay.Tablet {\n\tfunc drawTabletGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tguard let dataSource = self.dataSource else {\n\t\t\treturn\n\t\t}\n\n\t\tlet integralRect = bounds.insetBy(dx: 0, dy: 1)\n\t\tlet windowSize = CGFloat(dataSource.windowSize)\n\n\t\t// The amount of space left in the rect once we've removed the bar spacing for all elements\n\t\tlet w = integralRect.width - (windowSize * (self.tabletSpacing + self.lineWidth)) - 2*self.lineWidth\n\n\t\t// The size of a circle\n\t\tlet circleSize = min(w / CGFloat(windowSize), integralRect.height)\n\n\t\t// This represents the _full_ width of a circle, including the spacing.\n\t\tlet componentWidth = circleSize + self.tabletSpacing + self.lineWidth\n\n\t\t// The left offset in order to center X\n\t\tlet xOffset: CGFloat = (integralRect.width - (componentWidth * windowSize)) / 2\n\n\t\t// Map the +ve values to true, the -ve (and 0) to false\n\t\tlet winLoss: [Int] = dataSource.data.map {\n\t\t\tif $0 > 0 { return 1 }\n\t\t\treturn -1\n\t\t}\n\n\t\tlet midPoint = bounds.midY\n\n\t\tcontext.usingGState { outer in\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = CGFloat(dataSource.counter) * componentWidth\n\t\t\t\tlet clipRect = integralRect.divided(atDistance: CGFloat(pos + xOffset + CGFloat(self.tabletSpacing / 2)), from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect.integral)\n\t\t\t}\n\n\t\t\tlet winPath = CGMutablePath()\n\t\t\tlet lossPath = CGMutablePath()\n\n\t\t\tfor point in winLoss.enumerated() {\n\t\t\t\tlet x = xOffset + CGFloat(point.offset) * componentWidth\n\t\t\t\tif point.element == 1 {\n\t\t\t\t\tlet rect = CGRect(x: x, y: midPoint - (circleSize / 2), width: circleSize, height: circleSize)\n\t\t\t\t\twinPath.addEllipse(in: rect.integral)\n\t\t\t\t}\n\t\t\t\telse if point.element == -1 {\n\t\t\t\t\tlet rect = CGRect(x: x, y: midPoint - (circleSize / 2), width: circleSize, height: circleSize)\n\t\t\t\t\tlossPath.addEllipse(in: rect.integral)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !winPath.isEmpty {\n\t\t\t\touter.usingGState { winState in\n\t\t\t\t\tif let fill = self.winFill {\n\t\t\t\t\t\twinState.usingGState { (fillCtx) in\n\t\t\t\t\t\t\twinState.addPath(winPath)\n\t\t\t\t\t\t\twinState.clip()\n\t\t\t\t\t\t\tfill.fill(context: fillCtx, bounds: integralRect)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\twinState.addPath(winPath)\n\t\t\t\t\twinState.setStrokeColor(self.winStrokeColor)\n\t\t\t\t\twinState.setLineWidth(self.lineWidth)\n\t\t\t\t\twinState.drawPath(using: .stroke)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !lossPath.isEmpty {\n\t\t\t\touter.usingGState { lossState in\n\t\t\t\t\tif let fill = self.lossFill {\n\t\t\t\t\t\tlossState.usingGState { (fillCtx) in\n\t\t\t\t\t\t\tlossState.addPath(lossPath)\n\t\t\t\t\t\t\tlossState.clip()\n\t\t\t\t\t\t\tfill.fill(context: fillCtx, bounds: integralRect)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlossState.addPath(lossPath)\n\t\t\t\t\tlossState.setStrokeColor(self.lossStrokeColor)\n\t\t\t\t\tlossState.setLineWidth(self.lineWidth)\n\t\t\t\t\tlossState.drawPath(using: .stroke)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+WinLossTie.swift",
    "content": "//\n//  DSFSparklineOverlay+WinLossTie.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport QuartzCore\n\npublic extension DSFSparklineOverlay {\n\t@objc(DSFSparklineOverlayWinLossTie) class WinLossTie: DSFSparklineOverlay.DataSource {\n\n\t\tstatic let greenStroke = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 1])!\n\t\tstatic let greenFill = DSFSparkline.Fill.Color(CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 0.3])!)\n\t\tstatic let redStroke = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 1])!\n\t\tstatic let redFill = DSFSparkline.Fill.Color(CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 0.3])!)\n\n\t\t/// The width of the stroke for the tablet\n\t\t@objc public var lineWidth: UInt = 1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The spacing (in pixels) between each bar\n\t\t@objc public var barSpacing: UInt = 1 {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'win' boxes\n\t\t@objc public var winStroke: CGColor = WinLossTie.greenStroke {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'win' boxes\n\t\t@objc public var winFill: DSFSparklineFillable? = WinLossTie.greenFill {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'loss' boxes\n\t\t@objc public var lossStroke: CGColor = WinLossTie.redStroke {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'loss' boxes\n\t\t@objc public var lossFill: DSFSparklineFillable? = WinLossTie.redFill {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'tie' boxes\n\t\t@objc public var tieStroke: CGColor? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the 'tie' boxes\n\t\t@objc public var tieFill: DSFSparklineFillable? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t/// The line to separate the win and loss sections of the sparkline\n\t\t@objc public var centerLine: DSFSparkline.ZeroLineDefinition? {\n\t\t\tdidSet {\n\t\t\t\tself.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\n\t\t@objc public init() {\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.lineWidth = orig.lineWidth\n\t\t\tself.barSpacing = orig.barSpacing\n\t\t\tself.winStroke = orig.winStroke\n\t\t\tself.winFill = orig.winFill?.copyFill()\n\t\t\tself.lossStroke = orig.lossStroke\n\t\t\tself.lossFill = orig.lossFill?.copyFill()\n\t\t\tself.tieStroke = orig.tieStroke\n\t\t\tself.tieFill = orig.tieFill?.copyFill()\n\t\t\tself.centerLine = orig.centerLine?.copyZeroLineDefinition()\n\t\t\tsuper.init(layer: layer)\n\t\t}\n\n\t\trequired init?(coder: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\tinternal override func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\tself.drawWinLossGraph(context: context, bounds: bounds, scale: scale)\n\t\t}\n\t}\n}\n\nprivate extension DSFSparklineOverlay.WinLossTie {\n\t func drawWinLossGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\tguard let dataSource = self.dataSource else {\n\t\t\treturn\n\t\t}\n\n\t\tlet integralRect = bounds.integral\n\n\t\tlet windowSize: Int = Int(dataSource.windowSize)\n\n\t\t// This represents the _full_ width of a bar within the graph, including the spacing.\n\t\tlet componentWidth: Int = Int(integralRect.width) / windowSize\n\n\t\t// The width of the BAR component\n\t\tlet barWidth: Int = componentWidth - Int(self.barSpacing)\n\n\t\t// The left offset in order to center X\n\t\tlet xOffset: Int = (Int(integralRect.width) - (componentWidth * windowSize)) / 2\n\n\t\t// Map the +ve values to true, the -ve (and 0) to false\n\t\tlet winLoss: [Int] = dataSource.data.map {\n\t\t\tif $0 > 0 { return 1 }\n\t\t\tif $0 < 0 { return -1 }\n\t\t\treturn 0\n\t\t}\n\n\t\tlet graphLineWidth: CGFloat = 1 / scale * CGFloat(self.lineWidth)\n\n\t\tlet midPoint = Int(bounds.midY.rounded())\n\t\tlet barHeight = Int(integralRect.midY) - Int(self.lineWidth)\n\n\t\tcontext.usingGState { outer in\n\n\t\t\touter.setShouldAntialias(false)\n\t\t\touter.setRenderingIntent(.relativeColorimetric)\n\t\t\touter.interpolationQuality = .none\n\n\t\t\tif let zeroLine = self.centerLine {\n\t\t\t\touter.usingGState { centerlineState in\n\t\t\t\t\tlet zeroPos = 0.5 * bounds.height\n\t\t\t\t\tcenterlineState.setLineWidth(zeroLine.lineWidth)\n\t\t\t\t\tcenterlineState.setStrokeColor(zeroLine.color.cgColor)\n\t\t\t\t\tcenterlineState.setLineDash(phase: 0.0, lengths: zeroLine.lineDashStyle)\n\t\t\t\t\tcenterlineState.strokeLineSegments(between: [CGPoint(x: 0.0, y: zeroPos), CGPoint(x: bounds.width, y: zeroPos)])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif dataSource.counter < dataSource.windowSize {\n\t\t\t\tlet pos = Int(dataSource.counter) * componentWidth\n\t\t\t\tlet clipRect = integralRect.divided(atDistance: CGFloat(pos + xOffset), from: .maxXEdge).slice\n\t\t\t\touter.clip(to: clipRect.integral)\n\t\t\t}\n\n\t\t\tlet winPath = CGMutablePath()\n\t\t\tlet lossPath = CGMutablePath()\n\t\t\tlet tiePath = CGMutablePath()\n\n\t\t\tfor point in winLoss.enumerated() {\n\t\t\t\tlet x = xOffset + point.offset * componentWidth\n\t\t\t\tif point.element == 1 {\n\t\t\t\t\tlet rect = CGRect(x: x, y: 1, width: barWidth, height: barHeight)\n\t\t\t\t\twinPath.addRect(rect.integral)\n\t\t\t\t}\n\t\t\t\telse if point.element == -1 {\n\t\t\t\t\tlet rect = CGRect(x: x, y: midPoint + 1, width: barWidth, height: barHeight)\n\t\t\t\t\tlossPath.addRect(rect.integral)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet rect = CGRect(x: x, y: Int(integralRect.height) / 2 - (barHeight / 4), width: barWidth, height: barHeight / 2)\n\t\t\t\t\ttiePath.addRect(rect.integral)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !winPath.isEmpty {\n\t\t\t\touter.usingGState { winState in\n\t\t\t\t\tif let fill = self.winFill {\n\t\t\t\t\t\twinState.usingGState { fillCtx in\n\t\t\t\t\t\t\tfillCtx.addPath(winPath)\n\t\t\t\t\t\t\tfillCtx.clip()\n\t\t\t\t\t\t\tfill.fill(context: fillCtx, bounds: integralRect)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\twinState.addPath(winPath)\n\t\t\t\t\twinState.setStrokeColor(self.winStroke)\n\t\t\t\t\twinState.setLineWidth(graphLineWidth)\n\t\t\t\t\twinState.drawPath(using: .stroke)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !lossPath.isEmpty {\n\t\t\t\touter.usingGState { lossState in\n\t\t\t\t\tif let fill = self.lossFill {\n\t\t\t\t\t\tlossState.usingGState { fillCtx in\n\t\t\t\t\t\t\tfillCtx.addPath(lossPath)\n\t\t\t\t\t\t\tfillCtx.clip()\n\t\t\t\t\t\t\tfill.fill(context: fillCtx, bounds: integralRect)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlossState.addPath(lossPath)\n\t\t\t\t\tlossState.setStrokeColor(self.lossStroke)\n\t\t\t\t\tlossState.setLineWidth(graphLineWidth)\n\t\t\t\t\tlossState.drawPath(using: .stroke)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !tiePath.isEmpty, self.tieFill != nil || self.tieStroke != nil {\n\n\t\t\t\tif let fill = self.tieFill {\n\t\t\t\t\touter.usingGState { tieState in\n\t\t\t\t\t\ttieState.addPath(tiePath)\n\t\t\t\t\t\ttieState.clip()\n\t\t\t\t\t\tfill.fill(context: tieState, bounds: integralRect)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif let stroke = self.tieStroke {\n\t\t\t\t\touter.usingGState { tieState in\n\t\t\t\t\t\ttieState.addPath(tiePath)\n\t\t\t\t\t\ttieState.setLineWidth(graphLineWidth)\n\t\t\t\t\t\ttieState.setStrokeColor(stroke)\n\t\t\t\t\t\ttieState.drawPath(using: .stroke)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/renderers/overlays-graph/DSFSparklineOverlay+WiperGauge.swift",
    "content": "//\n//  DSFSparklineOverlay+WiperGauge.swift\n//  DSFSparklines\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport QuartzCore\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparklineOverlay {\n\t/// A pie graph\n\t@objc(DSFSparklineOverlayWiperGauge) class WiperGauge: DSFSparklineOverlay.StaticDataSource {\n\n\t\t// MARK: - Settings\n\n\t\t/// The value to display in the gauge\n\t\t@objc public var value: CGFloat = 0.0 {\n\t\t\tdidSet {\n\t\t\t\tlet v = max(0, min(1, self.value))\n\t\t\t\tlet tra = DSFSparkline.AnimationTransition(start: currentValue__, stop: v)\n\t\t\t\tif isAnimated {\n\t\t\t\t\tself.animate(tra)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.currentValue__ = v\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// The palette to use when drawing the value part of the gauge\n\t\t@objc public var valueColor: DSFSparkline.ValueBasedFill = DSFSparkline.ValueBasedFill.sharedPalette {\n\t\t\tdidSet {\n\t\t\t\tself.updatePalette()\n\t\t\t}\n\t\t}\n\n\t\t/// The palette to use when drawing the unset value part of the gauge\n\t\t@objc public var valueBackgroundColor: CGColor = _valueBackgroundColor {\n\t\t\tdidSet {\n\t\t\t\tself.updatePalette()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the dial and outer border\n\t\t@objc public var gaugeUpperArcColor: CGColor = _gaugeUpperArcColor {\n\t\t\tdidSet {\n\t\t\t\tself.updatePalette()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw the value in radial component\n\t\t@objc public var gaugePointerColor: CGColor = _gaugePointerColor {\n\t\t\tdidSet {\n\t\t\t\tself.updatePalette()\n\t\t\t}\n\t\t}\n\n\t\t/// The color to draw in the background\n\t\t@objc public var gaugeBackgroundColor: CGColor? = _gaugeBackgroundColor {\n\t\t\tdidSet {\n\t\t\t\tself.updatePalette()\n\t\t\t}\n\t\t}\n\n\t\t/// Should the pie chart animate in?\n\t\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil\n\n\t\tprivate var isAnimated: Bool { self.animationStyle != nil }\n\n\t\t// MARK: - Initializers\n\n\t\t@objc public override init() {\n\t\t\tsuper.init()\n\t\t\tself.configure()\n\t\t}\n\n\t\tpublic override init(layer: Any) {\n\t\t\tguard let orig = layer as? Self else { fatalError() }\n\t\t\tself.value = orig.value\n\n\t\t\tself.valueColor = orig.valueColor.copyColorContainer()\n\t\t\tself.valueBackgroundColor = orig.valueBackgroundColor.copy() ?? CGColor(gray: 0, alpha: 0)\n\n\t\t\tself.gaugePointerColor = orig.gaugePointerColor.copy() ?? CGColor(gray: 1, alpha: 1)\n\t\t\tself.gaugeUpperArcColor = orig.gaugeUpperArcColor.copy() ?? CGColor(gray: 1, alpha: 1)\n\n\t\t\tself.gaugeBackgroundColor = orig.gaugeBackgroundColor?.copy() ?? CGColor(gray: 0, alpha: 0)\n\n\t\t\tself.animationStyle = orig.animationStyle\n\n\t\t\tsuper.init(layer: layer)\n\n\t\t\tself.configure()\n\t\t}\n\n\t\t@available(*, unavailable)\n\t\trequired init?(coder _: NSCoder) {\n\t\t\tfatalError(\"init(coder:) has not been implemented\")\n\t\t}\n\n\t\t// MARK: - Private\n\n\t\toverride internal func drawGraph(context: CGContext, bounds: CGRect, scale: CGFloat) {\n\t\t\t// Do nothing.  All the content is handled by layers\n\t\t\treturn\n\t\t}\n\n\t\t// Private\n\n\t\tprivate let wiperBackgroundShape = CAShapeLayer()\n\t\tprivate let arcShape = CAShapeLayer()\n\n\t\tprivate let arcInnerShape = CAShapeLayer()\n\t\tprivate let arcColorInnerShape = CAShapeLayer()\n\n\t\tprivate let pinion = CAShapeLayer()\n\t\tprivate let arcline = CAShapeLayer()\n\n\t\tprivate var animator = ArbitraryAnimator()\n\n\t\tprivate var currentValue__: CGFloat = 0.0 {\n\t\t\tdidSet {\n\t\t\t\tself.updatePalette()\n\t\t\t\tself.updateLayout()\n\t\t\t}\n\t\t}\n\n\t\tprivate static let _gaugeBackgroundColor: CGColor? = nil\n\n\t\t#if os(macOS)\n\t\tprivate static let _valueBackgroundColor = NSColor.quaternaryLabelColor.cgColor\n\t\tprivate static let _gaugeUpperArcColor = NSColor.textColor.cgColor\n\t\tprivate static let _gaugePointerColor = NSColor.textColor.cgColor\n\t\t#else\n\t\tprivate static let _valueBackgroundColor = UIColor.quaternaryLabel.cgColor\n\t\tprivate static let _gaugeUpperArcColor = UIColor.label.cgColor\n\t\tprivate static let _gaugePointerColor = UIColor.label.cgColor\n\t\t#endif\n\t}\n}\n\nextension DSFSparklineOverlay.WiperGauge {\n\tprivate func configure() {\n\n\t\tself.addSublayer(wiperBackgroundShape)\n\t\twiperBackgroundShape.zPosition = -110\n\n\t\tself.addSublayer(arcShape)\n\t\tarcShape.zPosition = -100\n\t\tself.addSublayer(arcInnerShape)\n\t\tarcInnerShape.zPosition = -90\n\t\tself.addSublayer(arcColorInnerShape)\n\t\tarcColorInnerShape.zPosition = -80\n\n\t\tself.addSublayer(pinion)\n\t\tpinion.zPosition = -70\n\t\tself.addSublayer(arcline)\n\t\tarcline.zPosition = -80\n\n\t\tself.updatePalette()\n\t}\n\n\t// Update the colors used within the gauge\n\tprivate func updatePalette() {\n\n\t\t// The gauge's background color\n\t\twiperBackgroundShape.fillColor = self.gaugeBackgroundColor\n\n\t\tif self.valueColor.isPalette == false {\n\t\t\t// We want paletted colors to fade when the color changes\n\t\t\tCATransaction.setDisableActions(true)\n\t\t}\n\n\t\t// The outer ring\n\t\tarcShape.fillColor = .clear\n\t\tarcShape.strokeColor = self.gaugeUpperArcColor\n\n\t\t// The color component of the arc\n\t\tarcColorInnerShape.fillColor = self.valueColor.color(atFraction: self.value)\n\t\tarcColorInnerShape.strokeColor = .clear\n\n\t\t// The background color component of the arc\n\t\tarcInnerShape.fillColor = self.valueBackgroundColor\n\t\tarcInnerShape.strokeColor = .clear\n\n\t\t// The pointer and the pinion\n\t\tarcline.strokeColor = self.gaugePointerColor\n\t\tpinion.fillColor = self.gaugePointerColor\n\n\t\tif self.valueColor.isPalette == false {\n\t\t\tCATransaction.commit()\n\t\t}\n\t}\n\n\tprivate func updateLayout() {\n\t\tCATransaction.setDisableActions(true)\n\t\tdefer { CATransaction.commit() }\n\n\t\tlet bb = self.bounds\n\t\tif bb.isEmpty { return }\n\n\t\tlet sx = bb.width\n\t\tlet sy = bb.height\n\n\t\tvar destWidth: CGFloat = 0\n\t\tvar destHeight: CGFloat = 0\n\n\t\tlet rr: CGRect = {\n\t\t\tif (sx / 2) > sy {\n\t\t\t\t// wider than it is higher\n\t\t\t\tlet dx = sy/(sx/2)\n\t\t\t\tdestWidth =  bb.width * dx\n\t\t\t\tdestHeight = bb.height\n\t\t\t\treturn CGRect(\n\t\t\t\t\tx: (bb.width - destWidth) / 2,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: destWidth,\n\t\t\t\t\theight: destHeight\n\t\t\t\t)\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// higher than it is wide\n\t\t\t\tlet dy = (sx / 2) / sy\n\t\t\t\tdestWidth =  bb.width\n\t\t\t\tdestHeight = bb.height * dy\n\t\t\t\tlet x = (bb.width - destWidth) / 2.0\n\t\t\t\tlet y = (bb.height - destHeight) / 2.0\n\t\t\t\treturn CGRect(\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y,\n\t\t\t\t\twidth: destWidth,\n\t\t\t\t\theight: destHeight\n\t\t\t\t)\n\t\t\t}\n\t\t}()\n\n\t\tlet sz = rr.size.height\n\t\tlet ptsize = sz / 12\n\n\t\tlet origin = CGPoint(\n\t\t\tx: (rr.width / 2) + rr.origin.x,\n\t\t\ty: rr.origin.y + ptsize\n\t\t)\n\n\t\t// The gauge's pinion point\n\t\tlet centroidLocation = CGPoint(x: origin.x, y: bb.height - (bb.height - rr.height) / 2 - ptsize)\n\n\t\t// Draw the background\n\n\t\tdo {\n\t\t\tlet pth = CGMutablePath()\n\t\t\tpth.addArc(center: centroidLocation, radius: sz - ptsize, startAngle: .pi, endAngle: .pi * 2, clockwise: false)\n\t\t\tlet brect = CGRect(\n\t\t\t\tx: centroidLocation.x - (sz - ptsize),\n\t\t\t\ty: centroidLocation.y,\n\t\t\t\twidth: (sz - ptsize) * 2,\n\t\t\t\theight: ptsize\n\t\t\t)\n\t\t\tpth.addRect(brect)\n\t\t\tpth.closeSubpath()\n\t\t\twiperBackgroundShape.path = pth\n\t\t}\n\n\t\t// Draw the outer ring\n\n\t\tdo {\n\t\t\tlet path = CGMutablePath()\n\t\t\tpath.addArc(center: centroidLocation, radius: sz - (ptsize * 2), startAngle: .pi + 0.2, endAngle: .pi - .pi - 0.2, clockwise: false)\n\t\t\tarcShape.path = path\n\t\t\tarcShape.lineWidth = ptsize\n\t\t\tarcShape.lineCap = .round\n\t\t}\n\n\t\tlet frac: CGFloat = self.currentValue__\n\t\tlet fullSweep: CGFloat = .pi - 0.2 - 0.2\n\n\t\t// Draw the inner sweeps\n\n\t\tdo {\n\n\t\t\t// Color fill\n\n\t\t\tdo {\n\t\t\t\tlet colorstart: CGFloat = ((1.0 - frac) * fullSweep)\n\n\t\t\t\tlet pth = CGMutablePath()\n\t\t\t\tpth.addArc(center: centroidLocation, radius: ptsize * 2, startAngle: .pi + 0.2, endAngle: .pi * 2 - 0.2 - colorstart, clockwise: false)\n\t\t\t\tpth.addArc(center: centroidLocation, radius: (sz - (ptsize * 2)) / 1.15, startAngle: .pi * 2 - 0.2 - colorstart, endAngle: .pi + 0.2, clockwise: true)\n\t\t\t\tpth.closeSubpath()\n\t\t\t\tarcColorInnerShape.path = pth\n\t\t\t}\n\n\t\t\t// Background fill\n\n\t\t\tdo {\n\t\t\t\tlet colorstart: CGFloat = (frac * fullSweep)\n\n\t\t\t\tlet pth = CGMutablePath()\n\t\t\t\tpth.addArc(center: centroidLocation, radius: ptsize * 2, startAngle: .pi + 0.2 + colorstart, endAngle: .pi * 2 - 0.2, clockwise: false)\n\t\t\t\tpth.addArc(center: centroidLocation, radius: (sz - (ptsize * 2)) / 1.15, startAngle: .pi * 2 - 0.2, endAngle: .pi + 0.2 + colorstart, clockwise: true)\n\t\t\t\tpth.closeSubpath()\n\t\t\t\tarcInnerShape.path = pth\n\t\t\t}\n\t\t}\n\n\t\t// Draw the pinon (the circle where the pointer rotates around)\n\n\t\tdo {\n\t\t\tlet dialPoint = CGPoint(x: centroidLocation.x - ptsize, y: centroidLocation.y - ptsize)\n\t\t\tlet pointy = CGRect(origin: dialPoint, size: CGSize(width: ptsize*2, height: ptsize*2))\n\t\t\tlet path2 = CGPath(ellipseIn: pointy, transform: nil)\n\t\t\tpinion.path = path2\n\t\t}\n\n\t\t// Draw the pointer\n\n\t\tdo {\n\t\t\tlet pth = CGMutablePath()\n\t\t\tpth.move(to: CGPoint(x: 0, y: 0))\n\t\t\tpth.addLine(to: CGPoint(x: sz / 1.4, y: 0))\n\n\t\t\tlet colorstart = ((1.0 - frac) * fullSweep)\n\n\t\t\tlet res = CGMutablePath()\n\t\t\tlet transform = CGAffineTransform(translationX: centroidLocation.x, y: centroidLocation.y)\n\t\t\t\t.rotated(by: .pi - .pi - 0.2 - colorstart)\n\t\t\tres.addPath(pth, transform: transform)\n\n\t\t\tarcline.path = res\n\t\t\tarcline.lineWidth = ptsize\n\t\t\tarcline.lineCap = .round\n\t\t}\n\t}\n\n\tpublic override func layoutSublayers() {\n\t\tsuper.layoutSublayers()\n\t\tself.updateLayout()\n\t}\n}\n\n// MARK: Animation\n\nprivate extension DSFSparklineOverlay.WiperGauge {\n\tfunc animate(_ transition: DSFSparkline.AnimationTransition) {\n\t\tguard let anim = self.animationStyle else { return }\n\t\t// Stop any animation that is currently active\n\t\tself.animator.progressBlock = nil\n\t\tself.animator.stop()\n\n\t\tself.animator.animationFunction = anim.function.function\n\t\tself.animator.duration = anim.duration\n\t\tself.animator.progressBlock = { [weak self] progress in\n\t\t\tself?.currentValue__ = transition.start + (transition.distance * progress)\n\t\t}\n\n\t\tself.animator.start()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/surfaces/DSFSparklineSurface+AttributedString.swift",
    "content": "//\n//  DSFSparklineSurface+AttributedString.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n// NSAttributedString extensions for DSFSparklineSurface.Bitmap\n\nimport CoreGraphics\nimport Foundation\n\npublic extension DSFSparklineSurface.Bitmap {\n\n\t/// Returns an NSAttributedString containing an image of the sparkline\n\t/// - Parameters:\n\t///   - size: The dimensions of the image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: An NSAttributedString containing the sparkline bitmap, or nil if the bitmap couldn't be generated\n\t@objc(attributedString::) func attributedString(size: CGSize, scale: CGFloat = 1) -> NSAttributedString? {\n\t\tguard let attachment = self.textAttachment(size: size, scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn NSAttributedString(attachment: attachment)\n\t}\n}\n\n// MARK: - AppKit Additions\n\n#if os(macOS)\n\nimport AppKit\npublic extension DSFSparklineSurface.Bitmap {\n\n\t/// Returns a TextAttachment containing an image of the sparkline\n\t/// - Parameters:\n\t///   - size: The dimensions of the image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: An NSTextAttachment containing the sparkline bitmap, or nil if the bitmap couldn't be generated\n\t@objc(textAttachment::) func textAttachment(size: CGSize, scale: CGFloat = 1) -> NSTextAttachment? {\n\n\t\tguard let image = self.image(size: size, scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\n\t\tlet attachment = NSTextAttachment()\n\t\tlet flipped = NSImage(size: size, flipped: false, drawingHandler: { (rect: NSRect) -> Bool in\n\t\t\timage.draw(in: rect)\n\t\t\treturn true\n\t\t})\n\n\t\tattachment.image = flipped\n\t\treturn attachment\n\t}\n}\n\n#else\n\n// MARK: - UIKit Additions\n\nimport UIKit\npublic extension DSFSparklineSurface.Bitmap {\n\n\t/// Returns an NSTextAttachment containing an image of the sparkline\n\t/// - Parameters:\n\t///   - size: The dimensions of the image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: An NSTextAttachment containing the sparkline bitmap, or nil if the bitmap couldn't be generated\n\t@objc(textAttachment::) func textAttachment(size: CGSize, scale: CGFloat = 1) -> NSTextAttachment? {\n\n\t\tguard let image = self.image(size: size, scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\n\t\tlet attachment = NSTextAttachment()\n\t\tattachment.image = image\n\t\tattachment.bounds = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)\n\t\treturn attachment\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/surfaces/DSFSparklineSurface+Bitmap.swift",
    "content": "//\n//  DSFSparklineSurface+Bitmap.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\npublic extension DSFSparklineSurface {\n\n/// A surface for drawing a sparkline into an image\n\t@objc(DSFSparklineSurfaceBitmap) class Bitmap: DSFSparklineSurface {\n\n\t\tprivate func edgeInsets(for rect: CGRect) -> DSFEdgeInsets {\n\t\t\t/// Calculate the total inset required\n\t\t\treturn self.overlays.reduce(DSFEdgeInsets.zero) { (result, overlay) in\n\t\t\t\tresult.combineMaximum(using: overlay.edgeInsets(for: rect))\n\t\t\t}\n\t\t}\n\n\t\t/// Add a sparkline overlay to the surface\n\t\t@objc public func addOverlay(_ overlay: DSFSparklineOverlay) {\n\t\t\tself.overlays.append(overlay)\n\t\t}\n\n\t\t/// Return a CGImage representation of the sparklline\n\t\t/// - Parameters:\n\t\t///   - size: The dimension in pixels\n\t\t///   - scale: The scale to use (eg. retina == 2)\n\t\t/// - Returns: A CGImage representation, or nil if the image couldn't be generated\n\t\t@objc public func cgImage(size: CGSize, scale: CGFloat = 2) -> CGImage? {\n\t\t\tlet rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)\n\n\t\t\t// Create the bitmap context to draw into\n\t\t\tguard let bitmapContext = self.generateBitmapContext(rect: rect, scale: scale) else {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tself.overlays.forEach { $0.frame = CGRect(origin: .zero, size: size) }\n\n\t\t\t// Calculate the inset required\n\t\t\tlet bounds = rect.inset(by: self.edgeInsets(for: rect))\n\n\t\t\t// Loop through each overlay and ask it to draw\n\t\t\tself.overlays.forEach { overlay in\n\t\t\t\tbitmapContext.usingGState { ctx in\n\t\t\t\t\toverlay.frame = rect\n\t\t\t\t\toverlay.setNeedsDisplay()\n\t\t\t\t\toverlay.contentsScale = scale\n\t\t\t\t\t#if os(macOS)\n\t\t\t\t\toverlay.isGeometryFlipped = true\n\t\t\t\t\t#endif\n\n\t\t\t\t\t// Render the layer content\n\t\t\t\t\toverlay.render(in: ctx)\n\n\t\t\t\t\t// Render any bitmap content\n\t\t\t\t\toverlay.drawGraph(context: ctx, bounds: bounds, scale: scale)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn bitmapContext.makeImage()\n\t\t}\n\n\t\t// MARK: Private\n\n\t\t// The overlays to use when generating the image\n\t\tprivate var overlays: [DSFSparklineOverlay] = []\n\t}\n}\n\n// MARK: - AppKit Additions\n\n#if os(macOS)\n\nimport AppKit\npublic extension DSFSparklineSurface.Bitmap {\n\t/// Generate an NSImage with the contents of the surface\n\t/// - Parameters:\n\t///   - size: The dimensions of the image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: The created image, or nil if something went wrong\n\t@objc func image(size: CGSize, scale: CGFloat = 1) -> NSImage? {\n\t\tguard let cgImage = self.cgImage(size: size, scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn NSImage(cgImage: cgImage, size: size)\n\t}\n\n\t/// Generate an NSImage with the contents of the surface\n\t/// - Parameters:\n\t///   - width: The width of the resultant image\n\t///   - height: The height of the resultant image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: The created image, or nil if something went wrong\n\t@objc func image(width: CGFloat, height: CGFloat, scale: CGFloat = 1) -> NSImage? {\n\t\tlet size = CGSize(width: width, height: height)\n\t\tguard let cgImage = self.cgImage(size: size, scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn NSImage(cgImage: cgImage, size: size)\n\t}\n}\n\n#else\n\n// MARK: - UIKit Additions\n\nimport UIKit\npublic extension DSFSparklineSurface.Bitmap {\n\t/// Generate an NSImage with the contents of the surface\n\t/// - Parameters:\n\t///   - size: The dimensions of the image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: The created image, or nil if something went wrong\n\t@objc func image(size: CGSize, scale: CGFloat = 1) -> UIImage? {\n\t\tguard let cgImage = self.cgImage(size: size, scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn UIImage(\n\t\t\tcgImage: cgImage,\n\t\t\tscale: scale,\n\t\t\torientation: UIImage.Orientation.up\n\t\t)\n\t}\n\n\t/// Generate an NSImage with the contents of the surface\n\t/// - Parameters:\n\t///   - width: The width of the resultant image\n\t///   - height: The height of the resultant image\n\t///   - scale: The scale for the returned image. For example, for a retina scale (144dpi) image, scale == 2\n\t/// - Returns: The created image, or nil if something went wrong\n\t@objc func image(width: CGFloat, height: CGFloat, scale: CGFloat = 1) -> UIImage? {\n\t\tguard let cgImage = self.cgImage(size: CGSize(width: width, height: height), scale: scale) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn UIImage(\n\t\t\tcgImage: cgImage,\n\t\t\tscale: scale,\n\t\t\torientation: UIImage.Orientation.up\n\t\t)\n\t}\n}\n\n\n#endif\n\n// MARK: - Private\n\nprivate extension DSFSparklineSurface.Bitmap {\n\t// Generate a bitmap context for the specified rect and scale\n\tfunc generateBitmapContext(rect: CGRect, scale: CGFloat) -> CGContext? {\n\t\tlet colorSpace = CGColorSpaceCreateDeviceRGB()\n\t\tlet bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)\n\t\tguard let bitmapContext = CGContext(\n\t\t\tdata: nil,\n\t\t\twidth: Int(rect.width * scale),\n\t\t\theight: Int(rect.height * scale),\n\t\t\tbitsPerComponent: 8,\n\t\t\tbytesPerRow: 0,\n\t\t\tspace: colorSpace,\n\t\t\tbitmapInfo: bitmapInfo.rawValue\n\t\t) else {\n\t\t\tSwift.print(\"(ERROR) DSFSparklineBitmap unable to generate bitmap context for drawing\")\n\t\t\treturn nil\n\t\t}\n\n\t\t// Need to flip\n\t\tbitmapContext.scaleBy(x: scale, y: -scale)\n\t\tbitmapContext.translateBy(x: 0, y: -rect.height)\n\t\treturn bitmapContext\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/surfaces/DSFSparklineSurface+SwiftUI.swift",
    "content": "//\n//  DSFSparklineSurface+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport SwiftUI\n\npublic extension DSFSparklineSurface {\n\n\t/// A surface for creating a sparkline using overlays\n\tstruct SwiftUI {\n\t\tlet overlays: [DSFSparklineOverlay]\n\n\t\tpublic init(_ overlays: [DSFSparklineOverlay]) {\n\t\t\tself.overlays = overlays\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineSurface.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineSurfaceView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineSurfaceView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineSurface.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineSurface.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tprivate func makeSurface(_ context: Context) -> DSFSparklineSurfaceView {\n\t\tlet view = DSFSparklineSurfaceView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\n\t\tlet base = context.coordinator.parent\n\t\tbase.overlays.forEach { view.addOverlay($0) }\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineSurface.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineSurfaceView {\n\t\treturn self.makeSurface(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineSurfaceView, context: Context) {\n\t\tself.updateView(view, context: context)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineSurface.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineSurfaceView {\n\t\treturn self.makeSurface(context)\n\t}\n\n\tfunc updateNSView(_ nsView: DSFSparklineSurfaceView, context: Context) {\n\t\tself.updateView(nsView, context: context)\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineSurface.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineSurfaceView, context: Context) {\n\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/surfaces/DSFSparklineSurface+View.swift",
    "content": "//\n//  DSFSparklineSurface+View.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if os(macOS)\nimport Cocoa\n#else\nimport UIKit\n#endif\n\n/// A surface for drawing a sparkline into a view.\n///\n/// Represents the generic base class for a view.\n@objc public class DSFSparklineSurfaceView: DSFView {\n\t#if os(macOS)\n\toverride public var isFlipped: Bool {\n\t\treturn true\n\t}\n\t#endif\n\n\t// Render delegate instance\n\tlazy private var renderDelegate: RendererDelegate = {\n\t\treturn RendererDelegate(view: self)\n\t}()\n\n\tvar rootLayer: CALayer {\n\t\t#if os(macOS)\n\t\treturn self.layer!\n\t\t#else\n\t\treturn self.layer\n\t\t#endif\n\t}\n\n\tdeinit {}\n\n\toverride public init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.setup()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.setup()\n\t}\n\n\tprivate func setup() {\n\t\t#if os(macOS)\n\t\tself.wantsLayer = true\n\t\t#else\n\t\t// Configure iOS/tvOS to make the background transparent.\n\t\t// If isOpaque is true (the default value) iOS assumes that you're drawing\n\t\t// the ENTIRE content of the control (which we are not).\n\t\tself.isOpaque = false\n\t\t#endif\n\t}\n\n\t/// Multi-platform function for telling the view to update itself\n\tpublic func updateDisplay() {\n\t\t#if os(macOS)\n\t\tself.needsDisplay = true\n\t\t#else\n\t\tself.setNeedsDisplay()\n\t\t#endif\n\t}\n}\n\nextension DSFSparklineSurfaceView {\n\n\tvar overlays: [DSFSparklineOverlay] {\n\t\treturn self.rootLayer.sublayers?.compactMap { $0 as? DSFSparklineOverlay } ?? []\n\t}\n\n\t/// Add a sparkline overlay to the view\n\tpublic func addOverlay(_ overlay: DSFSparklineOverlay) {\n\t\tself.rootLayer.addSublayer(overlay)\n\n\t\toverlay.bounds = self.bounds\n\t\toverlay.delegate = self.renderDelegate\n\n\t\tself.syncLayers()\n\t\toverlay.setNeedsLayout()\n\t\toverlay.setNeedsDisplay()\n\t}\n\n\t/// Remove a sparkline overlay to the view\n\tpublic func removeOverlay(_ overlay: DSFSparklineOverlay) {\n\t\toverlay.removeFromSuperlayer()\n\t}\n\n\tfunc edgeInsets(for rect: CGRect) -> DSFEdgeInsets {\n\t\t/// Calculate the total inset required\n\t\treturn self.overlays.reduce(DSFEdgeInsets.zero) { (result, overlay) in\n\t\t\tresult.combineMaximum(using: overlay.edgeInsets(for: rect))\n\t\t}\n\t}\n\n\tprivate func syncLayers() {\n\t\tCATransaction.withDisabledActions {\n\t\t\tself.rootLayer.sublayers?.forEach { layer in\n\t\t\t\tlayer.bounds = self.bounds\n\t\t\t\tlayer.contentsScale = self.retinaScale()\n\t\t\t\tlayer.setNeedsDisplay()\n\t\t\t}\n\t\t}\n\t}\n\n\t#if os(macOS)\n\tpublic override func layout() {\n\t\tsuper.layout()\n\t\tself.syncLayers()\n\t}\n\tpublic override func viewDidMoveToWindow() {\n\t\tsuper.viewDidMoveToWindow()\n\t\tself.syncLayers()\n\t}\n\t#else\n\tpublic override func layoutSubviews() {\n\t\tsuper.layoutSubviews()\n\t\tself.syncLayers()\n\t}\n\tpublic override func didMoveToWindow() {\n\t\tsuper.didMoveToWindow()\n\t\tself.syncLayers()\n\t}\n\t#endif\n}\n\n// the draw delegate for the overlay layers\nfileprivate class RendererDelegate: NSObject, CALayerDelegate {\n\n\tlet view: DSFSparklineSurfaceView\n\n\tinit(view: DSFSparklineSurfaceView) {\n\t\tself.view = view\n\t\tsuper.init()\n\t}\n\n\tfunc draw(_ layer: CALayer, in ctx: CGContext) {\n\t\tif let l = layer as? DSFSparklineOverlay {\n\t\t\tlet scale = view.retinaScale()\n\t\t\tl.contentsScale = scale\n\t\t\tlet insetBounds = view.edgeInsets(for: view.bounds)\n\t\t\tl.drawGraph(context: ctx, bounds: view.bounds.inset(by: insetBounds), scale: scale)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/surfaces/DSFSparklineSurface.swift",
    "content": "//\n//  DSFSparklineSurface.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n@objc public class DSFSparklineSurface: NSObject {\n\t\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+ActivityGridDefinition.swift",
    "content": "//\n//  DSFSparkline+ActivityGridDefinition.swift\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\n\tclass ActivityGrid {\n\t\tprivate init() { }\n\t}\n}\n\npublic extension DSFSparkline.ActivityGrid {\n\t/// The drawing style for the activity grid\n\t@objc(DSFSparklineActivityGridLayoutStyle)\n\tenum LayoutStyle: Int {\n\t\t/// 'Newest' value at bottom right, works up then left\n\t\tcase github = 0\n\t\t/// 'Newest' value at top left, works right then down\n\t\tcase defrag = 1\n\t}\n}\n\npublic extension DSFSparkline.ActivityGrid {\n\t/// The style for drawing cells in the activity grid\n\t@objc(DSFSparklineActivityGridCellStyle)\n\tclass CellStyle: NSObject {\n\t\t@objc public let fillScheme: DSFSparkline.ValueBasedFill\n\t\t@objc public let borderColor: CGColor?\n\t\t@objc public let borderWidth: CGFloat\n\t\t@objc public let cellDimension: CGFloat\n\t\t@objc public let cellSpacing: CGFloat\n\t\t@objc public let cornerRadius: CGFloat\n\t\t@objc public init(\n\t\t\tfillScheme: DSFSparkline.ValueBasedFill,\n\t\t\tborderColor: CGColor? = nil,\n\t\t\tborderWidth: CGFloat = 1.0,\n\t\t\tcellDimension: CGFloat = 11.0,\n\t\t\tcellSpacing: CGFloat = 2.5,\n\t\t\tcornerRadius: CGFloat = 2.5\n\t\t) {\n\t\t\tself.fillScheme = fillScheme\n\t\t\tself.borderColor = borderColor\n\t\t\tself.borderWidth = borderWidth\n\t\t\tself.cellDimension = cellDimension\n\t\t\tself.cellSpacing = cellSpacing\n\t\t\tself.cornerRadius = cornerRadius\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Default style - dark github\n\t\t@objc public convenience override init() {\n\t\t\tself.init(fillScheme: CellStyle.DefaultDark)\n\t\t}\n\n\t\t/// Return a copy of this cell style changing the specified attribute values\n\t\tpublic func modify(\n\t\t\tfillScheme: DSFSparkline.ValueBasedFill? = nil,\n\t\t\tborderColor: CGColor? = nil,\n\t\t\tborderWidth: CGFloat? = nil,\n\t\t\tcellDimension: CGFloat? = nil,\n\t\t\tcellSpacing: CGFloat? = nil,\n\t\t\tcornerRadius: CGFloat? = nil\n\t\t) -> CellStyle {\n\t\t\tlet fs = fillScheme ?? self.fillScheme\n\t\t\tlet bc = borderColor ?? self.borderColor\n\t\t\tlet bw = borderWidth ?? self.borderWidth\n\t\t\tlet cd = cellDimension ?? self.cellDimension\n\t\t\tlet cs = cellSpacing ?? self.cellSpacing\n\t\t\tlet cr = cornerRadius ?? self.cornerRadius\n\n\t\t\treturn CellStyle(\n\t\t\t\tfillScheme: fs,\n\t\t\t\tborderColor: bc,\n\t\t\t\tborderWidth: bw,\n\t\t\t\tcellDimension: cd,\n\t\t\t\tcellSpacing: cs,\n\t\t\t\tcornerRadius: cr\n\t\t\t)\n\t\t}\n\n\t\t/// A default palette used when no palette is specified.\n\t\tpublic static let DefaultLight = DSFSparkline.ValueBasedFill(colors: [\n\t\t\tDSFColor(red: 0.820, green: 0.830, blue: 0.842, alpha: 1.000),\n\t\t\tDSFColor(red: 0.606, green: 0.914, blue: 0.657, alpha: 1.000),\n\t\t\tDSFColor(red: 0.248, green: 0.768, blue: 0.387, alpha: 1.000),\n\t\t\tDSFColor(red: 0.190, green: 0.633, blue: 0.306, alpha: 1.000),\n\t\t\tDSFColor(red: 0.132, green: 0.432, blue: 0.222, alpha: 1.000),\n\t\t])\n\n\t\tpublic static let DefaultDark = DSFSparkline.ValueBasedFill(colors: [\n\t\t\tDSFColor(red: 0.086, green: 0.106, blue: 0.132, alpha: 1.000),\n\t\t\tDSFColor(red: 0.055, green: 0.269, blue: 0.159, alpha: 1.000),\n\t\t\tDSFColor(red: 0.000, green: 0.429, blue: 0.194, alpha: 1.000),\n\t\t\tDSFColor(red: 0.148, green: 0.649, blue: 0.257, alpha: 1.000),\n\t\t\tDSFColor(red: 0.219, green: 0.829, blue: 0.323, alpha: 1.000),\n\t\t])\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+GradientBucket.swift",
    "content": "//\n//  DSFSparkline+GradientBucket.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 15/2/2021.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\npublic extension DSFSparkline {\n\t/// A class that represents buckets of color within a gradient within the RGB colorspace.\n\t///\n\t/// Defines a smooth transition between colors.\n\t///\n\t/// **Buckets**\n\t/// A gradient object can also be 'bucketed', so that rather than a smooth transition the gradient output is\n\t/// broken up into equal buckets containing a color\n\n\t@objc(DSFGradientBucket) class GradientBucket: NSObject {\n\t\tstatic let rgbSpace = CGColorSpaceCreateDeviceRGB()\n\t\tstatic let EmptyColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 0, 0, 0])!\n\n\t\t/// The number of buckets to create. If 0 or 1, the gradient is smooth.\n\t\t@objc public var bucketCount: UInt = 0 {\n\t\t\tdidSet {\n\t\t\t\tself.buildBuckets()\n\t\t\t}\n\t\t}\n\n\t\tprivate func sorted(_ posts: [Post]) -> [Post] {\n\t\t\treturn posts.sorted(by: { (a, b) -> Bool in\n\t\t\t\ta.location < b.location\n\t\t\t})\n\t\t}\n\n\t\t// The posts sorted in order of their location 0.0 -> 1.0\n\t\tprivate var sortedPosts: [Post] = []\n\n\t\t// The color buckets\n\t\tprivate var buckets: [Bucket] = []\n\n\t\t/// Create a gradient\n\t\t/// - Parameter posts: The color 'posts' within the gradient\n\t\t@objc public init(posts: [Post], bucketCount: UInt = 0) {\n\t\t\tself.bucketCount = bucketCount\n\t\t\tsuper.init()\n\t\t\tself.sortedPosts = self.sorted(posts)\n\n\t\t\tself.buildBuckets()\n\t\t}\n\n\t\t/// Create a gradient\n\t\t/// - Parameter colors: The colors to use evenly across the gradient fill\n\t\t/// - Parameter bucketCount: The number of color buckets to create\n\t\tpublic init(colors: [CGColor], bucketCount: UInt = 0) {\n\t\t\tassert(colors.count > 1)\n\t\t\tself.bucketCount = bucketCount\n\n\t\t\tsuper.init()\n\n\t\t\tvar offset: CGFloat = 0.0\n\t\t\tlet diff = 1.0 / CGFloat(colors.count - 1)\n\t\t\tvar posts: [Post] = []\n\n\t\t\tcolors.forEach { color in\n\t\t\t\tlet clamped = offset.clamped(to: 0.0 ... 1.0)\n\t\t\t\tlet post = DSFSparkline.GradientBucket.Post(color: color, location: clamped)\n\t\t\t\tposts.append(post)\n\t\t\t\toffset += diff\n\t\t\t}\n\n\t\t\tself.sortedPosts = self.sorted(posts)\n\n\t\t\tself.buildBuckets()\n\t\t}\n\n\t\t/// Make a copy of the gradient bucket\n\t\t@objc public func copyGradientBucket() -> GradientBucket {\n\t\t\tGradientBucket(\n\t\t\t\tposts: self.sortedPosts.map { $0.copyPost() },\n\t\t\t\tbucketCount: self.bucketCount\n\t\t\t)\n\t\t}\n\n\t\t// MARK: - Buckets\n\n\t\tprivate func buildBuckets() {\n\t\t\t//\n\t\t\t//    |-----|-----|-----|-----|\n\t\t\t//    |     |     |     |     |\n\t\t\t//    |     |     |     |     |\n\t\t\t//    |-----|-----|-----|-----|\n\t\t\t//\n\t\t\t//\n\t\t\t//  If the bucket count is 4, we want the FIRST bucket to be equal\n\t\t\t//  to the first color in the gradient, and the LAST bucket to be\n\t\t\t//  equal to the last color in the gradient.\n\t\t\t//  Which means that the colors for bucket 2 and 3 are represented\n\t\t\t//  by the 1/3 and 2/3 colors to get an even spread across the buckets\n\t\t\t//\n\n\t\t\tself.buckets = []\n\n\t\t\tguard self.bucketCount > 1 else {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif self.bucketCount == 2 {\n\t\t\t\tself.buckets = [\n\t\t\t\t\tBucket(range: 0.0 ..< 0.5, color: self.color(at: 0)),\n\t\t\t\t\tBucket(range: 0.5 ..< .infinity, color: self.color(at: 1)),\n\t\t\t\t]\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// The diff for the buckets\n\t\t\tlet bucketDiff: CGFloat = 1.0 / CGFloat(self.bucketCount)\n\n\t\t\t// The diff for the colors\n\t\t\tlet colordiff: CGFloat = 1.0 / CGFloat(self.bucketCount - 1)\n\n\t\t\t// Add in the first bucket. We want the first bucket to be the first color in the gradient\n\t\t\tlet first = Bucket(range: -.infinity ..< bucketDiff, color: self.color(at: 0))\n\t\t\tvar bkts = [first]\n\n\t\t\t// The offset within the middle buckets\n\t\t\tvar offset: CGFloat = 1\n\t\t\tvar rangeOffset = offset * bucketDiff\n\n\t\t\t// We only need to fill the center buckets because we do first and last manually\n\t\t\t(1 ..< self.bucketCount - 1).forEach { index in\n\n\t\t\t\tlet colorIndex = colordiff * CGFloat(index)\n\t\t\t\tlet color = self.color(at: colorIndex)\n\n\t\t\t\t// let rangeOffset = offset * bucketDiff\n\t\t\t\tlet bucket = Bucket(range: rangeOffset ..< rangeOffset + bucketDiff, color: color)\n\n\t\t\t\tbkts.append(bucket)\n\n\t\t\t\t// Step to the next middle bucket\n\t\t\t\toffset += 1\n\t\t\t\trangeOffset = rangeOffset + bucketDiff\n\t\t\t}\n\n\t\t\t// Add in the last bucket. We want the last bucket to be the last color in the gradient\n\t\t\tlet last = Bucket(range: (1 - bucketDiff) ..< .infinity, color: self.color(at: 1))\n\t\t\tbkts.append(last)\n\n\t\t\tself.buckets = bkts\n\t\t}\n\n\t\t// MARK: - Colors\n\n\t\t// Returns the color at the specified fractional value\n\t\tfunc color(at fraction: CGFloat) -> CGColor {\n\t\t\tif self.sortedPosts.count == 0 {\n\t\t\t\treturn Self.EmptyColor\n\t\t\t}\n\t\t\tif self.sortedPosts.count == 1 {\n\t\t\t\t// Just the first color\n\t\t\t\treturn self.sortedPosts[0].color.c\n\t\t\t}\n\n\t\t\tif fraction <= 0 {\n\t\t\t\t// Just the first color\n\t\t\t\treturn self.sortedPosts.first!.color.c\n\t\t\t}\n\t\t\tif fraction >= 1 {\n\t\t\t\t// Just the last color\n\t\t\t\treturn self.sortedPosts.last!.color.c\n\t\t\t}\n\n\t\t\tif self.buckets.isEmpty {\n\t\t\t\treturn self.gradientColor(at: fraction)\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn self.bucketColor(at: fraction)\n\t\t\t}\n\t\t}\n\n\t\tprivate func gradientColor(at fraction: CGFloat) -> CGColor {\n\t\t\tvar location: Int?\n\t\t\tfor index in 0 ..< self.sortedPosts.count - 1 {\n\t\t\t\tlet range = self.sortedPosts[index].location ..< self.sortedPosts[index + 1].location\n\t\t\t\tif range.contains(fraction) {\n\t\t\t\t\tlocation = index\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tguard let loc = location else {\n\t\t\t\treturn self.sortedPosts.last!.color.c\n\t\t\t}\n\n\t\t\tlet delta = self.sortedPosts[loc + 1].location - self.sortedPosts[loc].location\n\t\t\tlet divisor = (fraction - self.sortedPosts[loc].location) / delta\n\n\t\t\tlet c1 = self.sortedPosts[loc].color\n\t\t\tlet r1 = c1.r\n\t\t\tlet g1 = c1.g\n\t\t\tlet b1 = c1.b\n\t\t\tlet a1 = c1.a\n\n\t\t\tlet c2 = self.sortedPosts[loc + 1].color\n\t\t\tlet r2 = c2.r\n\t\t\tlet g2 = c2.g\n\t\t\tlet b2 = c2.b\n\t\t\tlet a2 = c2.a\n\n\t\t\tlet newR = r1 + ((r2 - r1) * divisor)\n\t\t\tlet newG = g1 + ((g2 - g1) * divisor)\n\t\t\tlet newB = b1 + ((b2 - b1) * divisor)\n\t\t\tlet newA = a1 + ((a2 - a1) * divisor)\n\n\t\t\treturn CGColor(colorSpace: Self.rgbSpace, components: [newR, newG, newB, newA])!\n\t\t}\n\n\t\tprivate func bucketColor(at fraction: CGFloat) -> CGColor {\n\t\t\t/// Map the fraction to the bucket ranges\n\t\t\tif let whichColor = self.buckets.first(where: { bucket in\n\t\t\t\tbucket.range.contains(fraction)\n\t\t\t})?.color {\n\t\t\t\treturn whichColor\n\t\t\t}\n\t\t\treturn Self.EmptyColor\n\t\t}\n\t}\n}\n\npublic extension DSFSparkline.GradientBucket {\n\t/// A gradient 'post' represents an absolute color at a fractional point within the gradient.\n\t@objc(DSFGradientBucketPost) class Post: NSObject {\n\t\t/// The color at the location\n\t\tlet color: (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat, c: CGColor)\n\n\t\t/// The fractional (0 -> 1) location within the gradient for a color. Values outside this range are clamped\n\t\tlet location: CGFloat\n\n\t\tprivate static let rgbSpace = CGColorSpaceCreateDeviceRGB()\n\n\t\t/// Create a post\n\t\t/// - Parameters:\n\t\t///   - color: the color for the post\n\t\t///   - location: the location for the color within the gradient (0.0 -> 1.0)\n\t\t@objc public init(color: CGColor, location: CGFloat) {\n\t\t\tself.location = max(0, min(location, 1))\n\n\t\t\tlet rgbColor = color.converted(to: Self.rgbSpace,\n\t\t\t\t\t\t\t\t\t\t\t\t\t intent: .perceptual,\n\t\t\t\t\t\t\t\t\t\t\t\t\t options: nil)!\n\t\t\tassert(rgbColor.numberOfComponents == 4)\n\t\t\tlet r1 = rgbColor.components![0]\n\t\t\tlet g1 = rgbColor.components![1]\n\t\t\tlet b1 = rgbColor.components![2]\n\t\t\tlet a1 = rgbColor.components![3]\n\n\t\t\tself.color = (r1, g1, b1, a1, rgbColor)\n\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Make a copy of this gradient bucket post\n\t\t@objc public func copyPost() -> Post {\n\t\t\treturn Post(\n\t\t\t\tr: self.color.r,\n\t\t\t\tg: self.color.g,\n\t\t\t\tb: self.color.b,\n\t\t\t\ta: self.color.a,\n\t\t\t\tlocation: self.location\n\t\t\t)\n\t\t}\n\n\t\t/// Create a post\n\t\t/// - Parameters:\n\t\t///   - r: the red component (0.0 -> 1.0)\n\t\t///   - g: the green component (0.0 -> 1.0)\n\t\t///   - b: the blue component (0.0 -> 1.0)\n\t\t///   - location: the location for the color within the gradient (0.0 -> 1.0)\n\t\t@objc public init(r: CGFloat, g: CGFloat, b: CGFloat, location: CGFloat) {\n\t\t\tself.location = max(0, min(location, 1))\n\t\t\tself.color = (r, g, b, 1.0, CGColor(colorSpace: Self.rgbSpace,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomponents: [r, g, b, 1.0])!)\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Create a post\n\t\t/// - Parameters:\n\t\t///   - r: the red component (0.0 -> 1.0)\n\t\t///   - g: the green component (0.0 -> 1.0)\n\t\t///   - b: the blue component (0.0 -> 1.0)\n\t\t///   - a: the alpha component (0.0 -> 1.0)\n\t\t///   - location: the location for the color within the gradient (0.0 -> 1.0)\n\t\t@objc public init(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat, location: CGFloat) {\n\t\t\tself.location = max(0, min(location, 1))\n\t\t\tself.color = (r, g, b, a, CGColor(colorSpace: Self.rgbSpace,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t components: [r, g, b, a])!)\n\t\t\tsuper.init()\n\t\t}\n\t}\n}\n\nprivate extension DSFSparkline.GradientBucket {\n\t/// Color bucket definition\n\tstruct Bucket: CustomDebugStringConvertible {\n\t\tlet range: Range<CGFloat>\n\t\tlet color: CGColor\n\n\t\tvar debugDescription: String {\n\t\t\treturn \"color: \\(self.color), range: \\(self.range)\"\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+GridLinesDefinition.swift",
    "content": "//\n//  Created by Darren Ford on 25/01/21.\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\t/// Grid lines definition\n\t@objc(DSFSparklineGridLinesDefinition) class GridLinesDefinition: NSObject {\n\t\t/// Grid lines color\n\t\t@objc public let color: DSFColor\n\t\t/// Grid lines width\n\t\t@objc public let width: CGFloat\n\t\t/// The dash style to use when drawing\n\t\t@objc public let dashStyle: [CGFloat]\n\t\t/// The positions to draw the gridlines for the data source\n\t\t@objc public let values: [CGFloat]\n\t\t/// Create a grid lines definition\n\t\t/// - Parameters:\n\t\t///   - color: The color of the grid lines\n\t\t///   - width: The width to draw the grid lines\n\t\t///   - dashStyle: The dash style for the grid lines\n\t\t///   - values: The positions to draw the gridlines for the data source\n\t\t@objc public init(\n\t\t\tcolor: DSFColor = .init(white: 0.5, alpha: 0.5),\n\t\t\twidth: CGFloat = 1.0,\n\t\t\tdashStyle: [CGFloat] = [1.0, 1.0],\n\t\t\tvalues: [CGFloat] = []\n\t\t) {\n\t\t\tself.color = color\n\t\t\tself.width = width\n\t\t\tself.dashStyle = dashStyle\n\t\t\tself.values = values\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+HighlightRangeDefinition.swift",
    "content": "//\n//  DSFSparkline+HighlightRangeDefinition.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 25/01/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\n\t/// A highlight range definition\n\t@objc(DSFSparklineHighlightRangeDefinition) class HighlightRangeDefinition: NSObject {\n\t\tpublic static let DefaultFill = DSFSparkline.Fill.Color(DSFColor.systemGray.cgColor)\n\n\t\t/// The range in the sparkline to highlight\n\t\tpublic var range: Range<CGFloat>\n\n\t\t/// The highlight fill to use\n\t\t@objc public var fill: DSFSparklineFillable\n\n\t\tpublic init(range: Range<CGFloat>, fill: DSFSparklineFillable = DefaultFill) {\n\t\t\tself.range = range\n\t\t\tself.fill = fill\n\t\t\tsuper.init()\n\t\t}\n\n\t\tpublic init(range: Range<CGFloat>, fillColor: CGColor) {\n\t\t\tself.range = range\n\t\t\tself.fill = DSFSparkline.Fill.Color(fillColor)\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Objective-C compatible initializer. Lowerbound MUST be less than upperbound!\n\t\t@objc public init(lowerBound: CGFloat, upperBound: CGFloat, fill: DSFSparklineFillable = DefaultFill) {\n\t\t\tassert(lowerBound < upperBound)\n\t\t\tself.range = lowerBound ..< upperBound\n\t\t\tself.fill = fill\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Objective-C compatible initializer. Lowerbound MUST be less than upperbound!\n\t\t@objc public init(lowerBound: CGFloat, upperBound: CGFloat, fillColor: CGColor) {\n\t\t\tassert(lowerBound < upperBound)\n\t\t\tself.range = lowerBound ..< upperBound\n\t\t\tself.fill = DSFSparkline.Fill.Color(fillColor)\n\t\t\tsuper.init()\n\t\t}\n\n\t\t@objc public func copyHighlightRangeDefinition() -> HighlightRangeDefinition {\n\t\t\tHighlightRangeDefinition(\n\t\t\t\tlowerBound: self.range.lowerBound,\n\t\t\t\tupperBound: self.range.upperBound,\n\t\t\t\tfill: self.fill)\n\t\t}\n\t}\n}\n\n// MARK: - Objective-C helpers\n\npublic extension DSFSparkline.HighlightRangeDefinition {\n\t@objc var lowerBound: CGFloat {\n\t\tget {\n\t\t\treturn self.range.lowerBound\n\t\t}\n\t\tset {\n\t\t\tself.range = newValue ..< self.range.upperBound\n\t\t}\n\t}\n\t@objc var upperBound: CGFloat {\n\t\tget {\n\t\t\treturn self.range.upperBound\n\t\t}\n\t\tset {\n\t\t\tself.range = self.range.lowerBound ..< newValue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+Palette.swift",
    "content": "//\n//  DSFSparkline+Palette.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\n\t/// The palette to use when drawing the pie. The first value in the datasource uses the first color,\n\t/// the second the second color etc.  If there are more datapoints than colors (you shouldn't do this!) then\n\t/// the chart will start back at the start of the palette.\n\t///\n\t/// These palettes can be safely shared between multiple pie views\n\t@objc(DSFSparklinePalette) class Palette: NSObject {\n\t\t/// The colors to be used when drawing segments\n\t\t@objc public let colors: [DSFColor]\n\t\t@objc public let cgColors: NSArray\n\n\t\t/// A default palette used when no palette is specified.\n\t\t@objc public static let shared = DSFSparkline.Palette([\n\t\t\tDSFColor.systemRed,\n\t\t\tDSFColor.systemOrange,\n\t\t\tDSFColor.systemYellow,\n\t\t\tDSFColor.systemGreen,\n\t\t\tDSFColor.systemBlue,\n\t\t\tDSFColor.systemPurple,\n\t\t\tDSFColor.systemPink,\n\t\t])\n\n\t\t/// A default palette used when no palette is specified\n\t\t@objc public static let sharedGrays = DSFSparkline.Palette([\n\t\t\tDSFColor(white: 0.9, alpha: 1),\n\t\t\tDSFColor(white: 0.7, alpha: 1),\n\t\t\tDSFColor(white: 0.5, alpha: 1),\n\t\t\tDSFColor(white: 0.3, alpha: 1),\n\t\t\tDSFColor(white: 0.1, alpha: 1),\n\t\t])\n\n\t\t@objc public init(_ colors: [DSFColor]) {\n\t\t\tself.colors = colors\n\t\t\tself.cgColors = NSArray(array: colors.map { $0.cgColor })\n\t\t\tsuper.init()\n\t\t}\n\n\t\t@objc public func copyPalette() -> Palette {\n\t\t\tlet copied = self.colors.compactMap { $0.copy() as? DSFColor ?? .black }\n\t\t\treturn Palette(copied)\n\t\t}\n\n\t\t@inlinable @objc func colorAtOffset(_ offset: Int) -> DSFColor {\n\t\t\treturn self.colors[offset % self.colors.count]\n\t\t}\n\t\t@inlinable @objc func cgColorAtOffset(_ offset: Int) -> CGColor {\n\t\t\treturn self.cgColors[offset % self.colors.count] as! CGColor\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+ValueBasedFill.swift",
    "content": "//\n//  DSFSparkline+FillColor.swift\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport QuartzCore\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\t/// A fill color that can change depending on a value\n\t@objc(DSFSparklineValueBasedFill) class ValueBasedFill: NSObject {\n\t\t/// Is this a simple flat color?\n\t\t@objc public var isFlatColor: Bool { self.flatColor != nil }\n\t\t/// Is this a color palette?\n\t\t@objc public var isPalette: Bool { self.palette != nil }\n\t\t/// Is this a gradient?\n\t\t@objc public var isGradient: Bool { self.gradient != nil }\n\n\t\t@objc public static let sharedPalette = ValueBasedFill(palette: DSFSparkline.Palette.shared)\n\n\t\tprivate var flatColor: CGColor? = nil\n\t\tprivate var palette: DSFSparkline.Palette? = nil\n\t\tprivate var gradient: DSFSparkline.GradientBucket? = nil\n\n\t\t@objc public init(flatColor: CGColor) {\n\t\t\tself.flatColor = flatColor\n\t\t}\n\n\t\t@objc public init(palette: DSFSparkline.Palette) {\n\t\t\tself.palette = palette\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Create a fill object containing an array of colors\n\t\t/// - Parameter colors: The colors\n\t\t@objc public convenience init(colors: [DSFColor]) {\n\t\t\tself.init(palette: DSFSparkline.Palette(colors))\n\t\t}\n\n\t\t@objc public init(gradient: DSFSparkline.GradientBucket) {\n\t\t\tself.gradient = gradient\n\t\t}\n\n\t\tinit(flatColor: CGColor?, palette: DSFSparkline.Palette?, gradient: DSFSparkline.GradientBucket?) {\n\t\t\tself.flatColor = flatColor?.copy()\n\t\t\tself.palette = palette?.copyPalette()\n\t\t\tself.gradient = gradient?.copyGradientBucket()\n\t\t}\n\n\t\tfunc copyColorContainer() -> ValueBasedFill {\n\t\t\treturn .init(flatColor: self.flatColor, palette: self.palette, gradient: self.gradient)\n\t\t}\n\n\t\tfunc color(atFraction fraction: CGFloat) -> CGColor {\n\t\t\tlet f = max(0, min(1 - CGFloat.ulpOfOne, fraction))\n\t\t\tif let flatColor = self.flatColor {\n\t\t\t\treturn flatColor\n\t\t\t}\n\t\t\telse if let gradient = self.gradient {\n\t\t\t\treturn gradient.color(at: f)\n\t\t\t}\n\t\t\telse if let palette = self.palette {\n\t\t\t\tlet div = 1.0 / CGFloat(palette.colors.count)\n\t\t\t\tlet indexed = Int((f / div).rounded(.towardZero))\n\t\t\t\treturn palette.cgColorAtOffset(indexed)\n\t\t\t}\n\t\t\treturn CGColor(red: 1, green: 0, blue: 0, alpha: 1)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline+ZeroLineDefinition.swift",
    "content": "//\n//  DSFSparkline+ZeroLineDefinition.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 25/01/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\n\t/// Drawing definition for the zero-line operations\n\t@objc(DSFSparklineZeroLineDefinition) class ZeroLineDefinition: NSObject {\n\t\t#if os(macOS)\n\t\tpublic static let DefaultColor = DSFColor.disabledControlTextColor\n\t\t#else\n\t\tpublic static let DefaultColor = DSFColor.systemGray\n\t\t#endif\n\n\t\t/// A shared 'default' drawing pattern\n\t\tpublic static let shared = DSFSparkline.ZeroLineDefinition()\n\n\t\t/// The color to draw the zero line\n\t\tlet color: DSFColor\n\n\t\t/// The width of the zero line\n\t\tlet lineWidth: CGFloat\n\n\t\t/// The pattern for drawing the line\n\t\tlet lineDashStyle: [CGFloat]\n\n\t\t/// Drawing definition for the zero-line for a graph\n\t\t/// - Parameters:\n\t\t///   - color: The color to draw the zero line\n\t\t///   - lineWidth: The width of the zero line\n\t\t///   - lineDashStyle: The pattern for drawing the line. An array of values that specify the lengths, in user space coordinates, of the painted and unpainted segments of the dash pattern. For example, the array [2,3] sets a dash pattern that alternates between a 2-unit-long painted segment and a 3-unit-long unpainted segment. The array [1,3,4,2] sets the pattern to a 1-unit painted segment, a 3-unit unpainted segment, a 4-unit painted segment, and a 2-unit unpainted segment. Pass an empty array to clear the dash pattern so that all stroke drawing in the context uses solid lines.\n\t\tpublic init(color: DSFColor = DefaultColor,\n\t\t\t\t\t\tlineWidth: CGFloat = 1.0,\n\t\t\t\t\t\tlineDashStyle: [CGFloat] = [1, 1])\n\t\t{\n\t\t\tself.color = color\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.lineDashStyle = lineDashStyle\n\t\t}\n\n\t\t@objc public func copyZeroLineDefinition() -> ZeroLineDefinition {\n\t\t\tZeroLineDefinition(\n\t\t\t\tcolor: self.color.copy() as? DSFColor ?? .black,\n\t\t\t\tlineWidth: self.lineWidth,\n\t\t\t\tlineDashStyle: self.lineDashStyle\n\t\t\t)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/DSFSparkline.swift",
    "content": "//\n//  DSFSparkline.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 26/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n@objc public class DSFSparkline: NSObject { }\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/fill/DSFSparkline+FillColor.swift",
    "content": "//\n//  DSFSparkline+FillColor.swift\n//  DSFSparklines\n//\n//  Copyright © 2022 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\n// MARK: - Solid color fill\n\npublic extension DSFSparkline.Fill {\n\n\t/// The solid color fill\n\t@objc(DSFSparklineFillColor) class `Color`: NSObject, DSFSparklineFillable {\n\n\t\t/// Black color\n\t\t@objc public static var black: DSFSparkline.Fill.Color { .init(gray: 0) }\n\t\t/// White color\n\t\t@objc public static var white: DSFSparkline.Fill.Color { .init(gray: 1) }\n\t\t/// Clear color\n\t\t@objc public static var clear: DSFSparkline.Fill.Color { .init(gray: 0, alpha: 0) }\n\n\t\t/// The fill color\n\t\t@objc public var color: CGColor\n\n\t\t/// Create a color using a CGColor\n\t\t/// - Parameter color: The color\n\t\t@objc public init(_ color: CGColor) {\n\t\t\tself.color = color\n\t\t}\n\n\t\t/// Create a fill color using an sRGB color\n\t\t/// - Parameters:\n\t\t///   - red: red component\n\t\t///   - green: green component\n\t\t///   - blue: blue component\n\t\t///   - alpha: alpha component\n\t\t@objc public init(srgbRed red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat = 1.0) {\n\t\t\tlet cs = CGColorSpace(name: CGColorSpace.sRGB)!\n\t\t\tself.color = CGColor(colorSpace: cs, components: [red, green, blue, alpha]) ?? CGColor.black\n\t\t}\n\n\t\t/// Create a fill color using an rgb color\n\t\t/// - Parameters:\n\t\t///   - red: red component\n\t\t///   - green: green component\n\t\t///   - blue: blue component\n\t\t///   - alpha: alpha component\n\t\t@objc public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat = 1.0) {\n\t\t\tself.color = CGColor(red: red, green: green, blue: blue, alpha: alpha)\n\t\t}\n\n\t\t/// Create a fill color using an sRGB color\n\t\t/// - Parameters:\n\t\t///   - red: red component\n\t\t///   - green: green component\n\t\t///   - blue: blue component\n\t\t///   - alpha: alpha component\n\t\t@objc public init(gray: CGFloat, alpha: CGFloat = 1.0) {\n\t\t\tself.color = CGColor(gray: gray, alpha: alpha)\n\t\t}\n\n\t\tpublic func fill(context: CGContext, bounds: CGRect) {\n\t\t\tcontext.setFillColor(color)\n\t\t\tcontext.fill(bounds)\n\t\t}\n\n\t\t@objc public func copyFill() -> DSFSparklineFillable {\n\t\t\treturn Color(self.color.copy() ?? .black)\n\t\t}\n\n\t\t@objc public func color(at fractionalValue: CGFloat) -> CGColor {\n\t\t\tself.color\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/fill/DSFSparkline+FillGradient.swift",
    "content": "//\n//  DSFSparkline+FillGradient.swift\n//  DSFSparklines\n//\n//  Copyright © 2022 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\n// MARK: - Gradient fill\n\npublic extension DSFSparkline.Fill {\n\n\t/// The gradient fill (vertical only at the moment)\n\t@objc(DSFSparklineFillGradient) class `Gradient`: NSObject, DSFSparklineFillable {\n\n\t\t/// The gradient to use when filling\n\t\t@objc public var gradient: CGGradient\n\n\t\t/// Is the gradient horizontal or vertical\n\t\t@objc public var isHorizontal: Bool\n\n\t\t/// A workaround for retrieving a color at a fractional location within a CGGradient\n\t\tprivate lazy var peek: GradientPeek = {\n\t\t\tGradientPeek(gradient: self.gradient)\n\t\t}()\n\n\t\t/// Create a fill gradient\n\t\t@objc public init(gradient: CGGradient, isHorizontal: Bool = false) {\n\t\t\tself.gradient = gradient\n\t\t\tself.isHorizontal = isHorizontal\n\t\t}\n\n\t\t/// Create a fill gradient\n\t\tpublic init(colors: [CGColor], isHorizontal: Bool = false) {\n\t\t\tassert(colors.count >= 2)\n\n\t\t\tself.isHorizontal = isHorizontal\n\n\t\t\tlet count = colors.count\n\t\t\tlet divisor = 1.0 / (CGFloat(count) - 1)\n\t\t\tlet locations = (0 ..< count - 1).map { Double($0) * divisor }.appending(1)\n\n\t\t\tlet gradient = CGGradient(\n\t\t\t\tcolorsSpace: nil,\n\t\t\t\tcolors: colors as CFArray,\n\t\t\t\tlocations: locations)\n\n\t\t\tself.gradient = gradient!\n\t\t}\n\n\t\t/// Make a copy of a gradient\n\t\t@objc public func copyFill() -> DSFSparklineFillable {\n\t\t\tGradient(gradient: self.gradient, isHorizontal: isHorizontal)\n\t\t}\n\n\t\t@objc public func fill(context: CGContext, bounds: CGRect) {\n\t\t\tif isHorizontal {\n\t\t\t\tcontext.drawLinearGradient(\n\t\t\t\t\tgradient,\n\t\t\t\t\tstart: CGPoint(x: bounds.minX, y: bounds.maxY),\n\t\t\t\t\tend: CGPoint(x: bounds.maxX, y: bounds.maxY),\n\t\t\t\t\toptions: [.drawsAfterEndLocation, .drawsBeforeStartLocation]\n\t\t\t\t)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontext.drawLinearGradient(\n\t\t\t\t\tgradient,\n\t\t\t\t\tstart: CGPoint(x: 0.0, y: bounds.maxY),\n\t\t\t\t\tend: CGPoint(x: 0.0, y: bounds.minY),\n\t\t\t\t\toptions: [.drawsAfterEndLocation, .drawsBeforeStartLocation]\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t/// Return the color at a fractional (0 -> 1) position within the gradient\n\t\t@objc public func color(at fractionalValue: CGFloat) -> CGColor {\n\t\t\tself.peek.color(at: fractionalValue)\n\t\t}\n\t}\n}\n\nprivate extension DSFSparkline.Fill.Gradient {\n\tclass GradientPeek {\n\t\tstatic let divisor: CGFloat = 1.0 / 255.0\n\t\tlet snapshotSize = 4096\n\t\tlet gradient: CGGradient\n\n\t\tprivate let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)!\n\t\tprivate lazy var bitmap: [UInt8] = {\n\t\t\t[UInt8](repeating: 0, count: (self.snapshotSize + 1) * 4)\n\t\t}()\n\n\t\tinit(gradient: CGGradient) {\n\t\t\tself.gradient = gradient\n\t\t\tself.build()\n\t\t}\n\n\t\tfunc color(at fraction: CGFloat) -> CGColor {\n\t\t\tlet fraction = fraction.clamped(to: 0 ... 1)\n\t\t\tlet pixel = Int((CGFloat(self.snapshotSize) * fraction).rounded(.towardZero))\n\t\t\tlet offset = pixel * 4\n\n\t\t\tlet r = bitmap[offset + 0]\n\t\t\tlet g = bitmap[offset + 1]\n\t\t\tlet b = bitmap[offset + 2]\n\t\t\tlet a = bitmap[offset + 3]\n\n\t\t\treturn CGColor(\n\t\t\t\tcolorSpace: self.colorSpace,\n\t\t\t\tcomponents: [\n\t\t\t\t\tCGFloat(r) * Self.divisor,\n\t\t\t\t\tCGFloat(g) * Self.divisor,\n\t\t\t\t\tCGFloat(b) * Self.divisor,\n\t\t\t\t\tCGFloat(a) * Self.divisor\n\t\t\t\t]\n\t\t\t)!\n\t\t}\n\n\t\tprivate func build() {\n\t\t\tlet sz = self.snapshotSize + 1\n\t\t\tlet bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)\n\t\t\tguard\n\t\t\t\tlet ctx = CGContext(\n\t\t\t\t\tdata: &bitmap,\n\t\t\t\t\twidth: sz,\n\t\t\t\t\theight: 1,\n\t\t\t\t\tbitsPerComponent: 8,\n\t\t\t\t\tbytesPerRow: sz * 4,\n\t\t\t\t\tspace: self.colorSpace,\n\t\t\t\t\tbitmapInfo: bitmapInfo.rawValue\n\t\t\t\t)\n\t\t\telse {\n\t\t\t\tfatalError()\n\t\t\t}\n\n\t\t\tctx.drawLinearGradient(\n\t\t\t\tgradient,\n\t\t\t\tstart: .init(x: 0, y: 0),\n\t\t\t\tend: .init(x: sz, y: 0),\n\t\t\t\toptions: []\n\t\t\t)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/overlay/types/fill/DSFSparkline+Fillable.swift",
    "content": "//\n//  DSFSparkline+Fillable.swift\n//  DSFSparklines\n//\n//  Copyright © 2022 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\n/// A protocol definition for objects that can 'fill' a rectangle within a context with a color/gradient/pattern etc\n@objc public protocol DSFSparklineFillable: NSObjectProtocol {\n\t@objc func fill(context: CGContext, bounds: CGRect)\n\t@objc func copyFill() -> DSFSparklineFillable\n\t@objc func color(at fractionalValue: CGFloat) -> CGColor\n}\n\npublic extension DSFSparkline {\n\t/// Defining a namespace for fillables\n\tclass Fill {\n\t\tprivate init() {}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineActivityGridView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineActivityGridView+SwiftUI.swift\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport Foundation\nimport SwiftUI\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineActivityGridView {\n\n\t/// The SwiftUI percent bar graph\n\tstruct SwiftUI {\n\t\tlet values: [Double]\n\t\tlet range: ClosedRange<Double>?\n\t\tlet verticalCellCount: UInt?\n\t\tlet horizontalCellCount: UInt\n\t\tlet cellStyle: DSFSparkline.ActivityGrid.CellStyle\n\t\tlet layoutStyle: DSFSparkline.ActivityGrid.LayoutStyle\n\n\t\tvar _tooltipStringForCell: ((Int) -> String?)?\n\n\t\t/// Create an Activity Grid\n\t\t/// - Parameters:\n\t\t///   - values: The values to display\n\t\t///   - range: The allowable upper/lower bounds for the input values\n\t\t///   - verticalCellCount: The number of vertical cells\n\t\t///   - cellStyle: The stying to apply to each cell\n\t\t///   - layoutStyle: The style for drawing the activity grid\n\t\tpublic init(\n\t\t\tvalues: [Double],\n\t\t\trange: ClosedRange<Double>? = nil,\n\t\t\tverticalCellCount: UInt? = nil,\n\t\t\thorizontalCellCount: UInt = 0,\n\t\t\tcellStyle: DSFSparkline.ActivityGrid.CellStyle = .init(),\n\t\t\tlayoutStyle: DSFSparkline.ActivityGrid.LayoutStyle = .github\n\t\t) {\n\t\t\tself.values = values\n\t\t\tself.range = range\n\t\t\tself.verticalCellCount = verticalCellCount\n\t\t\tself.horizontalCellCount = horizontalCellCount\n\t\t\tself.cellStyle = cellStyle\n\t\t\tself.layoutStyle = layoutStyle\n\t\t}\n\n\t\t/// Create an Activity Grid\n\t\t/// - Parameters:\n\t\t///   - values: The values to display\n\t\t///   - range: The allowable upper/lower bounds for the input values\n\t\t///   - verticalCellCount: The number of vertical cells, or 0 to fill vertically\n\t\t///   - horizontalCellCount: The number of horizontal cells, or 0 to fill horizontally\n\t\t///   - layoutStyle: The style for drawing the activity grid\n\t\t///   - fillStyle: The fill mechanism\n\t\t///   - borderColor: Cell border color\n\t\t///   - borderWidth: Cell border width\n\t\t///   - cellDimension: Cell dimension (cells are always square)\n\t\t///   - cellSpacing: The spacing between cells\n\t\t///   - cornerRadius: Cell corner radius\n\t\tpublic init(\n\t\t\tvalues: [Double],\n\t\t\trange: ClosedRange<Double>? = nil,\n\t\t\tverticalCellCount: UInt? = nil,\n\t\t\thorizontalCellCount: UInt = 0,\n\t\t\tlayoutStyle: DSFSparkline.ActivityGrid.LayoutStyle = .github,\n\t\t\tfillScheme: DSFSparkline.ValueBasedFill,\n\t\t\tborderColor: CGColor? = nil,\n\t\t\tborderWidth: CGFloat = 1,\n\t\t\tcellDimension: CGFloat = 11,\n\t\t\tcellSpacing: CGFloat = 2.5,\n\t\t\tcornerRadius: CGFloat = 2.5\n\t\t) {\n\t\t\tself.values = values\n\t\t\tself.range = range\n\t\t\tself.verticalCellCount = verticalCellCount\n\t\t\tself.horizontalCellCount = horizontalCellCount\n\t\t\tself.layoutStyle = layoutStyle\n\t\t\tself.cellStyle = DSFSparkline.ActivityGrid.CellStyle(\n\t\t\t\tfillScheme: fillScheme,\n\t\t\t\tborderColor: borderColor,\n\t\t\t\tborderWidth: borderWidth,\n\t\t\t\tcellDimension: cellDimension,\n\t\t\t\tcellSpacing: cellSpacing,\n\t\t\t\tcornerRadius: cornerRadius\n\t\t\t)\n\t\t}\n\n\t\t/// A callback block for retrieving the tooltip text for a cell within the activity grid\n\t\tpublic func tooltipStringForCell(_ block: @escaping (Int) -> String?) -> Self {\n\t\t\tvar copy = self\n\t\t\tcopy._tooltipStringForCell = block\n\t\t\treturn copy\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineActivityGridView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineActivityGridView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineActivityGridView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineActivityGridView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineActivityGridView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tfunc makeActivityGrid(_ context: Context) -> DSFSparklineActivityGridView {\n\t\tlet view = DSFSparklineActivityGridView(frame: .zero)\n\t\tself.updateView(view)\n\t\tview.cellTooltipString = self._tooltipStringForCell\n\t\treturn view\n\t}\n\n\t#if os(macOS)\n\t@available(macOS 13.0, *)\n\tpublic func sizeThatFits(_ proposal: ProposedViewSize, nsView: DSFSparklineActivityGridView, context: Context) -> CGSize? {\n\t\tlet w = (nsView.horizontalCellCount == 0) ? (proposal.width ?? nsView.activityLayer.intrinsicWidth) : nsView.activityLayer.intrinsicWidth\n\t\treturn CGSize(width: w, height: nsView.intrinsicContentSize.height)\n\t}\n\t#else\n\t@available(iOS 16.0, tvOS 16.0, *)\n\tpublic func sizeThatFits(_ proposal: ProposedViewSize, uiView: DSFSparklineActivityGridView, context: Context) -> CGSize? {\n\t\tlet w = (uiView.horizontalCellCount == 0) ? (proposal.width ?? uiView.activityLayer.intrinsicWidth) : uiView.activityLayer.intrinsicWidth\n\t\treturn CGSize(width: w, height: uiView.intrinsicContentSize.height)\n\t}\n\t#endif\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineActivityGridView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineActivityGridView {\n\t\treturn self.makeActivityGrid(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineActivityGridView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineActivityGridView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineActivityGridView {\n\t\tlet v = self.makeActivityGrid(context)\n\t\treturn v\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineActivityGridView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineActivityGridView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineActivityGridView) {\n\t\tlet v = self.values.map { CGFloat($0) }\n\t\tif let vh = self.verticalCellCount { view.verticalCellCount = vh }\n\t\tview.horizontalCellCount = self.horizontalCellCount\n\t\tif let range = self.range {\n\t\t\tview.setValues(v, range: CGFloat(range.lowerBound) ... CGFloat(range.upperBound))\n\t\t}\n\t\telse {\n\t\t\tview.setValues(v)\n\t\t}\n\n\t\tview.cellStyle = self.cellStyle\n\t\tview.layoutStyle = self.layoutStyle\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineActivityGridView.swift",
    "content": "//\n//  DSFSparklineActivityGridView.swift\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n@objc public class DSFSparklineActivityGridView: DSFSparklineSurfaceView {\n\t/// The view's data source\n\t@objc public var dataSource: DSFSparkline.StaticDataSource {\n\t\tget { self.activityLayer.dataSource }\n\t\tset {\n\t\t\tself.activityLayer.dataSource = newValue\n\t\t\tself.setNeedsDisplay()\n\t\t}\n\t}\n\n\t/// Set the values for the data source\n\t/// - Parameters:\n\t///   - values: The values\n\t@objc public func setValues(_ values: [CGFloat]) {\n\t\tself.dataSource = DSFSparkline.StaticDataSource(values)\n\t}\n\n\t/// Set the values and supported range for the data source\n\t/// - Parameters:\n\t///   - values: The values\n\t///   - range: The acceptable range for the input data\n\tpublic func setValues(_ values: [CGFloat], range: ClosedRange<CGFloat>) {\n\t\tself.dataSource = DSFSparkline.StaticDataSource(values, range: range)\n\t}\n\n\t/// Set the values and supported range for the data source\n\t/// - Parameters:\n\t///   - values: The values\n\t///   - lowerBound: The acceptable lower bounds for the input data\n\t///   - upperBound: The acceptable upper bounds for the input data\n\t@objc public func setValues(_ values: [CGFloat], lowerBound: CGFloat, upperBound: CGFloat) {\n\t\tself.activityLayer.dataSource = DSFSparkline.StaticDataSource(\n\t\t\tvalues,\n\t\t\tlowerBound: lowerBound,\n\t\t\tupperBound: upperBound\n\t\t)\n\t}\n\n\t/// The layout style for the grid\n\t@objc public var cellStyle: DSFSparkline.ActivityGrid.CellStyle {\n\t\tget { self.activityLayer.cellStyle }\n\t\tset { self.activityLayer.cellStyle = newValue }\n\t}\n\n\t/// The layout style for the grid\n\t@objc public var layoutStyle: DSFSparkline.ActivityGrid.LayoutStyle {\n\t\tget { self.activityLayer.layoutStyle }\n\t\tset { self.activityLayer.layoutStyle = newValue }\n\t}\n\n\t/// The number of vertical cells in a column\n\t@objc public var verticalCellCount: UInt {\n\t\tget { UInt(self.activityLayer.verticalCellCount) }\n\t\tset { self.activityLayer.verticalCellCount = Int(newValue) }\n\t}\n\n\t/// The number of horizontal cells in a column.\n\t@objc public var horizontalCellCount: UInt {\n\t\tget { UInt(self.activityLayer.horizontalCellCount) }\n\t\tset { self.activityLayer.horizontalCellCount = Int(newValue) }\n\t}\n\n\t/// The color scheme to use when filling cells\n\t@objc public var cellFillScheme: DSFSparkline.ValueBasedFill {\n\t\tget { self.activityLayer.cellFillScheme }\n\t\tset { self.activityLayer.cellFillScheme = newValue }\n\t}\n\n\t/// The dimension of each cell\n\t@objc public var cellDimension: CGFloat {\n\t\tget { self.activityLayer.cellDimension }\n\t\tset { self.activityLayer.cellDimension = newValue }\n\t}\n\n\t/// The spacing between each of the cells\n\t@objc public var cellSpacing: CGFloat {\n\t\tget { self.activityLayer.cellSpacing }\n\t\tset { self.activityLayer.cellSpacing = newValue }\n\t}\n\n\t/// The border color for each individual cell\n\t@objc public var cellBorderColor: DSFColor? {\n\t\tget {\n\t\t\tif let c = self.activityLayer.borderColor { return DSFColor(cgColor: c) }\n\t\t\treturn nil\n\t\t}\n\t\tset { self.activityLayer.cellBorderColor = newValue?.cgColor }\n\t}\n\n\t/// The cell's border width\n\t@objc public var cellBorderWidth: CGFloat {\n\t\tget { self.activityLayer.borderWidth }\n\t\tset { self.activityLayer.borderWidth = newValue }\n\t}\n\n\t/// The cell's corner radius\n\t@objc public var cellCornerRadius: CGFloat {\n\t\tget { self.activityLayer.cellCornerRadius }\n\t\tset { self.activityLayer.cellCornerRadius = newValue }\n\t}\n\n\t/// A block called to retrieve the tooltip text for a specific cell index\n\t@objc public var cellTooltipString: ((Int) -> String?)? {\n\t\tdidSet {\n\t\t\tself.cellsDidUpdate()\n\t\t}\n\t}\n\n\t/// Initializer\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\t/// Initializer\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.activityLayer)\n\t\tself.activityLayer.cellsDidUpdateBlock = cellsDidUpdate\n\n\t\t#if os(macOS)\n\t\tself.updateTooltips()\n\t\t#endif\n\t}\n\n\tpublic override var intrinsicContentSize: CGSize { self.activityLayer.intrinsicSize }\n\n\t#if os(macOS)\n\tpublic override func layout() {\n\t\tsuper.layout()\n\t\tself.activityLayer.frame = self.bounds\n\t\tself.updateTooltips()\n\t}\n\t#else\n\tpublic override func layoutSubviews() {\n\t\tsuper.layoutSubviews()\n\t\tself.activityLayer.frame = self.bounds\n\t}\n\t#endif\n\n\t// private\n\tinternal let activityLayer = DSFSparklineOverlay.ActivityGrid()\n\n\t#if os(macOS)\n\tprivate var tooltipTags: [NSView.ToolTipTag] = []\n\t#endif\n}\n\ninternal extension DSFSparklineActivityGridView {\n\t// Called when the activity grid layer updates\n\tfunc cellsDidUpdate() {\n\t\t#if os(macOS)\n\t\tif let _ = self.cellTooltipString, self.tooltipTags.count == 0 {\n\t\t\tself.updateTooltips()\n\t\t}\n\t\t#endif\n\t}\n}\n\n#if os(macOS)\n\nextension DSFSparklineActivityGridView: NSViewToolTipOwner {\n\n\tfunc updateTooltips() {\n\t\tguard let _ = self.cellTooltipString else { return }\n\n\t\tif !Thread.isMainThread {\n\t\t\t// Must be called on the main thread\n\t\t\tDispatchQueue.main.async { [weak self] in self?.updateTooltips() }\n\t\t\treturn\n\t\t}\n\n\t\tself.tooltipTags.forEach { self.removeToolTip($0) }\n\t\tself.tooltipTags.removeAll()\n\t\t\n\t\tself.activityLayer.cells.enumerated().forEach { item in\n\t\t\tlet t = self.addToolTip(item.element, owner: self, userData: nil)\n\t\t\tself.tooltipTags.append(t)\n\t\t}\n\t}\n\n\tpublic func view(_ view: NSView, stringForToolTip tag: NSView.ToolTipTag, point: NSPoint, userData data: UnsafeMutableRawPointer?) -> String {\n\t\tassert(Thread.isMainThread)\n\t\tguard\n\t\t\tlet block = self.cellTooltipString,\n\t\t\tlet index = self.tooltipTags.firstIndex(where: { $0 == tag })\n\t\telse {\n\t\t\treturn \"\"\n\t\t}\n\t\treturn block(index) ?? \"\"\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineBarGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineBarGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 7/12/20.\n//  Copyright © 2020 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineBarGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\n\t\t/// The primary color for the sparkline\n\t\tlet graphColor: DSFColor\n\t\t/// The line width (in pixels) to use when drawing the border of each bar\n\t\tlet lineWidth: UInt\n\t\t/// The spacing (in pixels) between each bar\n\t\tlet barSpacing: UInt\n\n\t\t/// Draw a dotted line at the zero point on the y-axis\n\t\tlet showZeroLine: Bool\n\t\t/// The drawing definition for the zero line point\n\t\tlet zeroLineDefinition: DSFSparkline.ZeroLineDefinition\n\n\n\t\t/// Should the line graph be centered around the zero-line?\n\t\tlet centeredAtZeroLine: Bool\n\t\t/// The color used to draw values lower than the zero-line, or nil for the same as the graph color\n\t\tlet lowerGraphColor: DSFColor?\n\n\t\t/// Highlight y-ranges within the graph\n\t\tlet highlightDefinitions: [DSFSparkline.HighlightRangeDefinition]\n\n\t\t/// The grid lines definition\n\t\tlet gridLines: DSFSparkline.GridLinesDefinition?\n\n\t\t/// Primary fill\n\t\tlet primaryFill: DSFSparklineFillable?\n\t\t/// Secondary fill\n\t\tlet secondaryFill: DSFSparklineFillable?\n\n\t\t/// Create a bar graph sparkline\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - graphColor: The color to draw the graph\n\t\t///   - lineWidth: The width of the line around each bar\n\t\t///   - barSpacing: The spacing between the bars\n\t\t///   - showZeroLine: Show or hide a 'zero line' horizontal line\n\t\t///   - zeroLineDefinition: the settings for drawing the zero line\n\t\t///   - centeredAtZeroLine: Should the line graph be centered around the zero-line?\n\t\t///   - lowerGraphColor: The color used to draw values lower than the zero-line, or nil for the same as the graph color\n\t\t///   - highlightDefinitions: The style of the y-range highlight\n\t\t///   - gridLines: The grid lines to draw on the graph\n\t\t///   - primaryFill: The fill to use for values above the zero line\n\t\t///   - secondaryFill: The fill to use for values below the zero line\n\t\tpublic init(\n\t\t\tdataSource: DSFSparkline.DataSource,\n\t\t\tgraphColor: DSFColor,\n\t\t\tlineWidth: UInt = 1,\n\t\t\tbarSpacing: UInt = 1,\n\t\t\tshowZeroLine: Bool = false,\n\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition = .shared,\n\t\t\tcenteredAtZeroLine: Bool = false,\n\t\t\tlowerGraphColor: DSFColor? = nil,\n\t\t\tshowHighlightRange: Bool = false,\n\t\t\thighlightDefinitions: [DSFSparkline.HighlightRangeDefinition] = [],\n\t\t\tgridLines: DSFSparkline.GridLinesDefinition? = nil,\n\t\t\tprimaryFill: (any DSFSparklineFillable)? = nil,\n\t\t\tsecondaryFill: (any DSFSparklineFillable)? = nil\n\t\t) {\n\t\t\tself.dataSource = dataSource\n\t\t\tself.graphColor = graphColor\n\n\t\t\tself.showZeroLine = showZeroLine\n\t\t\tself.zeroLineDefinition = zeroLineDefinition\n\n\t\t\tself.centeredAtZeroLine = centeredAtZeroLine\n\t\t\tself.lowerGraphColor = lowerGraphColor\n\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.barSpacing = barSpacing\n\n\t\t\tself.highlightDefinitions = highlightDefinitions\n\t\t\tself.gridLines = gridLines\n\n\t\t\tself.primaryFill = primaryFill\n\t\t\tself.secondaryFill = secondaryFill\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineBarGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineBarGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineBarGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineBarGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineBarGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tprivate func makeBarGraph(_: Context) -> DSFSparklineBarGraphView {\n\t\tlet view = DSFSparklineBarGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\n\t\tview.dataSource = self.dataSource\n\t\tview.graphColor = self.graphColor\n\n\t\tview.barSpacing = self.barSpacing\n\t\tview.lineWidth = self.lineWidth\n\n\t\tview.zeroLineVisible = self.showZeroLine\n\t\tview.setZeroLineDefinition(self.zeroLineDefinition)\n\n\t\tview.centeredAtZeroLine = self.centeredAtZeroLine\n\t\tview.lowerGraphColor = self.lowerGraphColor\n\n\t\tif self.highlightDefinitions.count > 0 {\n\t\t\tview.highlightRangeVisible = true\n\t\t\tview.highlightRangeDefinition = self.highlightDefinitions\n\t\t}\n\n\t\tif let pf = self.primaryFill {\n\t\t\tview.primaryFill = pf\n\t\t}\n\t\tif let sf = self.secondaryFill {\n\t\t\tview.secondaryFill = sf\n\t\t}\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineBarGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineBarGraphView {\n\t\treturn self.makeBarGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineBarGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineBarGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineBarGraphView {\n\t\treturn self.makeBarGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineBarGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineBarGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineBarGraphView) {\n\n\t\tUpdateIfNotEqual(result: &view.graphColor, val: self.graphColor)\n\t\tUpdateIfNotEqual(result: &view.barSpacing, val: self.barSpacing)\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\n\t\tUpdateIfNotEqual(result: &view.zeroLineVisible, val: self.showZeroLine)\n\t\tview.setZeroLineDefinition(self.zeroLineDefinition)\n\n\t\tUpdateIfNotEqual(result: &view.centeredAtZeroLine, val: self.centeredAtZeroLine)\n\t\tUpdateIfNotEqual(result: &view.lowerGraphColor, val: self.lowerGraphColor)\n\n\t\tif self.highlightDefinitions.count > 0 {\n\t\t\tview.highlightRangeVisible = true\n\t\t\tview.highlightRangeDefinition = self.highlightDefinitions\n\t\t}\n\t\telse {\n\t\t\tview.highlightRangeVisible = false\n\t\t\tview.highlightRangeDefinition = []\n\t\t}\n\n\t\tif let gridLines = self.gridLines {\n\t\t\tview.setGridLineDefinition(gridLines)\n\t\t}\n\t\telse {\n\t\t\tview.gridLinesVisible = false\n\t\t}\n\n\t\tif let pf = self.primaryFill {\n\t\t\tview.primaryFill = pf\n\t\t}\n\t\tif let sf = self.secondaryFill {\n\t\t\tview.secondaryFill = sf\n\t\t}\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineBarGraphView.swift",
    "content": "//\n//  DSFSparklineBarGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline graph that displays bars\n@objc public class DSFSparklineBarGraphView: DSFSparklineZeroLineGraphView {\n\n\tlet overlay = DSFSparklineOverlay.Bar()\n\n\t/// The line width (in pixels) to use when drawing the border of each bar\n\t@objc public dynamic var lineWidth: UInt = 1 {\n\t\tdidSet {\n\t\t\tself.overlay.strokeWidth = self.lineWidth\n\t\t}\n\t}\n\n\t/// The spacing (in pixels) between each bar\n\t@objc public dynamic var barSpacing: UInt = 1 {\n\t\tdidSet {\n\t\t\tself.overlay.barSpacing = self.barSpacing\n\t\t}\n\t}\n\n\t/// Draw a shadow under the line\n\t@objc public dynamic var shadowed: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.shadow = self.shadowed ? NSShadow.sparklineDefault : nil\n\t\t}\n\t}\n\n\t/// Should the graph be centered at the zero line?\n\t@objc public dynamic var centeredAtZeroLine: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.centeredAtZeroLine = self.centeredAtZeroLine\n\t\t}\n\t}\n\n\t/// The primary fill (for the area of the graph ABOVE the zero line)\n\t@objc public dynamic var primaryFill: (any DSFSparklineFillable)? {\n\t\tget { self.overlay.primaryFill }\n\t\tset { self.overlay.primaryFill = newValue }\n\t}\n\n\t/// The secondary fill (for the area of the graph UNDER the zero line)\n\t@objc public dynamic var secondaryFill: (any DSFSparklineFillable)? {\n\t\tget { self.overlay.secondaryFill }\n\t\tset { self.overlay.secondaryFill = newValue }\n\t}\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.setNeedsDisplay()\n\t}\n\n\toverride func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\tself.overlay.strokeWidth = self.lineWidth\n\t\tself.overlay.barSpacing = self.barSpacing\n\n\t\tself.overlay.primaryStrokeColor = self.graphColor.cgColor\n\t\tself.overlay.secondaryStrokeColor = self.lowerColor.cgColor\n\n\t\tself.overlay.centeredAtZeroLine = self.centeredAtZeroLine\n\n\t\t// Backwards compatibility\n\t\tlet color = self.graphColor\n\t\tlet fill = DSFSparkline.Fill.Gradient(colors: [\n\t\t\tcolor.withAlphaComponent(0.4).cgColor,\n\t\t\tcolor.withAlphaComponent(0.2).cgColor\n\t\t])\n\t\tself.overlay.primaryFill = fill\n\n\t\tif let lowerColor = self.lowerGraphColor {\n\t\t\tlet fill = DSFSparkline.Fill.Gradient(colors: [\n\t\t\t\tlowerColor.withAlphaComponent(0.4).cgColor,\n\t\t\t\tlowerColor.withAlphaComponent(0.2).cgColor\n\t\t\t])\n\t\t\tself.overlay.secondaryFill = fill\n\t\t}\n\t\telse {\n\t\t\t// Fallback - if secondary fill not defined the compatibility view is to use the primary fill view\n\t\t\tself.overlay.secondaryFill = self.overlay.primaryFill\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineCircularGaugeView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineCircularGaugeView+SwiftUI.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineCircularGaugeView {\n\n\tenum Animation {\n\t\tcase linear(Double)\n\t\tcase easeInEaseOut(Double)\n\t}\n\n\t/// A SwiftUI wrapper for the Circular Progress sparkline overlay\n\tstruct SwiftUI {\n\t\tlet value: Double\n\t\tlet animationStyle: DSFSparkline.AnimationStyle?\n\t\tlet trackStyle: DSFSparklineOverlay.CircularGauge.TrackStyle\n\t\tlet lineStyle: DSFSparklineOverlay.CircularGauge.TrackStyle\n\n\t\t/// Create a Circular Gauge view\n\t\t/// - Parameters:\n\t\t///   - value: The value to display\n\t\t///   - animationStyle: The animation style, or nil for no animation\n\t\t///   - trackStyle: The style to use when drawing the track (background ring)\n\t\t///   - lineStyle: The style to use when drawing the value line\n\t\tpublic init(\n\t\t\tvalue: Double,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil,\n\t\t\ttrackStyle: DSFSparklineOverlay.CircularGauge.TrackStyle,\n\t\t\tlineStyle: DSFSparklineOverlay.CircularGauge.TrackStyle\n\t\t) {\n\t\t\tself.value = value\n\t\t\tself.animationStyle = animationStyle\n\t\t\tself.trackStyle = trackStyle\n\t\t\tself.lineStyle = lineStyle\n\t\t}\n\n\t\t/// Create a Circular Gauge view\n\t\t/// - Parameters:\n\t\t///   - value: The value to display\n\t\t///   - animationStyle: The animation style, or nil for no animation\n\t\t///   - trackWidth: The width of the track\n\t\t///   - trackFill: The fill style to use for the track\n\t\t///   - valueWidth: The width of the value line\n\t\t///   - valueFill: The fill style to use for the value line\n\t\tpublic init(\n\t\t\tvalue: Double,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil,\n\t\t\ttrackWidth: Double = 10,\n\t\t\ttrackFill: DSFSparklineFillable,\n\t\t\tvalueWidth: Double = 7,\n\t\t\tvalueFill: DSFSparklineFillable\n\t\t) {\n\t\t\tself.value = value\n\t\t\tself.animationStyle = animationStyle\n\t\t\tself.trackStyle = .init(width: trackWidth, fillColor: trackFill)\n\t\t\tself.lineStyle = .init(width: valueWidth, fillColor: valueFill)\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineCircularGaugeView.SwiftUI: DSFViewRepresentable {\n#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineCircularGaugeView\n#else\n\tpublic typealias UIViewType = DSFSparklineCircularGaugeView\n#endif\n\n\tfunc makeCircularGauge(_: Context) -> DSFSparklineCircularGaugeView {\n\t\tlet view = DSFSparklineCircularGaugeView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.value = self.value\n\t\tview.animationStyle = self.animationStyle\n\t\tview.trackStyle = self.trackStyle\n\t\tview.lineStyle = self.lineStyle\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineCircularGaugeView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineCircularGaugeView {\n\t\treturn self.makeCircularGauge(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineCircularGaugeView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineCircularGaugeView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineCircularGaugeView {\n\t\treturn self.makeCircularGauge(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineCircularGaugeView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineCircularGaugeView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineCircularGaugeView) {\n\t\tUpdateIfNotEqual(result: &view.value, val: self.value)\n\t\tif view.animationStyle !== self.animationStyle {\n\t\t\tview.animationStyle = self.animationStyle\n\t\t}\n\t\tif view.trackStyle !== self.trackStyle {\n\t\t\tview.trackStyle = self.trackStyle\n\t\t}\n\t\tif view.lineStyle !== self.lineStyle {\n\t\t\tview.lineStyle = self.lineStyle\n\t\t}\n\t}\n}\n\n#if DEBUG\n@available(macOS 10.15, *)\nstruct DSFSparklineCircularGaugeViewPreviews: PreviewProvider {\n\tstatic var previews: some SwiftUI.View {\n\n\t\tlet ge = DSFSparkline.Fill.Gradient(\n\t\t\tcolors: [\n\t\t\t\tCGColor(srgbRed: 1, green: 0.000, blue: 0.00, alpha: 1.0),\n\t\t\t\tCGColor(srgbRed: 0, green: 0.0, blue: 1, alpha: 1.0),\n\t\t\t]\n\t\t)\u000b\n\n\t\tlet vals = [Double](stride(from: 0, through: 1, by: 0.2))\n\t\tVStack {\n\t\t\tHStack {\n\t\t\t\tForEach(vals, id: \\.self) { value in\n\t\t\t\t\tDSFSparklineCircularGaugeView.SwiftUI(\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\ttrackStyle: .init(width: 20, fillColor: DSFSparkline.Fill.Color(gray: 0.5, alpha: 0.2)),\n\t\t\t\t\t\tlineStyle: .init(width: 10, fillColor: DSFSparkline.Fill.Color(gray: 0.5, alpha: 1.0))\n\t\t\t\t\t)\n\t\t\t\t\t.frame(width: 64, height: 64)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDivider()\n\n\t\t\tForEach([0, 1, 2], id: \\.self) { isShadowed in\n\t\t\t\tHStack {\n\t\t\t\t\tForEach(vals, id: \\.self) { value in\n\t\t\t\t\t\tDSFSparklineCircularGaugeView.SwiftUI(\n\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\ttrackStyle: .init(width: 20, fillColor: DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 1, alpha: 0.2), shadow: isShadowed == 1 ? .init(blurRadius: 2, offset: CGSize(width: 1, height: 1), color: .black) : nil),\n\t\t\t\t\t\t\tlineStyle: .init(width: 10, fillColor: DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 1, alpha: 1), shadow: isShadowed == 2 ? .init(blurRadius: 2, offset: CGSize(width: 1, height: 1), color: .black) : nil)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 64, height: 64)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDivider()\n\n\t\t\tForEach([0, 1, 2], id: \\.self) { isShadowed in\n\t\t\t\tHStack {\n\t\t\t\t\tForEach(vals, id: \\.self) { value in\n\t\t\t\t\t\tDSFSparklineCircularGaugeView.SwiftUI(\n\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\ttrackStyle: .init(\n\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\tfillColor: DSFSparkline.Fill.Color(gray: 0.5, alpha: 0.2),\n\t\t\t\t\t\t\t\tshadow: isShadowed == 1 ? .init(blurRadius: 1, offset: CGSize(width: 1, height: 1), color: .black.copy(alpha: 0.8)!, isInner: true) : nil\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlineStyle: .init(\n\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\tfillColor: ge,\n\t\t\t\t\t\t\t\tstrokeWidth: 0.2,\n\t\t\t\t\t\t\t\tstrokeColor: CGColor.standard.black,\n\t\t\t\t\t\t\t\tshadow: isShadowed == 2 ? .init(blurRadius: 1, offset: CGSize(width: 1, height: 1), color: .black.copy(alpha: 0.8)!, isInner: true) : nil\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.frame(width: 64, height: 64)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.padding()\n\t}\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineCircularGaugeView.swift",
    "content": "//\n//  DSFSparklineCircularGaugeView.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A circular gauge\npublic class DSFSparklineCircularGaugeView: DSFSparklineSurfaceView {\n\t/// The value to display (0 ... 1)\n\t@objc public dynamic var value: CGFloat = 0.0 {\n\t\tdidSet {\n\t\t\tself.overlay.value = self.value\n\t\t}\n\t}\n\n\t/// The style to use when drawing the gauge's track\n\t@objc public var trackStyle = DSFSparklineOverlay.CircularGauge.DefaultTrackStyle {\n\t\tdidSet {\n\t\t\tself.overlay.trackStyle = self.trackStyle\n\t\t}\n\t}\n\n\t/// The width of the track\n\t@objc public dynamic var trackWidth: CGFloat {\n\t\tget { self.overlay.trackStyle.width }\n\t\tset { self.overlay.trackStyle.width = newValue }\n\t}\n\n\t/// Track color\n\t@objc public dynamic var trackColor: DSFColor = .black.withAlphaComponent(0.1) {\n\t\tdidSet {\n\t\t\tself.overlay.trackStyle.fillColor = DSFSparkline.Fill.Color(trackColor.cgColor)\n\t\t}\n\t}\n\n\t/// The style to use when drawing the gauge's value\n\t@objc public var lineStyle = DSFSparklineOverlay.CircularGauge.DefaultLineStyle {\n\t\tdidSet {\n\t\t\tself.overlay.lineStyle = self.lineStyle\n\t\t}\n\t}\n\n\t/// The width of the track\n\t@objc public dynamic var lineWidth: CGFloat {\n\t\tget { self.overlay.lineStyle.width }\n\t\tset { self.overlay.lineStyle.width = newValue }\n\t}\n\n\t/// Line color\n\t@objc public dynamic var lineColor: DSFColor = .black {\n\t\tdidSet {\n\t\t\tself.overlay.lineStyle.fillColor = DSFSparkline.Fill.Color(lineColor.cgColor)\n\t\t}\n\t}\n\n\t/// The animation style to use when the value changes\n\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil {\n\t\tdidSet {\n\t\t\tself.overlay.animationStyle = animationStyle\n\t\t}\n\t}\n\n\t// MARK: - Initializers\n\t\n\t/// Create\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\t/// Create\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tprivate let overlay = DSFSparklineOverlay.CircularGauge()\n}\n\nextension DSFSparklineCircularGaugeView {\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.clipsToBounds = false\n\t\tself.setNeedsDisplay()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineCircularProgressView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineCircularProgressView+SwiftUI.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineCircularProgressView {\n\t/// A SwiftUI wrapper for the Circular Progress sparkline overlay\n\tstruct SwiftUI {\n\t\tlet value: Double\n\t\tlet trackWidth: Double\n\t\tlet fillStyle: DSFSparklineFillable\n\t\tlet padding: CGFloat\n\t\tlet trackColor: CGColor?\n\t\tlet trackIcon: CGImage?\n\n\t\tpublic init(\n\t\t\tvalue: Double,\n\t\t\tfillStyle: DSFSparklineFillable = DSFSparklineOverlay.CircularProgress.DefaultFillStyle,\n\t\t\ttrackWidth: Double = DSFSparklineOverlay.CircularProgress.DefaultTrackWidth,\n\t\t\tpadding: Double = 0.0,\n\t\t\ttrackColor: CGColor? = nil,\n\t\t\ttrackIcon: CGImage? = nil\n\t\t) {\n\t\t\tself.value = value\n\t\t\tself.trackWidth = trackWidth\n\t\t\tself.fillStyle = fillStyle\n\t\t\tself.padding = padding\n\t\t\tself.trackColor = trackColor\n\t\t\tself.trackIcon = trackIcon\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineCircularProgressView.SwiftUI: DSFViewRepresentable {\n#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineCircularProgressView\n#else\n\tpublic typealias UIViewType = DSFSparklineCircularProgressView\n#endif\n\n\tfunc makeProgressGraph(_: Context) -> DSFSparklineCircularProgressView {\n\t\tlet view = DSFSparklineCircularProgressView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.value = self.value\n\t\tview.trackWidth = self.trackWidth\n\t\tview.fillStyle = self.fillStyle.copyFill()\n\t\tview.padding = self.padding\n\t\tif let t = self.trackColor {\n\t\t\tview.trackColor = DSFColor(cgColor: t)\n\t\t}\n\t\tview.trackIcon = trackIcon\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineCircularProgressView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineCircularProgressView {\n\t\treturn self.makeProgressGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineCircularProgressView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineCircularProgressView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineCircularProgressView {\n\t\treturn self.makeProgressGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineCircularProgressView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineCircularProgressView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineCircularProgressView) {\n\t\tUpdateIfNotEqual(result: &view.value, val: self.value)\n\t\tUpdateIfNotEqual(result: &view.trackWidth, val: self.trackWidth)\n\t\tUpdateIfNotEqual(result: &view.padding, val: self.padding)\n\t\tif view.fillStyle !== self.fillStyle {\n\t\t\tview.fillStyle = self.fillStyle\n\t\t}\n\t\tif view.trackColor !== self.trackColor {\n\t\t\tif let t = self.trackColor {\n\t\t\t\tview.trackColor = DSFColor(cgColor: t)\n\t\t\t}\n\t\t}\n\t\tif view.trackIcon !== self.trackIcon {\n\t\t\tview.trackIcon = self.trackIcon\n\t\t}\n\t}\n}\n\n#if DEBUG\n\nfunc namedImage(_ name: String) -> CGImage? {\n#if os(macOS)\n\tif #available(macOS 11.0, *) {\n\t\tlet ns = NSImage(systemSymbolName: name, accessibilityDescription: nil)!\n\t\t//ns.\n\t\treturn ns.cgImage(forProposedRect: nil, context: nil, hints: nil)\n\t}\n\treturn nil\n#else\n\tlet ui = UIImage(systemName: name)!\n\treturn ui.cgImage\n#endif\n}\n\n@available(macOS 10.15, *)\nstruct DSFSparklineCircularProgressViewPreviews: PreviewProvider {\n\tstatic var previews: some SwiftUI.View {\n\t\tlet ge = DSFSparkline.Fill.Gradient(\n\t\t\tcolors: [\n\t\t\t\tCGColor(srgbRed: 1, green: 0.000, blue: 0.00, alpha: 1.0),\n\t\t\t\tCGColor(srgbRed: 0, green: 0.0, blue: 1, alpha: 1.0),\n\t\t\t]\n\t\t)\u000b\n\n\t\tlet g = DSFSparkline.Fill.Gradient(\n\t\t\tcolors: [\n\t\t\t\tCGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 1.0),\n\t\t\t\tCGColor(srgbRed: 0.891, green: 0.000, blue: 0.090, alpha: 1.0),\n\t\t\t]\n\t\t)\n\t\tlet g1 = DSFSparkline.Fill.Gradient(\n\t\t\tcolors: [\n\t\t\t\tCGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 1.0),\n\t\t\t\tCGColor(srgbRed: 0.601, green: 1.000, blue: 0.009, alpha: 1.0),\n\t\t\t]\n\t\t)\n\t\tlet g2 = DSFSparkline.Fill.Gradient(\n\t\t\tcolors: [\n\t\t\t\tCGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 1.0),\n\t\t\t\tCGColor(srgbRed: 0.015, green: 0.847, blue: 1.000, alpha: 1.0),\n\t\t\t]\n\t\t)\n\t\tlet g3 = DSFSparkline.Fill.Gradient(\n\t\t\tcolors: [\n\t\t\t\tCGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 1.0),\n\t\t\t\tCGColor(srgbRed: 0.996, green: 0.459, blue: 0.000, alpha: 1.0),\n\t\t\t]\n\t\t)\n\n\t\tlet i1 = namedImage(\"arrow.right\")\n\t\tlet i2 = namedImage(\"arrow.up\")\n\t\tlet i3 = namedImage(\"arrow.triangle.swap\")\n\t\tlet i4 = namedImage(\"phone.arrow.right\")\n\n\t\tScrollView([.horizontal, .vertical]) {\n\t\t\tVStack {\n\t\t\t\tHStack(alignment: .center) {\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0, trackWidth: 20)\n\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.4, trackWidth: 20)\n\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.8, trackWidth: 20)\n\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.2, trackWidth: 20)\n\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.6, trackWidth: 20)\n\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 2.0, trackWidth: 20)\n\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t}\n\n\t\t\t\tForEach(0 ..< 2) { which in\n\n\t\t\t\t\tHStack(alignment: .center) {\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0, fillStyle: ge, trackWidth: 25, trackIcon: which == 1 ? i1 : nil)\n\t\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.4, fillStyle: ge, trackWidth: 25, trackIcon: which == 1 ? i1 : nil)\n\t\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.8, fillStyle: ge, trackWidth: 25, trackIcon: which == 1 ? i1 : nil)\n\t\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.2, fillStyle: ge, trackWidth: 25, trackIcon: which == 1 ? i1 : nil)\n\t\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.6, fillStyle: ge, trackWidth: 25, trackIcon: which == 1 ? i1 : nil)\n\t\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 2.0, fillStyle: ge, trackWidth: 25, trackIcon: which == 1 ? i1 : nil)\n\t\t\t\t\t\t\t.frame(width: 100, height: 100)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tHStack(alignment: .center) {\n\t\t\t\t\tZStack {\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0, fillStyle: g, trackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)              , trackIcon: i1)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0, fillStyle: g1, padding: 12, trackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1), trackIcon: i2)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0, fillStyle: g2, padding: 24, trackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1), trackIcon: i3)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0, fillStyle: g3, padding: 36, trackColor: CGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 0.1), trackIcon: i4)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 150, height: 150)\n\t\t\t\t\tZStack {\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.4, fillStyle: g, trackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)              , trackIcon: i1)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.3, fillStyle: g1, padding: 12, trackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1), trackIcon: i2)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.2, fillStyle: g2, padding: 24, trackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1), trackIcon: i3)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.1, fillStyle: g3, padding: 36, trackColor: CGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 0.1), trackIcon: i4)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 150, height: 150)\n\t\t\t\t\tZStack {\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.7, fillStyle: g, trackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)              , trackIcon: i1)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.6, fillStyle: g1, padding: 12, trackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1), trackIcon: i2)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.5, fillStyle: g2, padding: 24, trackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1), trackIcon: i3)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 0.4, fillStyle: g3, padding: 36, trackColor: CGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 0.1), trackIcon: i4)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 150, height: 150)\n\t\t\t\t\tZStack {\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.4, fillStyle: g, trackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)              , trackIcon: i1)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.3, fillStyle: g1, padding: 12, trackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1), trackIcon: i2)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.2, fillStyle: g2, padding: 24, trackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1), trackIcon: i3)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.1, fillStyle: g3, padding: 36, trackColor: CGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 0.1), trackIcon: i4)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 150, height: 150)\n\t\t\t\t\tZStack {\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.9, fillStyle: g, trackColor: CGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)              , trackIcon: i1)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.8, fillStyle: g1, padding: 12, trackColor: CGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1), trackIcon: i2)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.7, fillStyle: g2, padding: 24, trackColor: CGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1), trackIcon: i3)\n\t\t\t\t\t\tDSFSparklineCircularProgressView.SwiftUI(value: 1.6, fillStyle: g3, padding: 36, trackColor: CGColor(srgbRed: 0.996, green: 0.759, blue: 0.300, alpha: 0.1), trackIcon: i4)\n\t\t\t\t\t}\n\t\t\t\t\t.frame(width: 150, height: 150)\n\t\t\t\t}\n\t\t\t}\n\t\t\t.padding()\n\t\t}\n\t}\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineCircularProgressView.swift",
    "content": "//\n//  DSFSparklineCircularProgressView.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n@objc public class DSFSparklineCircularProgressView: DSFSparklineSurfaceView {\n\n\t@objc public dynamic var value: CGFloat = 0.0 {\n\t\tdidSet {\n\t\t\tself.overlay.value = self.value\n\t\t}\n\t}\n\n\t@objc public dynamic var trackWidth: CGFloat = 10 {\n\t\tdidSet {\n\t\t\tself.overlay.trackWidth = self.trackWidth\n\t\t}\n\t}\n\n\t/// The padding (inset) for drawing the ring\n\t@objc public dynamic var padding: CGFloat = 0.0 {\n\t\tdidSet {\n\t\t\tself.overlay.padding = self.padding\n\t\t}\n\t}\n\n\t/// The stroke color for the pie chart\n\t@objc public dynamic var trackColor: DSFColor? {\n\t\tdidSet {\n\t\t\tif let t = self.trackColor?.cgColor {\n\t\t\t\tself.overlay.trackColor = t\n\t\t\t}\n\t\t}\n\t}\n\n\t/// The stroke color for the pie chart\n\t@objc public dynamic var progressColor: DSFColor? {\n\t\tdidSet {\n\t\t\tif let t = self.progressColor?.cgColor {\n\t\t\t\tself.overlay.fillStyle = DSFSparkline.Fill.Color(t)\n\t\t\t}\n\t\t}\n\t}\n\n\t/// The track's icon\n\t@objc public dynamic var trackIcon: CGImage? {\n\t\tdidSet {\n\t\t\tself.overlay.icon = self.trackIcon\n\t\t}\n\t}\n\n\t/// The fill color for the value ring\n\t@objc public var fillStyle: DSFSparklineFillable = DSFSparkline.Fill.Color.white {\n\t\tdidSet {\n\t\t\tself.overlay.fillStyle = fillStyle\n\t\t}\n\t}\n\n\t// MARK: - Initializers\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tprivate let overlay = DSFSparklineOverlay.CircularProgress()\n}\n\nextension DSFSparklineCircularProgressView {\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.setNeedsDisplay()\n\t}\n}\n\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineDataBarGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineDataBarGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineDataBarGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.StaticDataSource\n\t\t/// Maximum total value.  If -1, this value is i\n\t\tlet maximumTotalValue: CGFloat\n\t\t/// The 'undrawn' color for the graph\n\t\tlet unsetColor: DSFColor?\n\n\t\t/// Palette to use when coloring the chart\n\t\tlet palette: DSFSparkline.Palette\n\n\t\t/// Stroke Color\n\t\tlet strokeColor: DSFColor?\n\n\t\t/// Stroke Width\n\t\tlet lineWidth: CGFloat\n\n\t\t/// The animation style to apply when datasource changes\n\t\tlet animationStyle: DSFSparkline.AnimationStyle?\n\n\t\t/// Create a databar graph\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - maximumTotalValue: The maximum _total_ value. If the datasource values total is greater than this value, it clips the display\n\t\t///   - palette: The color palette to use when drawing the graph\n\t\t///   - unsetColor: (optional) the color to use when drawing the background (useful when the maximumValue is also set)\n\t\t///   - strokeColor: The color to draw the separator lines between data points\n\t\t///   - lineWidth: The width of the separator lines\n\t\t///   - animationStyle: The animation style, or nil for no animation\n\t\tpublic init(\n\t\t\tdataSource: DSFSparkline.StaticDataSource,\n\t\t\tmaximumTotalValue: CGFloat = -1,\n\t\t\tpalette: DSFSparkline.Palette = .shared,\n\t\t\tunsetColor: DSFColor? = nil,\n\t\t\tstrokeColor: DSFColor? = nil,\n\t\t\tlineWidth: CGFloat = 1.0,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil\n\t\t) {\n\t\t\tself.dataSource = dataSource\n\t\t\tself.maximumTotalValue = maximumTotalValue\n\t\t\tself.unsetColor = unsetColor\n\t\t\tself.strokeColor = strokeColor\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.palette = palette\n\t\t\tself.animationStyle = animationStyle\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineDataBarGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineDataBarGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineDataBarGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineDataBarGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineDataBarGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tfunc makeDataBarGraph(_: Context) -> DSFSparklineDataBarGraphView {\n\t\tlet view = DSFSparklineDataBarGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.strokeColor = self.strokeColor\n\t\tview.unsetColor = self.unsetColor\n\t\tview.lineWidth = self.lineWidth\n\t\tview.palette = self.palette\n\n\t\tview.animationStyle = self.animationStyle\n\n\t\tview.dataSource = self.dataSource\n\t\tview.maximumTotalValue = self.maximumTotalValue\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineDataBarGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineDataBarGraphView {\n\t\treturn self.makeDataBarGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineDataBarGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineDataBarGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineDataBarGraphView {\n\t\treturn self.makeDataBarGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineDataBarGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineDataBarGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineDataBarGraphView) {\n\t\tUpdateIfNotEqual(result: &view.strokeColor, val: self.strokeColor)\n\t\tUpdateIfNotEqual(result: &view.unsetColor, val: self.unsetColor)\n\t\t\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\n\t\tUpdateIfNotEqual(result: &view.palette, val: self.palette)\n\n\t\tUpdateIfNotEqual(result: &view.animationStyle, val: self.animationStyle)\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\n\t\tUpdateIfNotEqual(result: &view.maximumTotalValue, val: self.maximumTotalValue)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineDataBarGraphView.swift",
    "content": "//\n//  DSFSparklineDataBarGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline that draws a simple pie chart\npublic class DSFSparklineDataBarGraphView: DSFSparklineSurfaceView {\n\n\tlet databarOverlay = DSFSparklineOverlay.DataBar()\n\n\t/// The data to be displayed in the data bar.\n\t///\n\t/// The values become a percentage of the total value stored within the\n\t/// dataStore, and as such each value ends up being drawn as a fraction of the total.\n\t/// So for example, if you want the pie chart to represent the number of red cars vs. number of\n\t/// blue cars, you just set the values directly.\n\t@objc public var dataSource = DSFSparkline.StaticDataSource() {\n\t\tdidSet {\n\t\t\tself.databarOverlay.dataSource = self.dataSource\n\t\t}\n\t}\n\n\t// MARK: - Maximum Total\n\n\t/// The maximum _total_ value. If the datasource values total is greater than this value, it clips the display\n\t@objc public dynamic var maximumTotalValue: CGFloat = -1 {\n\t\tdidSet {\n\t\t\tself.databarOverlay.maximumTotalValue = self.maximumTotalValue\n\t\t}\n\t}\n\n\t// MARK: Optional background color\n\n\t/// The 'undrawn' color for the graph\n\t@objc public dynamic var unsetColor: DSFColor? {\n\t\tdidSet {\n\t\t\tself.databarOverlay.unsetColor = self.unsetColor?.cgColor\n\t\t}\n\t}\n\n\t// MARK: - Stroke\n\n\t/// The stroke color for the pie chart\n\t@objc public dynamic var strokeColor: DSFColor? {\n\t\tdidSet {\n\t\t\tself.databarOverlay.strokeColor = self.strokeColor?.cgColor\n\t\t}\n\t}\n\n\t/// The width of the stroke line\n\t@objc public dynamic var lineWidth: CGFloat = 0.5 {\n\t\tdidSet {\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The animation style to apply when datasource changes, or nil for no animation\n\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil {\n\t\tdidSet {\n\t\t\tself.databarOverlay.animationStyle = self.animationStyle\n\t\t}\n\t}\n\n\t/// The palette to use when drawing the pie chart\n\t@objc public var palette = DSFSparkline.Palette.shared {\n\t\tdidSet {\n\t\t\tself.databarOverlay.palette = self.palette\n\t\t}\n\t}\n\n\t// MARK: - Initializers\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.databarOverlay)\n\t\tself.databarOverlay.setNeedsDisplay()\n\n\t\tself.databarOverlay.unsetColor = self.unsetColor?.cgColor\n\t\tself.databarOverlay.strokeColor = self.strokeColor?.cgColor\n\t\tself.databarOverlay.lineWidth = self.lineWidth\n\t\tself.databarOverlay.maximumTotalValue = self.maximumTotalValue\n\n\t\tself.databarOverlay.animationStyle = self.animationStyle\n\n\t\tself.databarOverlay.dataSource = self.dataSource\n\t}\n\n\t// MARK: - Privates\n\n\tinternal var animator = ArbitraryAnimator()\n\tinternal var fractionComplete: CGFloat = 0\n\tinternal var total: CGFloat = 0.0\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineDotGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineDotGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 7/12/20.\n//  Copyright © 2020 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineDotGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\t\t/// The primary color for the sparkline\n\t\tlet graphColor: DSFColor\n\n\t\t/// Are the values drawn from the top down?\n\t\tlet upsideDown: Bool\n\t\t/// The number of vertical buckets to break the input data up into\n\t\tlet verticalDotCount: UInt\n\t\t/// The secondary color for the sparkline\n\t\tlet unsetGraphColor: DSFColor\n\n\t\t/// Create a sparkline graph that displays dots (like the CPU history graph in Activity Monitor)\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - graphColor: The color of the dots that are set\n\t\t///   - unsetGraphColor: The color of the dots that are not set\n\t\t///   - verticalDotCount: The number of dots vertically\n\t\t///   - upsideDown: Draw the graph upside down\n\t\tpublic init(dataSource: DSFSparkline.DataSource,\n\t\t\t\t\t\tgraphColor: DSFColor,\n\t\t\t\t\t\tunsetGraphColor: DSFColor = DSFColor.clear,\n\t\t\t\t\t\tverticalDotCount: UInt = 10,\n\t\t\t\t\t\tupsideDown: Bool = false)\n\t\t{\n\t\t\tself.dataSource = dataSource\n\t\t\tself.graphColor = graphColor\n\t\t\tself.verticalDotCount = verticalDotCount\n\t\t\tself.upsideDown = upsideDown\n\t\t\tself.unsetGraphColor = unsetGraphColor\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineDotGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineDotGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineDotGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineDotGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineDotGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tprivate func makeDotGraph(_: Context) -> DSFSparklineDotGraphView {\n\t\tlet view = DSFSparklineDotGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.dataSource = self.dataSource\n\n\t\tview.graphColor = self.graphColor\n\t\tview.verticalDotCount = self.verticalDotCount\n\t\tview.unsetGraphColor = self.unsetGraphColor\n\t\tview.upsideDown = self.upsideDown\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 99.0, *)\npublic extension DSFSparklineDotGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineDotGraphView {\n\t\treturn self.makeDotGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineDotGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineDotGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineDotGraphView {\n\t\treturn self.makeDotGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineDotGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineDotGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineDotGraphView) {\n\t\tUpdateIfNotEqual(result: &view.graphColor, val: self.graphColor)\n\t\tUpdateIfNotEqual(result: &view.upsideDown, val: self.upsideDown)\n\t\tUpdateIfNotEqual(result: &view.verticalDotCount, val: self.verticalDotCount)\n\t\tUpdateIfNotEqual(result: &view.unsetGraphColor, val: self.unsetGraphColor)\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineDotGraphView.swift",
    "content": "//\n//  DSFSparklineDataSource.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 16/1/20.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline graph that displays dots (like the CPU history graph in Activity Monitor)\n@objc public class DSFSparklineDotGraphView: DSFSparklineDataSourceView {\n\n\tlet overlay = DSFSparklineOverlay.Dot()\n\n\t/// Are the values drawn from the top down?\n\t@objc public dynamic var upsideDown: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.upsideDown = self.upsideDown\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The number of vertical buckets to break the input data up into\n\t@objc public dynamic var verticalDotCount: UInt = 10 {\n\t\tdidSet {\n\t\t\tself.overlay.verticalDotCount = self.verticalDotCount\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The secondary color for the sparkline\n\t#if os(macOS)\n\t@objc public dynamic var unsetGraphColor: NSColor = NSColor.clear {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var unsetGraphColor: UIColor = UIColor.clear {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#endif\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.setNeedsDisplay()\n\t}\n\n\toverride func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\tself.overlay.upsideDown = self.upsideDown\n\t\tself.overlay.verticalDotCount = self.verticalDotCount\n\n\t\tself.overlay.onColor = self.graphColor.cgColor\n\t\tself.overlay.offColor = self.unsetGraphColor.cgColor\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineLineGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineLineGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 7/12/20.\n//  Copyright © 2020 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineLineGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\t\t/// The primary color for the sparkline\n\t\tlet graphColor: DSFColor\n\n\t\t/// Draw a dotted line at the zero point on the y-axis\n\t\tlet showZeroLine: Bool\n\t\t/// The drawing definition for the zero line point\n\t\tlet zeroLineDefinition: DSFSparkline.ZeroLineDefinition\n\n\t\t/// The width for the line drawn on the graph\n\t\tlet lineWidth: CGFloat\n\t\t/// The number of vertical buckets to break the input data up into\n\t\tlet interpolated: Bool\n\t\t/// The secondary color for the sparkline\n\t\tlet lineShading: Bool\n\t\t/// Draw a shadow under the line\n\t\tlet shadowed: Bool\n\n\t\t/// Should the line graph be centered around the zero-line?\n\t\tlet centeredAtZeroLine: Bool\n\t\t/// The color used to draw values lower than the zero-line, or nil for the same as the graph color\n\t\tlet lowerGraphColor: DSFColor?\n\n\t\t/// Highlight y-ranges within the graph\n\t\tlet highlightDefinitions: [DSFSparkline.HighlightRangeDefinition]\n\n\t\t/// The size of the markers to draw. If the markerSize is less than 0, markers will not draw\n\t\tlet markerSize: CGFloat\n\n\t\tlet markerDrawingBlock: DSFSparklineOverlay.Line.MarkerDrawingBlock?\n\n\t\t/// The grid lines definition\n\t\tlet gridLines: DSFSparkline.GridLinesDefinition?\n\n\t\t/// Primary fill\n\t\tlet primaryFill: DSFSparklineFillable?\n\t\t/// Secondary fill\n\t\tlet secondaryFill: DSFSparklineFillable?\n\n\t\t/// Create a sparkline graph that displays dots (like the CPU history graph in Activity Monitor)\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - graphColor: The color of the dots that are set\n\t\t///   - lineWidth: The width of the line\n\t\t///   - interpolated: If true, curves the line through the graph points.\n\t\t///   - lineShading: If true, shades the underside of the drawn line.\n\t\t///   - shadowed: If true, draws a shadow under the line part of the graph.\n\t\t///   - showZeroLine: Show or hide a 'zero line' horizontal line\n\t\t///   - zeroLineDefinition: the settings for drawing the zero line\n\t\t///   - centeredAtZeroLine: Should the line graph be centered around the zero-line?\n\t\t///   - lowerGraphColor: The color used to draw values lower than the zero-line, or nil for the same as the graph color\n\t\t///   - highlightDefinitions: The style of the y-range highlight\n\t\t///   - markerSize: The size of the markers to draw. If the markerSize is less than 0, markers will not draw\n\t\t///   - markerDrawingBlock: (optional) function to draw the markers\n\t\t///   - gridLines: The grid lines to draw on the graph\n\t\tpublic init(\n\t\t\tdataSource: DSFSparkline.DataSource,\n\t\t\tgraphColor: DSFColor,\n\t\t\tlineWidth: CGFloat = 1.5,\n\t\t\tinterpolated: Bool = false,\n\t\t\tlineShading: Bool = true,\n\t\t\tshadowed: Bool = false,\n\t\t\tshowZeroLine: Bool = false,\n\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition = .shared,\n\t\t\tcenteredAtZeroLine: Bool = false,\n\t\t\tlowerGraphColor: DSFColor? = nil,\n\t\t\thighlightDefinitions: [DSFSparkline.HighlightRangeDefinition] = [],\n\t\t\tmarkerSize: CGFloat = -1,\n\t\t\tmarkerDrawingBlock: DSFSparklineOverlay.Line.MarkerDrawingBlock? = nil,\n\t\t\tgridLines: DSFSparkline.GridLinesDefinition? = nil,\n\t\t\tprimaryFill: (any DSFSparklineFillable)? = nil,\n\t\t\tsecondaryFill: (any DSFSparklineFillable)? = nil\n\t\t) {\n\t\t\tself.dataSource = dataSource\n\t\t\tself.graphColor = graphColor\n\n\t\t\tself.showZeroLine = showZeroLine\n\t\t\tself.zeroLineDefinition = zeroLineDefinition\n\n\t\t\tself.centeredAtZeroLine = centeredAtZeroLine\n\t\t\tself.lowerGraphColor = lowerGraphColor\n\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.interpolated = interpolated\n\t\t\tself.lineShading = lineShading\n\t\t\tself.shadowed = shadowed\n\n\t\t\tself.highlightDefinitions = highlightDefinitions\n\n\t\t\tself.markerSize = markerSize\n\t\t\tself.markerDrawingBlock = markerDrawingBlock\n\n\t\t\tself.gridLines = gridLines\n\n\t\t\tself.primaryFill = primaryFill\n\t\t\tself.secondaryFill = secondaryFill\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineLineGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineLineGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineLineGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineLineGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineLineGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tfunc makeLineGraph(_: Context) -> DSFSparklineLineGraphView {\n\t\tlet view = DSFSparklineLineGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.dataSource = self.dataSource\n\t\tview.graphColor = self.graphColor\n\n\t\tview.lineWidth = self.lineWidth\n\t\tview.interpolated = self.interpolated\n\t\tview.lineShading = self.lineShading\n\t\tview.shadowed = self.shadowed\n\n\t\tview.zeroLineVisible = self.showZeroLine\n\t\tview.setZeroLineDefinition(self.zeroLineDefinition)\n\n\t\tview.centeredAtZeroLine = self.centeredAtZeroLine\n\t\tview.lowerGraphColor = self.lowerGraphColor\n\n\t\tif self.highlightDefinitions.count > 0 {\n\t\t\tview.highlightRangeVisible = true\n\t\t\tview.highlightRangeDefinition = self.highlightDefinitions\n\t\t}\n\n\t\tif let gridLines = self.gridLines {\n\t\t\tview.setGridLineDefinition(gridLines)\n\t\t}\n\t\telse {\n\t\t\tview.gridLinesVisible = false\n\t\t}\n\n\t\tview.markerSize = self.markerSize\n\n\t\tif let pf = self.primaryFill {\n\t\t\tview.primaryFill = pf\n\t\t}\n\t\tif let sf = self.secondaryFill {\n\t\t\tview.secondaryFill = sf\n\t\t}\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineLineGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineLineGraphView {\n\t\treturn self.makeLineGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineLineGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineLineGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineLineGraphView {\n\t\treturn self.makeLineGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineLineGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineLineGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineLineGraphView) {\n\n\t\tUpdateIfNotEqual(result: &view.graphColor, val: self.graphColor)\n\n\t\tUpdateIfNotEqual(result: &view.zeroLineVisible, val: self.showZeroLine)\n\t\tview.setZeroLineDefinition(self.zeroLineDefinition)\n\n\t\tUpdateIfNotEqual(result: &view.centeredAtZeroLine, val: self.centeredAtZeroLine)\n\t\tUpdateIfNotEqual(result: &view.lowerGraphColor, val: self.lowerGraphColor)\n\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\t\tUpdateIfNotEqual(result: &view.interpolated, val: self.interpolated)\n\t\tUpdateIfNotEqual(result: &view.lineShading, val: self.lineShading)\n\t\tUpdateIfNotEqual(result: &view.shadowed, val: self.shadowed)\n\t\tUpdateIfNotEqual(result: &view.markerSize, val: self.markerSize)\n\n\t\tview.markerDrawingBlock = self.markerDrawingBlock\n\n\t\tif self.highlightDefinitions.count > 0 {\n\t\t\tview.highlightRangeVisible = true\n\t\t\tview.highlightRangeDefinition = self.highlightDefinitions\n\t\t}\n\t\telse {\n\t\t\tview.highlightRangeVisible = false\n\t\t\tview.highlightRangeDefinition = []\n\t\t}\n\n\t\tif let pf = self.primaryFill {\n\t\t\tview.primaryFill = pf\n\t\t}\n\t\tif let sf = self.secondaryFill {\n\t\t\tview.secondaryFill = sf\n\t\t}\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineLineGraphView.swift",
    "content": "//\n//  DSFSparklineLineGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if os(macOS)\nimport Cocoa\n#else\nimport UIKit\n#endif\n\n/// A sparkline that draws a line graph\n@objc public class DSFSparklineLineGraphView: DSFSparklineZeroLineGraphView {\n\n\tlet overlay = DSFSparklineOverlay.Line()\n\n\t/// The width for the line drawn on the graph\n\t@objc public dynamic var lineWidth: CGFloat = 1.5 {\n\t\tdidSet {\n\t\t\tself.overlay.strokeWidth = self.lineWidth\n\t\t}\n\t}\n\t\n\t/// Interpolate a curve between the points\n\t@objc public dynamic var interpolated: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.interpolated = self.interpolated\n\t\t}\n\t}\n\t\n\t/// Shade the area under the line\n\t@objc public dynamic var lineShading: Bool = true {\n\t\tdidSet {\n\t\t\tif lineShading == true {\n\t\t\t\tself.overlay.primaryFill = DSFSparkline.Fill.Color(self.graphColor.withAlphaComponent(0.4).cgColor)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.overlay.primaryFill = nil\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Draw a shadow under the line\n\t@objc public dynamic var shadowed: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.shadow = self.shadowed ? NSShadow.sparklineDefault : nil\n\t\t}\n\t}\n\n\t/// The size of the markers to draw. If the markerSize is less than 0, markers will not draw\n\t@objc public dynamic var markerSize: CGFloat = -1 {\n\t\tdidSet {\n\t\t\tself.overlay.markerSize = self.markerSize\n\t\t}\n\t}\n\n\t/// An optional drawing function for custom drawing markers. When nil, uses the standard circle for each marker\n\t///\n\t/// The `markerSize` value is used to determine the frameSize of each marker.\n\t/// If `markerSize` is less than 1, this block will not be called.\n\t///\n\t/// Note that this function is called very frequently so make sure its performant!\n\t@objc public var markerDrawingBlock: DSFSparklineOverlay.Line.MarkerDrawingBlock? = nil {\n\t\tdidSet {\n\t\t\tself.overlay.markerDrawingBlock = self.markerDrawingBlock\n\t\t}\n\t}\n\n\t/// Should the graph be centered at the zero line?\n\t@objc public dynamic var centeredAtZeroLine: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.centeredAtZeroLine = self.centeredAtZeroLine\n\t\t}\n\t}\n\n\t/// The primary fill (for the area of the graph ABOVE the zero line)\n\t@objc public dynamic var primaryFill: (any DSFSparklineFillable)? {\n\t\tget { self.overlay.primaryFill }\n\t\tset { self.overlay.primaryFill = newValue }\n\t}\n\n\t/// The secondary fill (for the area of the graph UNDER the zero line)\n\t@objc public dynamic var secondaryFill: (any DSFSparklineFillable)? {\n\t\tget { self.overlay.secondaryFill }\n\t\tset { self.overlay.secondaryFill = newValue }\n\t}\n\n\t// Optional gradient colors\n\tinternal var gradient: CGGradient?\n\tinternal var lowerGradient: CGGradient?\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.colorDidChange()\n\t}\n\n\toverride func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\tself.overlay.strokeWidth = self.lineWidth\n\t\tself.overlay.interpolated = self.interpolated\n\t\tself.overlay.shadow = self.shadowed ? NSShadow.sparklineDefault : nil\n\t\tself.overlay.markerSize = self.markerSize\n\n\t\tself.overlay.centeredAtZeroLine = self.centeredAtZeroLine\n\n\t\tself.overlay.primaryStrokeColor = self.graphColor.cgColor\n\t\tself.overlay.secondaryStrokeColor = self.lowerColor.cgColor\n\n\t\t// Backwards compatibility\n\t\tlet color = self.graphColor\n\t\tlet fill = DSFSparkline.Fill.Gradient(colors: [\n\t\t\tcolor.withAlphaComponent(0.4).cgColor,\n\t\t\tcolor.withAlphaComponent(0.2).cgColor\n\t\t])\n\t\tself.overlay.primaryFill = fill\n\n\t\tif let lowerColor = self.lowerGraphColor {\n\t\t\tlet fill = DSFSparkline.Fill.Gradient(colors: [\n\t\t\t\tlowerColor.withAlphaComponent(0.4).cgColor,\n\t\t\t\tlowerColor.withAlphaComponent(0.2).cgColor\n\t\t\t])\n\t\t\tself.overlay.secondaryFill = fill\n\t\t}\n\t\telse {\n\t\t\t// Fallback - if secondary fill not defined the compatibility view is to use the primary fill view\n\t\t\tself.overlay.secondaryFill = self.overlay.primaryFill\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklinePercentBarGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklinePercentBarGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklinePercentBarGraphView {\n\n\t/// The SwiftUI percent bar graph\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet style: DSFSparkline.PercentBar.Style\n\t\t/// Palette to use when coloring the chart\n\t\tlet value: Double\n\t\t/// The animation style to apply to changes\n\t\tlet animationStyle: DSFSparkline.AnimationStyle?\n\n\t\t/// Create a sparkline graph that displays dots (like the CPU history graph in Activity Monitor)\n\t\t/// - Parameters:\n\t\tpublic init(\n\t\t\tstyle: DSFSparkline.PercentBar.Style = DSFSparkline.PercentBar.Style(),\n\t\t\tvalue: Double,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil\n\t\t) {\n\t\t\tself.style = style\n\t\t\tself.value = value\n\t\t\tself.animationStyle = animationStyle\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklinePercentBarGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklinePercentBarGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklinePercentBarGraphView\n\t#endif\n\t\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklinePercentBarGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklinePercentBarGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\t\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\t\n\tfunc makePercentBar(_: Context) -> DSFSparklinePercentBarGraphView {\n\t\tlet view = DSFSparklinePercentBarGraphView(frame: .zero)\n\t\tview.displayStyle = self.style\n\t\tview.value = CGFloat(self.value)\n\t\tview.animationStyle = self.animationStyle\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklinePercentBarGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklinePercentBarGraphView {\n\t\treturn self.makePercentBar(context)\n\t}\n\t\n\tfunc updateUIView(_ view: DSFSparklinePercentBarGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklinePercentBarGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklinePercentBarGraphView {\n\t\treturn self.makePercentBar(context)\n\t}\n\t\n\tfunc updateNSView(_ view: DSFSparklinePercentBarGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklinePercentBarGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklinePercentBarGraphView) {\n\t\tview.displayStyle = self.style\n\t\tview.value = CGFloat(self.value)\n\t\tview.animationStyle = self.animationStyle\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklinePercentBarGraphView.swift",
    "content": "//\n//  DSFSparklinePercentBarGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 16/3/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline that draws a percent bar\n@objc public class DSFSparklinePercentBarGraphView: DSFSparklineSurfaceView {\n\n\t// MARK: - Value\n\n\t/// The initial value to display in the percent bar\n\t@objc public dynamic var value: CGFloat = 0.2 {\n\t\tdidSet {\n\t\t\tself.overlay.value = self.value\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The style for presenting the percent bar\n\t@objc public var displayStyle = DSFSparkline.PercentBar.Style() {\n\t\tdidSet {\n\t\t\tself.overlay.displayStyle = displayStyle\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The corner radius for the bar\n\t@objc public dynamic var cornerRadius: CGFloat = 5 {\n\t\tdidSet {\n\t\t\tself.displayStyle.cornerRadius = self.cornerRadius\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// Should the control display a text label for the percent bar\n\t@objc public dynamic var showLabel: Bool = true {\n\t\tdidSet {\n\t\t\tself.displayStyle.showLabel = self.showLabel\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The background of the bar color for the percent bar chart\n\t@objc public dynamic var underBarColor: DSFColor = .clear {\n\t\tdidSet {\n\t\t\tself.displayStyle.underBarColor = self.underBarColor.cgColor\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The color for text displayed on the background\n\t@objc public dynamic var underBarTextColor: DSFColor = .white {\n\t\tdidSet {\n\t\t\tself.displayStyle.underBarTextColor = self.underBarTextColor.cgColor\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t// MARK: - Bar Color\n\n\t/// The bar color for the percent bar chart\n\t@objc public dynamic var barColor: DSFColor = .black {\n\t\tdidSet {\n\t\t\tself.displayStyle.barColor = self.barColor.cgColor\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t// MARK: - Background Color\n\n\t/// The color for text displayed on the bar\n\t@objc public dynamic var barTextColor: DSFColor = .white {\n\t\tdidSet {\n\t\t\tself.displayStyle.barTextColor = self.barTextColor.cgColor\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t// MARK: - Font\n\n\t/// The name of the font to use when drawing the percent bar label\n\t@objc public dynamic var fontName: String? = nil {\n\t\tdidSet {\n\t\t\tif let f = fontName,\n\t\t\t\tlet font = DSFFont(name: f, size: self.fontSize) {\n\t\t\t\tself.displayStyle.font = font\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.displayStyle.font = DSFFont.systemFont(ofSize: self.fontSize)\n\t\t\t}\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The size (in points) of the font to use when drawing the percent bar label\n\t@objc public dynamic var fontSize: CGFloat = 12 {\n\t\tdidSet {\n\t\t\tlet font = self.displayStyle.font\n\n\t\t\t#if os(macOS)\n\t\t\tif let newFont = DSFFont(descriptor: font.fontDescriptor, size: fontSize) {\n\t\t\t\tself.displayStyle.font = newFont\n\t\t\t}\n\t\t\t#else\n\t\t\tself.displayStyle.font = DSFFont(descriptor: font.fontDescriptor, size: fontSize)\n\t\t\t#endif\n\n\t\t\tself.overlay.displayStyle = self.displayStyle\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The left inset for the bar\n\t@objc public dynamic var leftInset: CGFloat = 0 {\n\t\tdidSet {\n\t\t\tself.displayStyle.barEdgeInsets.left = self.leftInset\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The top inset for the bar\n\t@objc public dynamic var topInset: CGFloat = 0 {\n\t\tdidSet {\n\t\t\tself.displayStyle.barEdgeInsets.top = self.topInset\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The right inset for the bar\n\t@objc public dynamic var rightInset: CGFloat = 0 {\n\t\tdidSet {\n\t\t\tself.displayStyle.barEdgeInsets.right = self.rightInset\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t/// The bottom inset for the bar\n\t@objc public dynamic var bottomInset: CGFloat = 0 {\n\t\tdidSet {\n\t\t\tself.displayStyle.barEdgeInsets.bottom = self.bottomInset\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t// MARK: - Animation\n\n\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil {\n\t\tdidSet {\n\t\t\tself.overlay.animationStyle = self.animationStyle\n\t\t\tself.displayUpdate()\n\t\t}\n\t}\n\n\t// MARK: - Control\n\n\t/// Initializer\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\t/// Initializer\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\t// The overlay\n\tprivate let overlay = DSFSparklineOverlay.PercentBar(value: 0)\n}\n\nprivate extension DSFSparklinePercentBarGraphView {\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.setNeedsDisplay()\n\n\t\tself.displayStyle.underBarColor = self.underBarColor.cgColor\n\t\tself.displayStyle.underBarTextColor = self.underBarTextColor.cgColor\n\t\tself.displayStyle.barColor = self.barColor.cgColor\n\t\tself.displayStyle.barTextColor = self.barTextColor.cgColor\n\n\t\tif let f = fontName,\n\t\t\tlet font = DSFFont(name: f, size: self.fontSize) {\n\t\t\tself.displayStyle.font = font\n\t\t}\n\t\telse {\n\t\t\tself.displayStyle.font = DSFFont.systemFont(ofSize: self.fontSize)\n\t\t}\n\n\t\tself.overlay.displayStyle = self.displayStyle\n\t\tself.overlay.value = self.value\n\n\t\tself.overlay.setNeedsDisplay()\n\n\t\tself.updateDisplay()\n\t}\n\n\tfunc displayUpdate() {\n\t\tself.overlay.displayStyle = self.displayStyle\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklinePieGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklinePieGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklinePieGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.StaticDataSource\n\t\t/// Palette to use when coloring the chart\n\t\tlet palette: DSFSparkline.Palette\n\n\t\t/// Stroke Color\n\t\tlet strokeColor: DSFColor?\n\n\t\t/// Stroke Width\n\t\tlet lineWidth: CGFloat\n\n\t\t/// Should we animate the dataSource changes\n\t\tlet animationStyle: DSFSparkline.AnimationStyle?\n\n\t\t/// Create a sparkline graph that displays dots (like the CPU history graph in Activity Monitor)\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\tpublic init(\n\t\t\tdataSource: DSFSparkline.StaticDataSource,\n\t\t\tpalette: DSFSparkline.Palette = .shared,\n\t\t\tstrokeColor: DSFColor? = nil,\n\t\t\tlineWidth: CGFloat = 1.0,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil\n\t\t) {\n\t\t\tself.dataSource = dataSource\n\t\t\tself.strokeColor = strokeColor\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.palette = palette\n\t\t\tself.animationStyle = animationStyle\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklinePieGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklinePieGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklinePieGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklinePieGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklinePieGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tfunc makePieGraph(_: Context) -> DSFSparklinePieGraphView {\n\t\tlet view = DSFSparklinePieGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.strokeColor = self.strokeColor\n\t\tview.lineWidth = self.lineWidth\n\t\tview.palette = self.palette\n\n\t\tview.animationStyle = self.animationStyle\n\n\t\tview.dataSource = self.dataSource\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklinePieGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklinePieGraphView {\n\t\treturn self.makePieGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklinePieGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklinePieGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklinePieGraphView {\n\t\treturn self.makePieGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklinePieGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklinePieGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklinePieGraphView) {\n\t\tUpdateIfNotEqual(result: &view.strokeColor, val: self.strokeColor)\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\t\tUpdateIfNotEqual(result: &view.palette, val: self.palette)\n\n\t\tUpdateIfNotEqual(result: &view.animationStyle, val: self.animationStyle)\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklinePieGraphView.swift",
    "content": "//\n//  DSFSparklinePieGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline that draws a simple pie chart\n@objc public class DSFSparklinePieGraphView: DSFSparklineSurfaceView {\n\n\tlet pieOverlay = DSFSparklineOverlay.Pie()\n\n\t/// The data to be displayed in the pie.\n\t///\n\t/// The values become a percentage of the total value stored within the\n\t/// dataStore, and as such each value ends up being drawn as a fraction of the total.\n\t/// So for example, if you want the pie chart to represent the number of red cars vs. number of\n\t/// blue cars, you just set the values directly.\n\t@objc public var dataSource = DSFSparkline.StaticDataSource() {\n\t\tdidSet {\n\t\t\tself.pieOverlay.dataSource = self.dataSource\n\t\t}\n\t}\n\n\t/// The stroke color for the pie chart\n\t@objc public dynamic var strokeColor: DSFColor? {\n\t\tdidSet {\n\t\t\tself.pieOverlay.strokeColor = self.strokeColor?.cgColor\n\t\t}\n\t}\n\n\t/// The width of the stroke line\n\t@objc public dynamic var lineWidth: CGFloat = 0.5 {\n\t\tdidSet {\n\t\t\tself.pieOverlay.lineWidth = self.lineWidth\n\t\t}\n\t}\n\n\t/// Should the pie chart animate in?\n\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil {\n\t\tdidSet {\n\t\t\tself.pieOverlay.animationStyle = self.animationStyle\n\t\t}\n\t}\n\n\t/// The palette to use when drawing the pie chart\n\t@objc public var palette = DSFSparkline.Palette.shared {\n\t\tdidSet {\n\t\t\tself.pieOverlay.palette = self.palette\n\t\t}\n\t}\n\n\t// MARK: - Initializers\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.pieOverlay)\n\t\tself.pieOverlay.setNeedsDisplay()\n\n\t\tself.pieOverlay.strokeColor = self.strokeColor?.cgColor\n\t\tself.pieOverlay.lineWidth = self.lineWidth\n\n\t\tself.pieOverlay.animationStyle = self.animationStyle\n\n\t\tself.pieOverlay.dataSource = self.dataSource\n\t}\n\n\t// MARK: - Privates\n\n\tinternal var animator = ArbitraryAnimator()\n\n\tinternal var fractionComplete: CGFloat = 0\n\tinternal var total: CGFloat = 0.0\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineStackLineGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineLineGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 7/12/20.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineStackLineGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\t\t/// The primary color for the sparkline\n\t\tlet graphColor: DSFColor\n\n\t\t/// Draw a dotted line at the zero point on the y-axis\n\t\tlet showZeroLine: Bool\n\t\t/// The drawing definition for the zero line point\n\t\tlet zeroLineDefinition: DSFSparkline.ZeroLineDefinition\n\n\t\t/// The width for the line drawn on the graph\n\t\tlet lineWidth: CGFloat\n\t\t/// Should the area below the line be shaded?\n\t\tlet lineShading: Bool\n\t\t/// Draw a shadow under the line\n\t\tlet shadowed: Bool\n\n\t\t/// Should the line graph be centered around the zero-line?\n\t\tlet centeredAtZeroLine: Bool\n\t\t/// The color used to draw values lower than the zero-line, or nil for the same as the graph color\n\t\tlet lowerGraphColor: DSFColor?\n\n\t\t/// Highlight y-ranges within the graph\n\t\tlet highlightDefinitions: [DSFSparkline.HighlightRangeDefinition]\n\n\t\t/// The grid lines to be drawn on the graph\n\t\tlet gridLines: DSFSparkline.GridLinesDefinition?\n\n\t\t/// Primary fill\n\t\tlet primaryFill: DSFSparklineFillable?\n\t\t/// Secondary fill\n\t\tlet secondaryFill: DSFSparklineFillable?\n\n\t\t/// Create a sparkline graph that displays dots (like the CPU history graph in Activity Monitor)\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - graphColor: The color of the dots that are set\n\t\t///   - lineWidth: The width of the line\n\t\t///   - lineShading: If true, shades the underside of the drawn line.\n\t\t///   - shadowed: If true, draws a shadow under the line part of the graph.\n\t\t///   - showZeroLine: Show or hide a 'zero line' horizontal line\n\t\t///   - zeroLineDefinition: the settings for drawing the zero line\n\t\t///   - centeredAtZeroLine: Should the line graph be centered around the zero-line?\n\t\t///   - lowerGraphColor: The color used to draw values lower than the zero-line, or nil for the same as the graph color\n\t\t///   - highlightDefinitions: The style of the y-range highlight\n\t\t///   - gridLines: DSFSparkline.GridLinesDefinition? = nil\n\t\tpublic init(\n\t\t\tdataSource: DSFSparkline.DataSource,\n\t\t\tgraphColor: DSFColor,\n\t\t\tlineWidth: CGFloat = 1.5,\n\t\t\tlineShading: Bool = true,\n\t\t\tshadowed: Bool = false,\n\t\t\tshowZeroLine: Bool = false,\n\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition = .shared,\n\t\t\tcenteredAtZeroLine: Bool = false,\n\t\t\tlowerGraphColor: DSFColor? = nil,\n\t\t\thighlightDefinitions: [DSFSparkline.HighlightRangeDefinition] = [],\n\t\t\tgridLines: DSFSparkline.GridLinesDefinition? = nil,\n\t\t\tprimaryFill: (any DSFSparklineFillable)? = nil,\n\t\t\tsecondaryFill: (any DSFSparklineFillable)? = nil\n\t\t) {\n\t\t\tself.dataSource = dataSource\n\t\t\tself.graphColor = graphColor\n\n\t\t\tself.showZeroLine = showZeroLine\n\t\t\tself.zeroLineDefinition = zeroLineDefinition\n\n\t\t\tself.centeredAtZeroLine = centeredAtZeroLine\n\t\t\tself.lowerGraphColor = lowerGraphColor\n\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.lineShading = lineShading\n\t\t\tself.shadowed = shadowed\n\n\t\t\tself.highlightDefinitions = highlightDefinitions\n\t\t\tself.gridLines = gridLines\n\n\t\t\tself.primaryFill = primaryFill\n\t\t\tself.secondaryFill = secondaryFill\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineStackLineGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineStackLineGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineStackLineGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineStackLineGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineStackLineGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tfunc makeLineGraph(_: Context) -> DSFSparklineStackLineGraphView {\n\t\tlet view = DSFSparklineStackLineGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\t\n\t\tview.dataSource = self.dataSource\n\t\tview.graphColor = self.graphColor\n\n\t\tview.lineWidth = self.lineWidth\n\t\tview.lineShading = self.lineShading\n\t\tview.shadowed = self.shadowed\n\n\t\tview.zeroLineVisible = self.showZeroLine\n\t\tview.setZeroLineDefinition(self.zeroLineDefinition)\n\n\t\tview.centeredAtZeroLine = self.centeredAtZeroLine\n\t\tview.lowerGraphColor = self.lowerGraphColor\n\n\t\tif self.highlightDefinitions.count > 0 {\n\t\t\tview.highlightRangeVisible = true\n\t\t\tview.highlightRangeDefinition = self.highlightDefinitions\n\t\t}\n\n\t\tif let gridLines = self.gridLines {\n\t\t\tview.setGridLineDefinition(gridLines)\n\t\t}\n\t\telse {\n\t\t\tview.gridLinesVisible = false\n\t\t}\n\n\t\tif let pf = self.primaryFill {\n\t\t\tview.primaryFill = pf\n\t\t}\n\t\tif let sf = self.secondaryFill {\n\t\t\tview.secondaryFill = sf\n\t\t}\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineStackLineGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineStackLineGraphView {\n\t\treturn self.makeLineGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineStackLineGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineStackLineGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineStackLineGraphView {\n\t\treturn self.makeLineGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineStackLineGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineStackLineGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineStackLineGraphView) {\n\t\tUpdateIfNotEqual(result: &view.graphColor, val: self.graphColor)\n\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\t\tUpdateIfNotEqual(result: &view.lineShading, val: self.lineShading)\n\t\tUpdateIfNotEqual(result: &view.shadowed, val: self.shadowed)\n\n\t\tUpdateIfNotEqual(result: &view.lineShading, val: self.lineShading)\n\n\t\tUpdateIfNotEqual(result: &view.zeroLineVisible, val: self.showZeroLine)\n\t\tview.setZeroLineDefinition(self.zeroLineDefinition)\n\t\t\n\t\tUpdateIfNotEqual(result: &view.centeredAtZeroLine, val: self.centeredAtZeroLine)\n\t\tUpdateIfNotEqual(result: &view.lowerGraphColor, val: self.lowerGraphColor)\n\n\t\tif self.highlightDefinitions.count > 0 {\n\t\t\tview.highlightRangeVisible = true\n\t\t\tview.highlightRangeDefinition = self.highlightDefinitions\n\t\t}\n\t\telse {\n\t\t\tview.highlightRangeVisible = false\n\t\t\tview.highlightRangeDefinition = []\n\t\t}\n\n\t\tif let pf = self.primaryFill {\n\t\t\tview.primaryFill = pf\n\t\t}\n\t\tif let sf = self.secondaryFill {\n\t\t\tview.secondaryFill = sf\n\t\t}\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineStackLineGraphView.swift",
    "content": "//\n//  DSFSparklineStackLineGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A stack line sparkline type\n@objc public class DSFSparklineStackLineGraphView: DSFSparklineZeroLineGraphView {\n\tlet overlay = DSFSparklineOverlay.Stackline()\n\n\t/// The width for the line drawn on the graph\n\t@objc public dynamic var lineWidth: CGFloat = 1 {\n\t\tdidSet {\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// Shade the area under the line\n\t@objc public dynamic var lineShading: Bool = true {\n\t\tdidSet {\n\t\t\tself.overlay.primaryFill = DSFSparkline.Fill.Color(self.graphColor.withAlphaComponent(0.3).cgColor)\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// Draw a shadow under the line\n\t@objc public dynamic var shadowed: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.shadow = self.shadowed ? NSShadow.sparklineDefault : nil\n\t\t}\n\t}\n\n\t/// Should the graph be centered at the zero line?\n\t@objc public dynamic var centeredAtZeroLine: Bool = false {\n\t\tdidSet {\n\t\t\tself.overlay.centeredAtZeroLine = self.centeredAtZeroLine\n\t\t}\n\t}\n\n\t/// The primary fill (for the area of the graph ABOVE the zero line)\n\t@objc public dynamic var primaryFill: (any DSFSparklineFillable)? {\n\t\tget { self.overlay.primaryFill }\n\t\tset { self.overlay.primaryFill = newValue }\n\t}\n\n\t/// The secondary fill (for the area of the graph UNDER the zero line)\n\t@objc public dynamic var secondaryFill: (any DSFSparklineFillable)? {\n\t\tget { self.overlay.secondaryFill }\n\t\tset { self.overlay.secondaryFill = newValue }\n\t}\n\n\tinternal var gradient: CGGradient?\n\tinternal var lowerGradient: CGGradient?\n\n\toverride public init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.setNeedsDisplay()\n\t}\n\n\toverride public func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\t// Update the gradients to match the color change\n\n\t\tself.gradient = CGGradient(\n\t\t\tcolorsSpace: nil,\n\t\t\tcolors: [self.graphColor.withAlphaComponent(0.4).cgColor,\n\t\t\t         self.graphColor.withAlphaComponent(0.2).cgColor] as CFArray,\n\t\t\tlocations: [1.0, 0.0]\n\t\t)!\n\n\t\tlet lc = self.lowerColor\n\t\tself.lowerGradient = CGGradient(\n\t\t\tcolorsSpace: nil,\n\t\t\tcolors: [lc.withAlphaComponent(0.4).cgColor,\n\t\t\t         lc.withAlphaComponent(0.2).cgColor] as CFArray,\n\t\t\tlocations: [1.0, 0.0]\n\t\t)!\n\n\t\tself.overlay.strokeWidth = self.lineWidth\n\n\t\tself.overlay.primaryStrokeColor = self.graphColor.cgColor\n\t\tself.overlay.secondaryStrokeColor = self.lowerColor.cgColor\n\n\t\tself.overlay.centeredAtZeroLine = self.centeredAtZeroLine\n\n\t\t// Backwards compatibility\n\t\tlet color = self.graphColor\n\t\tlet fill = DSFSparkline.Fill.Gradient(colors: [\n\t\t\tcolor.withAlphaComponent(0.4).cgColor,\n\t\t\tcolor.withAlphaComponent(0.2).cgColor,\n\t\t])\n\t\tself.overlay.primaryFill = fill\n\n\t\tif let lowerColor = self.lowerGraphColor {\n\t\t\tlet fill = DSFSparkline.Fill.Gradient(colors: [\n\t\t\t\tlowerColor.withAlphaComponent(0.4).cgColor,\n\t\t\t\tlowerColor.withAlphaComponent(0.2).cgColor,\n\t\t\t])\n\t\t\tself.overlay.secondaryFill = fill\n\t\t}\n\t\telse {\n\t\t\t// Fallback - if secondary fill not defined the compatibility view is to use the primary fill view\n\t\t\tself.overlay.secondaryFill = self.overlay.primaryFill\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineStripesGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineDataBarGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 12/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 11, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineStripesGraphView {\n\tstruct SwiftUI {\n\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\n\t\tlet barSpacing: UInt\n\t\tlet integral: Bool\n\n\t\tlet gradient: DSFSparkline.GradientBucket\n\n\t\tstatic public let shared = DSFSparkline.GradientBucket(posts: [\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 1, green: 0, blue: 0, alpha: 1), location: 0),\n\t\t\tDSFSparkline.GradientBucket.Post(color: CGColor(red: 0, green: 0, blue: 1, alpha: 1), location: 1)\n\t\t])\n\n\t\t/// Create a databar graph\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - maximumTotalValue: The maximum _total_ value. If the datasource values total is greater than this value, it clips the display\n\t\t///   - palette: The color palette to use when drawing the graph\n\t\t///   - unsetColor: (optional) the color to use when drawing the background (useful when the maximumValue is also set)\n\t\t///   - strokeColor: The color to draw the separator lines between data points\n\t\t///   - lineWidth: The width of the separator lines\n\t\t///   - animated: If set, animates any datasource value changes\n\t\t///   - animationDuration: The duration for the animate-in animation\n\t\tpublic init(dataSource: DSFSparkline.DataSource,\n\t\t\t\t\t\tintegral: Bool = false,\n\t\t\t\t\t\tbarSpacing: UInt = 0,\n\t\t\t\t\t\tgradient: DSFSparkline.GradientBucket = Self.shared)\n\t\t{\n\t\t\tself.dataSource = dataSource\n\t\t\tself.integral = integral\n\t\t\tself.barSpacing = barSpacing\n\t\t\tself.gradient = gradient\n\t\t}\n\t}\n}\n\n@available(macOS 11, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineStripesGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineStripesGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineStripesGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineStripesGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineStripesGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tfunc makeStripesGraph(_: Context) -> DSFSparklineStripesGraphView {\n\t\tlet view = DSFSparklineStripesGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\t\tview.barSpacing = self.barSpacing\n\t\tview.integral = self.integral\n\t\tview.gradient = self.gradient\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineStripesGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineStripesGraphView {\n\t\treturn self.makeStripesGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineStripesGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 11, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineStripesGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineStripesGraphView {\n\t\treturn self.makeStripesGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineStripesGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 11, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineStripesGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineStripesGraphView) {\n\t\tUpdateIfNotEqual(result: &view.barSpacing, val: self.barSpacing)\n\t\tUpdateIfNotEqual(result: &view.integral, val: self.integral)\n\n\t\tview.gradient = self.gradient\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineStripesGraphView.swift",
    "content": "//\n//  DSFSparklineStripesGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 15/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline graph that displays solid color bars with a gradient (like the climate graph)\npublic class DSFSparklineStripesGraphView: DSFSparklineDataSourceView {\n\n\tlet overlay = DSFSparklineOverlay.Stripes()\n\n\t@objc public dynamic var integral: Bool = true {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The spacing (in pixels) between each bar\n\t@objc public dynamic var barSpacing: UInt = 0 {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The color gradient to use when rendering.\n\t///\n\t/// Note that transparent gradients display strangely and not as I would expect them to.\n\t/// Stick with solid colors in your gradient for the current time.\n\t@objc public var gradient: DSFSparkline.GradientBucket? {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\n\t\tself.colorDidChange()\n\n\t\tself.overlay.setNeedsDisplay()\n\t}\n\n\toverride func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\tself.overlay.integral = self.integral\n\t\tself.overlay.barSpacing = self.barSpacing\n\n\t\tself.overlay.gradient = self.gradient?.copyGradientBucket() ?? DSFSparklineOverlay.Stripes.defaultGradient\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineTabletGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineZeroLineDefinition.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 25/01/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n/// A win-loss sparkline. DataSource values > 0 represent a 'win', whereas <= 0 represent a loss.\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineTabletGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\n\t\t/// The 'win' color for the sparkline\n\t\tlet winColor: DSFColor\n\t\t/// The 'loss' color for the sparkline\n\t\tlet lossColor: DSFColor\n\n\t\t/// The line width (in pixels) to use when drawing the border of each tablet\n\t\tlet lineWidth: CGFloat\n\t\t/// The spacing (in pixels) between each tablet\n\t\tlet barSpacing: CGFloat\n\n\t\t/// Create a bar graph sparkline\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - winColor: The 'win' color for the sparkline\n\t\t///   - lossColor: The 'loss' color for the sparkline\n\t\t///   - lineWidth: The width of the line around each tablet\n\t\t///   - barSpacing: The spacing between the tablets\n\t\tpublic init(dataSource: DSFSparkline.DataSource,\n\t\t\t\t\t\twinColor: DSFColor = .systemGreen,\n\t\t\t\t\t\tlossColor: DSFColor = .systemRed,\n\t\t\t\t\t\tlineWidth: CGFloat = 1,\n\t\t\t\t\t\tbarSpacing: CGFloat = 1)\n\t\t{\n\t\t\tself.dataSource = dataSource\n\n\t\t\tself.winColor = winColor\n\t\t\tself.lossColor = lossColor\n\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.barSpacing = barSpacing\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineTabletGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineTabletGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineTabletGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineTabletGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineTabletGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tprivate func makeTabletGraph(_: Context) -> DSFSparklineTabletGraphView {\n\t\tlet view = DSFSparklineTabletGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\n\t\tview.dataSource = self.dataSource\n\n\t\tview.winColor = self.winColor\n\t\tview.lossColor = self.lossColor\n\n\t\tview.barSpacing = self.barSpacing\n\t\tview.lineWidth = self.lineWidth\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineTabletGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineTabletGraphView {\n\t\treturn self.makeTabletGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineTabletGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineTabletGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineTabletGraphView {\n\t\treturn self.makeTabletGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineTabletGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineTabletGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineTabletGraphView) {\n\n\t\tUpdateIfNotEqual(result: &view.winColor, val: self.winColor)\n\t\tUpdateIfNotEqual(result: &view.lossColor, val: self.lossColor)\n\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\t\tUpdateIfNotEqual(result: &view.barSpacing, val: self.barSpacing)\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineTabletGraphView.swift",
    "content": "//\n//  DSFSparklineTabletGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 25/01/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A tablet-style sparkline. Similar to win/loss except rendering as a row of filled/unfilled circles\n@objc public class DSFSparklineTabletGraphView: DSFSparklineDataSourceView {\n\n\tlet overlay = DSFSparklineOverlay.Tablet()\n\n\tstatic let clear: CGColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 0, 0, 0])!\n\n\t/// The width of the stroke for the tablet\n\t@objc public dynamic var lineWidth: CGFloat = 1.0 {\n\t\tdidSet {\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The spacing (in pixels) between each bar\n\t@objc public dynamic var barSpacing: CGFloat = 1.0 {\n\t\tdidSet {\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t#if os(macOS)\n\t/// The color to draw the 'win' boxes\n\t@objc public dynamic var winColor: NSColor = NSColor.systemGreen {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\n\t/// The color to draw the 'loss' boxes\n\t@objc public dynamic var lossColor: NSColor = NSColor.systemRed {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#else\n\t/// The color to draw the 'win' boxes\n\t@objc public dynamic var winColor: UIColor = UIColor.systemGreen {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\n\t/// The color to draw the 'loss' boxes\n\t@objc public dynamic var lossColor: UIColor = UIColor.systemRed {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#endif\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.setNeedsDisplay()\n\t}\n\n\toverride func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\tself.overlay.lineWidth = self.lineWidth\n\t\tself.overlay.tabletSpacing = self.barSpacing\t\t// backwards compatible naming here\n\n\t\tself.overlay.winFill = DSFSparkline.Fill.Color(self.winColor.withAlphaComponent(0.3).cgColor)\n\t\tself.overlay.winStrokeColor = self.winColor.cgColor\n\n\t\tself.overlay.lossStrokeColor = self.lossColor.cgColor\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineWinLossGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineWinLossGraphView+SwiftUI.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 7/12/20.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n/// A win-loss sparkline. DataSource values > 0 represent a 'win', whereas <= 0 represent a loss.\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineWinLossGraphView {\n\tstruct SwiftUI {\n\t\t/// Datasource for the graph\n\t\tlet dataSource: DSFSparkline.DataSource\n\n\t\t/// The 'win' color for the sparkline\n\t\tlet winColor: DSFColor\n\t\t/// The 'loss' color for the sparkline\n\t\tlet lossColor: DSFColor\n\t\t/// The 'tie' color for the sparkline.  If nil, tie values are not drawn\n\t\tlet tieColor: DSFColor?\n\n\t\t/// The line width (in pixels) to use when drawing the border of each bar\n\t\tlet lineWidth: UInt\n\t\t/// The spacing (in pixels) between each bar\n\t\tlet barSpacing: UInt\n\n\t\t/// Draw a dotted line at the zero point on the y-axis\n\t\tlet showZeroLine: Bool\n\t\t/// The drawing definition for the zero line point\n\t\tlet zeroLineDefinition: DSFSparkline.ZeroLineDefinition\n\n\t\t/// Create a bar graph sparkline\n\t\t/// - Parameters:\n\t\t///   - dataSource: The data source for the graph\n\t\t///   - winColor: The 'win' color for the sparkline\n\t\t///   - lossColor: The 'loss' color for the sparkline\n\t\t///   - tieColor: The 'tie' color for the sparkline\n\t\t///   - lineWidth: The width of the line around each bar\n\t\t///   - barSpacing: The spacing between the bars\n\t\t///   - showZeroLine: Show or hide a 'zero line' horizontal line\n\t\t///   - zeroLineDefinition: the settings for drawing the zero line\n\t\tpublic init(dataSource: DSFSparkline.DataSource,\n\t\t\t\t\t\twinColor: DSFColor = .systemGreen,\n\t\t\t\t\t\tlossColor: DSFColor = .systemRed,\n\t\t\t\t\t\ttieColor: DSFColor? = nil,\n\t\t\t\t\t\tlineWidth: UInt = 1,\n\t\t\t\t\t\tbarSpacing: UInt = 1,\n\t\t\t\t\t\tshowZeroLine: Bool = false,\n\t\t\t\t\t\tzeroLineDefinition: DSFSparkline.ZeroLineDefinition = .shared)\n\t\t{\n\t\t\tself.dataSource = dataSource\n\n\t\t\tself.winColor = winColor\n\t\t\tself.lossColor = lossColor\n\t\t\tself.tieColor = tieColor\n\n\t\t\tself.lineWidth = lineWidth\n\t\t\tself.barSpacing = barSpacing\n\n\t\t\tself.showZeroLine = showZeroLine\n\t\t\tself.zeroLineDefinition = zeroLineDefinition\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineWinLossGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineWinLossGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineWinLossGraphView\n\t#endif\n\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineWinLossGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineWinLossGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\n\tprivate func makeWinLossGraph(_: Context) -> DSFSparklineWinLossGraphView {\n\t\tlet view = DSFSparklineWinLossGraphView(frame: .zero)\n\t\tview.translatesAutoresizingMaskIntoConstraints = false\n\n\t\tview.dataSource = self.dataSource\n\n\t\tview.winColor = self.winColor\n\t\tview.lossColor = self.lossColor\n\t\tview.tieColor = self.tieColor\n\n\t\tview.barSpacing = self.barSpacing\n\t\tview.lineWidth = self.lineWidth\n\n\t\tview.centerlineColor = self.showZeroLine ? self.zeroLineDefinition.color : nil\n\t\tview.centerlineWidth = self.zeroLineDefinition.lineWidth\n\t\tview.centerlineDashStyle = self.zeroLineDefinition.lineDashStyle\n\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineWinLossGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineWinLossGraphView {\n\t\treturn self.makeWinLossGraph(context)\n\t}\n\n\tfunc updateUIView(_ view: DSFSparklineWinLossGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineWinLossGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineWinLossGraphView {\n\t\treturn self.makeWinLossGraph(context)\n\t}\n\n\tfunc updateNSView(_ view: DSFSparklineWinLossGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineWinLossGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineWinLossGraphView) {\n\n\t\tUpdateIfNotEqual(result: &view.winColor, val: self.winColor)\n\t\tUpdateIfNotEqual(result: &view.lossColor, val: self.lossColor)\n\t\tUpdateIfNotEqual(result: &view.tieColor, val: self.tieColor)\n\n\t\tUpdateIfNotEqual(result: &view.lineWidth, val: self.lineWidth)\n\t\tUpdateIfNotEqual(result: &view.barSpacing, val: self.barSpacing)\n\n\t\tUpdateIfNotEqual(result: &view.centerlineColor, val: self.showZeroLine ? self.zeroLineDefinition.color : nil)\n\t\tUpdateIfNotEqual(result: &view.centerlineWidth, val: self.zeroLineDefinition.lineWidth)\n\t\tUpdateIfNotEqual(result: &view.centerlineDashStyle, val: self.zeroLineDefinition.lineDashStyle)\n\n\t\tUpdateIfNotEqual(result: &view.dataSource, val: self.dataSource)\n\t}\n}\n\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineWinLossGraphView.swift",
    "content": "//\n//  DSFSparklineWinLossGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n@objc public class DSFSparklineWinLossGraphView: DSFSparklineDataSourceView {\n\n\tlet overlay = DSFSparklineOverlay.WinLossTie()\n\n\t/// The line width (in pixels) to use when drawing the border of each bar\n\t@objc public dynamic var lineWidth: UInt = 1 {\n\t\tdidSet {\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t/// The spacing (in pixels) between each bar\n\t@objc public dynamic var barSpacing: UInt = 1 {\n\t\tdidSet {\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\t#if os(macOS)\n\t/// The color to draw the 'win' boxes\n\t@objc public dynamic var winColor: NSColor = NSColor.systemGreen {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t/// The color to draw the 'loss' boxes\n\t@objc public dynamic var lossColor: NSColor = NSColor.systemRed {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t/// The color to draw the 'tie' boxes\n\t@objc public dynamic var tieColor: NSColor? = nil {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#else\n\t/// The color to draw the 'win' boxes\n\t@objc public dynamic var winColor: UIColor = UIColor.systemGreen {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t/// The color to draw the 'loss' boxes\n\t@objc public dynamic var lossColor: UIColor = UIColor.systemRed {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t/// The color to draw the 'tie' boxes\n\t@objc public dynamic var tieColor: UIColor? = nil {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#endif\n\n\t// MARK: - Centerline Definitions\n\n\t/// The centerline color. If nil, then no centerline is drawn\n\t#if os(macOS)\n\t@objc public dynamic var centerlineColor: NSColor? = nil {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var centerlineColor: UIColor? = nil {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#endif\n\n\t// The width of the zero line\n\t@objc public dynamic var centerlineWidth: CGFloat = 1 {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\n\t/// The pattern for drawing the line\n\tvar centerlineDashStyle: [CGFloat] = [1,1]\n\n\t/// A string representation of the line dash lengths for the center line, eg. \"1,3,4,2\".\n\t/// If you want a solid line, specify \"-\"\n\t///\n\t/// Primarily used for Interface Builder integration\n\t@objc public dynamic var centerlineDashStyleString: String = \"1,1\" {\n\t\tdidSet {\n\t\t\tif self.centerlineDashStyleString == \"-\" {\n\t\t\t\t// Solid line\n\t\t\t\tself.centerlineDashStyle = []\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet components = self.centerlineDashStyleString.extractCGFloats()\n\t\t\t\tif components.count >= 2 {\n\t\t\t\t\tself.centerlineDashStyle = components\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tSwift.print(\"ERROR: Zero Line Style string format is incompatible (\\(self.centerlineDashStyleString) -> \\(components))\")\n\t\t\t\t\tself.centerlineDashStyle = []\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\n\t// MARK: - Initializers\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.setNeedsDisplay()\n\t}\n\n\toverride func colorDidChange() {\n\t\tsuper.colorDidChange()\n\n\t\tself.overlay.lineWidth = self.lineWidth\n\t\tself.overlay.barSpacing = self.barSpacing\n\n\t\tself.overlay.winFill = DSFSparkline.Fill.Color(self.winColor.withAlphaComponent(0.3).cgColor)\n\t\tself.overlay.winStroke = self.winColor.cgColor\n\n\t\tself.overlay.lossFill = DSFSparkline.Fill.Color(self.lossColor.withAlphaComponent(0.3).cgColor)\n\t\tself.overlay.lossStroke = self.lossColor.cgColor\n\n\t\tself.overlay.tieStroke = self.tieColor?.cgColor\n\t\tif let tc = self.tieColor {\n\t\t\tself.overlay.tieFill = DSFSparkline.Fill.Color(tc.withAlphaComponent(0.3).cgColor)\n\t\t}\n\n\t\tif let color = self.centerlineColor {\n\t\t\tself.overlay.centerLine = .init(color: color,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  lineWidth: self.centerlineWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  lineDashStyle: self.centerlineDashStyle)\n\t\t}\n\t\telse {\n\t\t\tself.overlay.centerLine = nil\n\t\t}\n\n\t\tself.updateDisplay()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineWiperGaugeGraphView+SwiftUI.swift",
    "content": "//\n//  DSFSparklineWiperGaugeGraphView+SwiftUI.swift\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if canImport(SwiftUI)\n\nimport SwiftUI\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineWiperGaugeGraphView {\n\n\t/// The SwiftUI percent bar graph\n\tstruct SwiftUI {\n\n\t\t/// Palette to use when coloring the chart\n\t\tlet valueColor: DSFSparkline.ValueBasedFill\n\t\t/// The 'background' color for the value\n\t\tlet valueBackgroundColor: DSFColor?\n\t\t/// The color of the upper arc for the control\n\t\tlet upperArcColor: DSFColor?\n\t\t/// The color of the pointer\n\t\tlet pointerColor: DSFColor?\n\t\t/// The background color for the gauge\n\t\tlet backgroundColor: DSFColor?\n\t\t/// The value to display in the chart\n\t\tlet value: Double\n\t\t/// Should changes to value be animated?\n\t\tlet animationStyle: DSFSparkline.AnimationStyle?\n\n\t\t/// Create a sparkline graph that displays a 0 ... 1 value as a gauge\n\t\tpublic init(\n\t\t\tvalueColor: DSFSparkline.ValueBasedFill,\n\t\t\tvalue: Double,\n\t\t\tvalueBackgroundColor: DSFColor? = nil,\n\t\t\tupperArcColor: DSFColor? = nil,\n\t\t\tpointerColor: DSFColor? = nil,\n\t\t\tbackgroundColor: DSFColor? = nil,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil\n\t\t) {\n\t\t\tself.valueColor = valueColor\n\t\t\tself.valueBackgroundColor = valueBackgroundColor\n\t\t\tself.upperArcColor = upperArcColor\n\t\t\tself.pointerColor = pointerColor\n\t\t\tself.backgroundColor = backgroundColor\n\t\t\tself.value = value\n\t\t\tself.animationStyle = animationStyle\n\t\t}\n\n\t\t/// Create a sparkline graph that displays a 0 ... 1 value as a gauge\n\t\tpublic init(\n\t\t\tvalueColor: DSFColor,\n\t\t\tvalue: Double,\n\t\t\tvalueBackgroundColor: DSFColor? = nil,\n\t\t\tupperArcColor: DSFColor? = nil,\n\t\t\tpointerColor: DSFColor? = nil,\n\t\t\tbackgroundColor: DSFColor? = nil,\n\t\t\tanimationStyle: DSFSparkline.AnimationStyle? = nil\n\t\t) {\n\t\t\tself.valueColor = DSFSparkline.ValueBasedFill(flatColor: valueColor.cgColor)\n\t\t\tself.valueBackgroundColor = valueBackgroundColor\n\t\t\tself.upperArcColor = upperArcColor\n\t\t\tself.pointerColor = pointerColor\n\t\t\tself.backgroundColor = backgroundColor\n\t\t\tself.value = value\n\t\t\tself.animationStyle = animationStyle\n\t\t}\n\t}\n}\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\nextension DSFSparklineWiperGaugeGraphView.SwiftUI: DSFViewRepresentable {\n\t#if os(macOS)\n\tpublic typealias NSViewType = DSFSparklineWiperGaugeGraphView\n\t#else\n\tpublic typealias UIViewType = DSFSparklineWiperGaugeGraphView\n\t#endif\n\t\n\tpublic class Coordinator: NSObject {\n\t\tlet parent: DSFSparklineWiperGaugeGraphView.SwiftUI\n\t\tinit(_ sparkline: DSFSparklineWiperGaugeGraphView.SwiftUI) {\n\t\t\tself.parent = sparkline\n\t\t}\n\t}\n\t\n\tpublic func makeCoordinator() -> Coordinator {\n\t\tCoordinator(self)\n\t}\n\t\n\tfunc makeWiperGauge(_: Context) -> DSFSparklineWiperGaugeGraphView {\n\t\tlet view = DSFSparklineWiperGaugeGraphView(frame: .zero)\n\t\tself.updateView(view)\n\t\treturn view\n\t}\n}\n\n// MARK: - iOS/tvOS Specific\n\n@available(iOS 13.0, tvOS 13.0, macOS 9999.0, *)\npublic extension DSFSparklineWiperGaugeGraphView.SwiftUI {\n\tfunc makeUIView(context: Context) -> DSFSparklineWiperGaugeGraphView {\n\t\treturn self.makeWiperGauge(context)\n\t}\n\t\n\tfunc updateUIView(_ view: DSFSparklineWiperGaugeGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - macOS Specific\n\n@available(macOS 10.15, iOS 9999.0, tvOS 9999.0, *)\npublic extension DSFSparklineWiperGaugeGraphView.SwiftUI {\n\tfunc makeNSView(context: Context) -> DSFSparklineWiperGaugeGraphView {\n\t\treturn self.makeWiperGauge(context)\n\t}\n\t\n\tfunc updateNSView(_ view: DSFSparklineWiperGaugeGraphView, context _: Context) {\n\t\tself.updateView(view)\n\t}\n}\n\n// MARK: - Common updates\n\n@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)\npublic extension DSFSparklineWiperGaugeGraphView.SwiftUI {\n\tfunc updateView(_ view: DSFSparklineWiperGaugeGraphView) {\n\t\tview.valueColor = self.valueColor\n\t\tif let c = self.valueBackgroundColor {\n\t\t\tview.valueBackgroundColor = c\n\t\t}\n\t\tif let c = self.upperArcColor {\n\t\t\tview.gaugeUpperArcColor = c\n\t\t}\n\t\tif let c = self.pointerColor {\n\t\t\tview.gaugePointerColor = c\n\t\t}\n\t\tif view.animationStyle != self.animationStyle {\n\t\t\tview.animationStyle = self.animationStyle\n\t\t}\n\t\tview.value = CGFloat(self.value)\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/DSFSparklineWiperGaugeGraphView.swift",
    "content": "//\n//  DSFSparklineWiperGaugeGraphView.swift\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A sparkline that draws a percent bar\n@objc public class DSFSparklineWiperGaugeGraphView: DSFSparklineSurfaceView {\n\n\t// MARK: - Value\n\n\t/// The initial value to display in the percent bar\n\t@objc public dynamic var value: CGFloat = 0.2 {\n\t\tdidSet {\n\t\t\tself.overlay.value = self.value\n\t\t}\n\t}\n\n\t@objc public var valueColor = DSFSparkline.ValueBasedFill.sharedPalette {\n\t\tdidSet {\n\t\t\tself.overlay.valueColor = valueColor\n\t\t}\n\t}\n\n\t@objc public var animationStyle: DSFSparkline.AnimationStyle? = nil {\n\t\tdidSet {\n\t\t\tself.overlay.animationStyle = animationStyle\n\t\t}\n\t}\n\n#if os(macOS)\n\t@objc public dynamic var gaugeUpperArcColor: NSColor = .textColor {\n\t\tdidSet {\n\t\t\tself.overlay.gaugeUpperArcColor = gaugeUpperArcColor.cgColor\n\t\t}\n\t}\n\n\t@objc public dynamic var valueBackgroundColor: NSColor = .quaternaryLabelColor {\n\t\tdidSet {\n\t\t\tself.overlay.valueBackgroundColor = valueBackgroundColor.cgColor\n\t\t}\n\t}\n\n\t/// The color of the pointer component of the gauge\n\t@objc public dynamic var gaugePointerColor: NSColor = .textColor {\n\t\tdidSet {\n\t\t\tself.overlay.gaugePointerColor = gaugePointerColor.cgColor\n\t\t}\n\t}\n\t/// The color of the pointer component of the gauge\n\t@objc public dynamic var gaugeBackgroundColor: NSColor? = nil {\n\t\tdidSet {\n\t\t\tself.overlay.gaugeBackgroundColor = gaugeBackgroundColor?.cgColor\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var gaugeUpperArcColor: UIColor = .label {\n\t\tdidSet {\n\t\t\tself.overlay.gaugeUpperArcColor = gaugeUpperArcColor.cgColor\n\t\t}\n\t}\n\n\t@objc public dynamic var valueBackgroundColor: UIColor = .quaternaryLabel {\n\t\tdidSet {\n\t\t\tself.overlay.valueBackgroundColor = valueBackgroundColor.cgColor\n\t\t}\n\t}\n\n\t/// The color of the pointer component of the gauge\n\t@objc public dynamic var gaugePointerColor: UIColor = .label {\n\t\tdidSet {\n\t\t\tself.overlay.gaugePointerColor = gaugePointerColor.cgColor\n\t\t}\n\t}\n\t/// The color of the pointer component of the gauge\n\t@objc public dynamic var gaugeBackgroundColor: UIColor? = nil {\n\t\tdidSet {\n\t\t\tself.overlay.gaugeBackgroundColor = gaugeBackgroundColor?.cgColor\n\t\t}\n\t}\n\t#endif\n\n\t// MARK: - Control\n\n\t/// Initializer\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.configure()\n\t}\n\n\t/// Initializer\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.configure()\n\t}\n\n\t// The overlay\n\tprivate let overlay = DSFSparklineOverlay.WiperGauge()\n}\n\nextension DSFSparklineWiperGaugeGraphView {\n\t#if os(macOS)\n\tpublic override func updateLayer() {\n\t\t// Captured to handle dark/light mode changes\n\t\tsuper.updateLayer()\n\t\tself.updateColors()\n\t}\n\t#endif\n}\n\nprivate extension DSFSparklineWiperGaugeGraphView {\n\tfunc configure() {\n\t\tself.addOverlay(self.overlay)\n\t\tself.overlay.value = self.value\n\t\tself.overlay.animationStyle = animationStyle\n\t\tself.updateColors()\n\t}\n\t\n\tfunc updateColors() {\n\t\tself.overlay.valueColor = self.valueColor\n\t\tself.overlay.valueBackgroundColor = valueBackgroundColor.cgColor\n\t\tself.overlay.gaugePointerColor = gaugePointerColor.cgColor\n\t\tself.overlay.gaugeUpperArcColor = gaugeUpperArcColor.cgColor\n\t\tself.overlay.gaugeBackgroundColor = gaugeBackgroundColor?.cgColor\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/ui/DSFSparklineDataSourceView.swift",
    "content": "//\n//  DSFSparklineDataSourceView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 16/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// A Sparkline View with an attached datasource.\n@objc public class DSFSparklineDataSourceView: DSFSparklineSurfaceView {\n\n\t// Listen for changes in the data and update appropriately\n\tprivate var dataObserver: NSObjectProtocol?\n\n\t/// The source of data for the sparkline\n\t@objc weak public var dataSource: DSFSparkline.DataSource? {\n\t\tdidSet {\n\t\t\tif self.windowSizeSetInXib {\n\t\t\t\tself.dataSource?.windowSize = self.graphWindowSize\n\t\t\t}\n\t\t\tself.updateDataObserver()\n\n\t\t\tself.rootLayer.sublayers?.forEach { layer in\n\t\t\t\tif let l = layer as? DSFSparklineOverlay.DataSource {\n\t\t\t\t\tl.dataSource = self.dataSource\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\n\tdeinit {\n\t\tself.dataObserver = nil\n\t}\n\n\t/// The primary color for the sparkline\n\t#if os(macOS)\n\t@objc public dynamic var graphColor: NSColor = NSColor.black {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var graphColor: UIColor = UIColor.black {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\t#endif\n\n\t#if os(macOS)\n\t/// Force an update when the view moves to the window\n\tpublic override func viewWillMove(toSuperview newSuperview: DSFView?) {\n\t\tsuper.viewWillMove(toSuperview: newSuperview)\n\t\tself.colorDidChange()\n\t}\n\t#endif\n\n\t/// The size of the sparkline window\n\t///\n\t/// This member is purely IBDesignable display related\n\t/// `windowSize` on the dataSource\n\t@objc public dynamic var graphWindowSize: UInt = 20 {\n\t\tdidSet {\n\t\t\tself.windowSizeSetInXib = true\n\t\t\tself.dataSource?.windowSize = self.graphWindowSize\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n\tprivate var windowSizeSetInXib = false\n}\n\nextension DSFSparklineDataSourceView {\n\n\tprivate func updateDataObserver() {\n\t\tself.dataObserver = nil\n\t\tif self.dataSource != nil {\n\t\t\tself.dataObserver = NotificationCenter.default.addObserver(\n\t\t\t\tforName: DSFSparkline.DataSource.DataChangedNotification,\n\t\t\t\tobject: self.dataSource!,\n\t\t\t\tqueue: nil, using: { [weak self] (notification) in\n\t\t\t\t\tself?.updateDisplay()\n\t\t\t})\n\t\t}\n\t}\n\n\t/// Override in inherited classes to be notified when the color changes\n\t@objc func colorDidChange() {\t}\n\n\t#if os(macOS)\n\toverride public func draw(_ dirtyRect: NSRect) {\n\t\tsuper.draw(dirtyRect)\n\t}\n\t#else\n\tpublic override func draw(_ rect: CGRect) {\n\t\tsuper.draw(rect)\n\t}\n\t#endif\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/prebuilt/ui/DSFSparklineZeroLinedGraphView.swift",
    "content": "//\n//  DSFSparklineZeroLinedGraphView.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport SwiftUI\n\n#if os(macOS)\nimport Cocoa\n#else\nimport UIKit\n#endif\n\n/// A view that can draw a zero-point line. Should never be used directly, just to inherit from for other graph types\n@objc public class DSFSparklineZeroLineGraphView: DSFSparklineDataSourceView {\n\n\t// MARK: Zero-line display\n\n\t// The zero-line overlay\n\tlet zerolineOverlay = DSFSparklineOverlay.ZeroLine()\n\n\t/// Draw a dotted line at the zero point on the y-axis\n\t@objc public dynamic var zeroLineVisible: Bool = false {\n\t\tdidSet {\n\t\t\tself.updateZeroLineSettings()\n\t\t}\n\t}\n\n\t/// The color of the dotted line at the zero point on the y-axis\n\t#if os(macOS)\n\t@objc public dynamic var zeroLineColor = NSColor.gray {\n\t\tdidSet {\n\t\t\tself.updateZeroLineSettings()\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var zeroLineColor: UIColor = .systemGray {\n\t\tdidSet {\n\t\t\tself.updateZeroLineSettings()\n\t\t}\n\t}\n\t#endif\n\n\t/// The width of the dotted line at the zero point on the y-axis\n\t@objc public dynamic var zeroLineWidth: CGFloat = 1.0 {\n\t\tdidSet {\n\t\t\tself.updateZeroLineSettings()\n\t\t}\n\t}\n\n\t/// The line style for the dotted line. Use [] to specify a solid line.\n\t@objc public var zeroLineDashStyle: [CGFloat] = [1.0, 1.0] {\n\t\tdidSet {\n\t\t\tself.updateZeroLineSettings()\n\t\t}\n\t}\n\n\t/// A string representation of the line dash lengths for the zero line, eg. \"1,3,4,2\". If you want a solid line, specify \"-\"\n\t///\n\t/// Primarily used for Interface Builder integration\n\t@objc public dynamic var zeroLineDashStyleString: String = \"1,1\" {\n\t\tdidSet {\n\t\t\tself.handleZeroLineString()\n\t\t}\n\t}\n\n\t// MARK: Zero-line centering\n\n\t/// The color used to draw values below the zero line. If nil, is the same as the graph color\n\t@objc public dynamic var lowerGraphColor: DSFColor? {\n\t\tdidSet {\n\t\t\tself.colorDidChange()\n\t\t}\n\t}\n\n\t/// The 'lowerColor' represents the 'negativeColor' if it is set, otherwise its the same as the graphColor\n\tinternal var lowerColor: DSFColor {\n\t\treturn self.lowerGraphColor ?? self.graphColor\n\t}\n\n\t// MARK: - Highlight ranges\n\n\t// A fixed interface-builder defined highlight\n\tlet ibHighlightOverlay = DSFSparklineOverlay.RangeHighlight()\n\n\t// An array of additional highlights\n\tvar highlightOverlay: [DSFSparklineOverlay.RangeHighlight] = []\n\n\t/// Draw a highlight for a range on the graph\n\t@objc public dynamic var highlightRangeVisible: Bool = false {\n\t\tdidSet {\n\t\t\tself.updateHighlightSettings()\n\t\t}\n\t}\n\n\t/// The color of the highlight to be used\n\t#if os(macOS)\n\t@objc public dynamic var highlightRangeColor = NSColor.gray {\n\t\tdidSet {\n\t\t\tself.updateHighlightSettings()\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var highlightRangeColor: UIColor = .systemGray {\n\t\tdidSet {\n\t\t\tself.updateHighlightSettings()\n\t\t}\n\t}\n\t#endif\n\n\t/// A string of the format \"0.1,0.7\"\n\t@objc public dynamic var highlightRangeString: String? = nil {\n\t\tdidSet {\n\t\t\tself.updateHighlightSettings()\n\t\t}\n\t}\n\n\t// MARK: - Grid lines support\n\n\t// A fixed interface-builder defined highlight\n\tlet ibGridLinesOverlay = DSFSparklineOverlay.GridLines()\n\n\t/// Draw a dotted line at the zero point on the y-axis\n\t@objc public dynamic var gridLinesVisible: Bool = false {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\n\t/// The y-values on the graph with a grid line\n\t@objc public var gridLinesValues: [CGFloat] = [] {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\n\t/// A string of the format \"0.1,0.7\"\n\t@objc public dynamic var gridLinesValuesString: String? = nil {\n\t\tdidSet {\n\t\t\t// Dash style\n\t\t\tlet floats = self.gridLinesValuesString?.extractCGFloats() ?? []\n\t\t\tself.gridLinesValues = floats\n\t\t}\n\t}\n\n\t#if os(macOS)\n\t@objc public dynamic var gridLinesColor = NSColor.systemGray.withAlphaComponent(0.5) {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\t#else\n\t@objc public dynamic var gridLinesColor: UIColor = .systemGray.withAlphaComponent(0.5) {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\t#endif\n\n\t/// The width of the dotted line at the zero point on the y-axis\n\t@objc public dynamic var gridLinesWidth: CGFloat = 1.0 {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\n\t/// The line style for the dotted line. Use [] to specify a solid line.\n\t@objc public dynamic var gridLinesDashStyle: [CGFloat] = [1.0, 1.0] {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\n\t/// A string representation of the line dash lengths for grid lines, eg. \"1,3,4,2\". If you want a solid line, specify \"-\"\n\t///\n\t/// Primarily used for Interface Builder integration\n\t@objc public dynamic var gridLinesDashStyleString: String = \"1.0,1.0\" {\n\t\tdidSet {\n\t\t\tself.updateGridLinesSettings()\n\t\t}\n\t}\n\n\t/// Set the grid line definition for the graph\n\t@objc public func setGridLineDefinition(_ gridLineDefinition: DSFSparkline.GridLinesDefinition) {\n\t\tself.gridLinesVisible = true\n\t\tself.gridLinesColor = gridLineDefinition.color\n\t\tself.gridLinesWidth = gridLineDefinition.width\n\t\tself.gridLinesDashStyle = gridLineDefinition.dashStyle\n\t\tself.gridLinesValues = gridLineDefinition.values\n\t}\n\n\t// MARK: - Init\n\n\tpublic override init(frame: CGRect) {\n\t\tsuper.init(frame: frame)\n\t\tself.setup()\n\t}\n\n\tpublic required init?(coder: NSCoder) {\n\t\tsuper.init(coder: coder)\n\t\tself.setup()\n\t}\n\n\tprivate func setup() {\n\n\t\t// The Zero line overlay\n\t\tself.addOverlay(self.zerolineOverlay)\n\t\tself.zerolineOverlay.zPosition = -5\n\t\tself.updateZeroLineSettings()\n\n\t\t// Highlight\n\t\tself.addOverlay(self.ibHighlightOverlay)\n\t\tself.ibHighlightOverlay.zPosition = -10\n\t\tself.ibHighlightOverlay.dataSource = self.dataSource\n\t\tself.updateHighlightSettings()\n\n\t\t// Grid lines\n\t\tself.addOverlay(self.ibGridLinesOverlay)\n\t\tself.ibGridLinesOverlay.isHidden = self.gridLinesVisible\n\t\tself.ibGridLinesOverlay.zPosition = -10\n\t\tself.ibGridLinesOverlay.dataSource = self.dataSource\n\t\tself.updateGridLinesSettings()\n\t}\n\n\t@objc public var highlightRangeDefinition: [DSFSparkline.HighlightRangeDefinition] = [] {\n\t\twillSet {\n\t\t\tself.highlightOverlay.forEach { $0.removeFromSuperlayer() }\n\t\t\tself.highlightOverlay = []\n\t\t}\n\n\t\tdidSet {\n\t\t\tself.highlightRangeDefinition.forEach { r in\n\t\t\t\tlet item = DSFSparklineOverlay.RangeHighlight()\n\t\t\t\titem.highlightRange = r.range\n\t\t\t\titem.dataSource = self.dataSource\n\t\t\t\titem.fill = r.fill\n\t\t\t\titem.zPosition = -10\n\t\t\t\tself.addOverlay(item)\n\t\t\t\tself.highlightOverlay.append(item)\n\t\t\t}\n\t\t\tself.updateDisplay()\n\t\t}\n\t}\n}\n\npublic extension DSFSparklineZeroLineGraphView {\n\t/// Configure the zero line using the ZeroLineDefinition \n\tfunc setZeroLineDefinition(_ definition: DSFSparkline.ZeroLineDefinition) {\n\t\tself.zeroLineWidth = definition.lineWidth\n\t\tself.zeroLineColor = definition.color\n\t\tself.zeroLineDashStyle = definition.lineDashStyle\n\t}\n}\n\nprivate extension DSFSparklineZeroLineGraphView {\n\tfunc updateGridLinesSettings() {\n\t\tself.ibGridLinesOverlay.isHidden = !self.gridLinesVisible\n\t\tself.ibGridLinesOverlay.strokeWidth = self.gridLinesWidth\n\t\tself.ibGridLinesOverlay.strokeColor = self.gridLinesColor.cgColor\n\t\tself.ibGridLinesOverlay.dashStyle = self.gridLinesDashStyle\n\n\t\tself.ibGridLinesOverlay.floatValues = self.gridLinesValues\n\n\t\tself.updateDisplay()\n\t}\n\n\t///\n\tprivate func handleZeroLineString() {\n\t\tif self.zeroLineDashStyleString == \"-\" {\n\t\t\t// Solid line\n\t\t\tself.zeroLineDashStyle = []\n\t\t}\n\t\telse {\n\t\t\tlet components = self.zeroLineDashStyleString.extractCGFloats()\n\t\t\tif components.count >= 2 {\n\t\t\t\tself.zeroLineDashStyle = components\n\t\t\t}\n\t\t\telse {\n\t\t\t\tSwift.print(\"ERROR: Zero Line Style string format is incompatible (\\(self.zeroLineDashStyleString) -> \\(components))\")\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate func updateZeroLineSettings() {\n\t\tself.zerolineOverlay.isHidden = !self.zeroLineVisible\n\t\tself.zerolineOverlay.strokeColor = self.zeroLineColor.cgColor\n\t\tself.zerolineOverlay.strokeWidth = self.zeroLineWidth\n\t\tself.zerolineOverlay.dashStyle = self.zeroLineDashStyle\n\t\tself.updateDisplay()\n\t}\n\n\tprivate func updateHighlightSettings() {\n\t\t\tself.ibHighlightOverlay.isHidden = !self.highlightRangeVisible\n\t\t\tself.ibHighlightOverlay.fill = DSFSparkline.Fill.Color(self.highlightRangeColor.cgColor)\n\n\t\t\tlet floats = self.highlightRangeString?.extractCGFloats() ?? []\n\t\t\tif floats.count == 2, floats[0] < floats[1] {\n\t\t\t\tself.ibHighlightOverlay.highlightRange = floats[0] ..< floats[1]\n\t\t\t}\n\t\t\telse if floats.count == 0 {\n\t\t\t\t// No ranges. This is fine\n\t\t\t\tself.highlightRangeDefinition = []\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.highlightRangeDefinition = []\n\t\t\t\tSwift.print(\"ERROR: Highlight range string format is incompatible (\\(self.zeroLineDashStyleString) -> \\(floats))\")\n\t\t\t}\n\t\t\tself.updateDisplay()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/Angle.swift",
    "content": "//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n/// An angle\n///\n/// An angle value represents either a radians or a degrees angle, with functions to easily convert between the two\npublic enum Angle<T: BinaryFloatingPoint> {\n\t/// Radians angle value\n\tcase radians(T)\n\t/// Degrees angle value\n\tcase degrees(T)\n\t\n\t/// The radians value for the angle\n\t@inlinable public var radians: T {\n\t\tswitch self {\n\t\tcase let .radians(value): return value\n\t\tcase let .degrees(value): return value * T.pi / 180.0\n\t\t}\n\t}\n\t\n\t/// The degrees value for the angle\n\t@inlinable public var degrees: T {\n\t\tswitch self {\n\t\tcase let .radians(value): return value * 180.0 / T.pi\n\t\tcase let .degrees(value): return value\n\t\t}\n\t}\n\t\n\t/// Return a guaranteed radians angle representation\n\t@inlinable public var asRadians: Angle { .radians(self.radians) }\n\t/// Return a guaranteed degrees angle representation\n\t@inlinable public var asDegrees: Angle { .degrees(self.degrees) }\n\t\n\t/// Add two angle values\n\t@inlinable public static func +(_ left: Angle, _ right: Angle) -> Angle { .radians(left.radians + right.radians) }\n\t/// Subtract two angle values\n\t@inlinable public static func -(_ left: Angle, _ right: Angle) -> Angle { .radians(left.radians - right.radians) }\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/ArbitraryAnimator.swift",
    "content": "//\n//  ArbitraryAnimator.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 17/2/21.\n//  Copyright © 2021 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport QuartzCore\n\nextension DSFSparkline {\n\t/// Animation function types\n\t@objc public enum AnimatorFunctionType: Int {\n\t\tcase linear\n\t\tcase easeInEaseOut\n\n\t\tinternal var function: ArbitraryAnimatorFunction {\n\t\t\tswitch self {\n\t\t\tcase .linear: return ArbitraryAnimator.Function.Linear()\n\t\t\tcase .easeInEaseOut: return ArbitraryAnimator.Function.EaseInEaseOut()\n\t\t\tdefault:\n\t\t\t\tfatalError()\n\t\t\t}\n\t\t}\n\t}\n\n\t/// An animation style\n\t@objc public class AnimationStyle: NSObject {\n\t\t@objc public let duration: CGFloat\n\t\t@objc public let function: AnimatorFunctionType\n\t\t@objc public init(duration: CGFloat = 0.25, function: AnimatorFunctionType = .easeInEaseOut) {\n\t\t\tself.duration = duration\n\t\t\tself.function = function\n\t\t}\n\t}\n\n\tstruct AnimationTransition {\n\t\tlet start: CGFloat\n\t\tlet stop: CGFloat\n\t\tvar distance: CGFloat { self.stop - self.start }\n\t}\n}\n\nfunc ==(_ left: DSFSparkline.AnimationStyle, _ right: DSFSparkline.AnimationStyle) -> Bool {\n\tleft.duration == right.duration && left.function == right.function\n}\n\nfunc !=(_ left: DSFSparkline.AnimationStyle, _ right: DSFSparkline.AnimationStyle) -> Bool {\n\tleft.duration != right.duration || left.function != right.function\n}\n\n//////\n\nprotocol ArbitraryAnimatorFunction {\n\tfunc evaluate(linearPosition: Double) -> Double\n}\n\nclass ArbitraryAnimator {\n\tclass Function {}\n\n\t#if os(macOS)\n\tvar displayLink: CVDisplayLink?\n\t#else\n\tvar displayLink: CADisplayLink?\n\t#endif\n\n\tvar progress: Double = 0.0\n\tvar duration: CFTimeInterval = 1\n\n\tvar startTime: CFTimeInterval = 0\n\tvar endTime: CFTimeInterval = 0\n\n\tvar animationFunction: ArbitraryAnimatorFunction = Function.Linear()\n\n\tvar isActive: Bool = false\n\n\tvar progressBlock: ((Double) -> Void)?\n\n\tinit() {\n\t\t#if os(macOS)\n\t\tCVDisplayLinkCreateWithActiveCGDisplays(&self.displayLink)\n\n\t\tlet displayLinkOutputCallback: CVDisplayLinkOutputCallback = {\n\t\t\t(_: CVDisplayLink,\n\t\t\t _: UnsafePointer<CVTimeStamp>,\n\t\t\t _: UnsafePointer<CVTimeStamp>,\n\t\t\t _: CVOptionFlags,\n\t\t\t _: UnsafeMutablePointer<CVOptionFlags>,\n\t\t\t displayLinkContext: UnsafeMutableRawPointer?) -> CVReturn in\n\n\t\t\tlet view = unsafeBitCast(displayLinkContext, to: ArbitraryAnimator.self)\n\t\t\tview.perform()\n\t\t\treturn CVReturn()\n\t\t}\n\n\t\tCVDisplayLinkSetOutputCallback(\n\t\t\tdisplayLink!,\n\t\t\tdisplayLinkOutputCallback,\n\t\t\tUnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())\n\t\t)\n\n\t\t#else\n\t\tself.displayLink = CADisplayLink(target: self, selector: #selector(self.callback(displaylink:)))\n\t\t#endif\n\t}\n\n\tfunc start() {\n\t\tself.startTime = CACurrentMediaTime()\n\t\tself.endTime = self.startTime + self.duration\n\n\t\tself.isActive = true\n\n\t\t#if os(macOS)\n\t\tguard let displayLink = self.displayLink else { fatalError() }\n\t\tCVDisplayLinkStart(displayLink)\n\t\t#else\n\t\tguard let displayLink = self.displayLink else { fatalError() }\n\t\tdisplayLink.add(to: RunLoop.main, forMode: .default)\n\t\t#endif\n\t}\n\n\tfunc stop() {\n\t\tif !self.isActive {\n\t\t\treturn\n\t\t}\n\n\t\tself.isActive = false\n\n\t\t#if os(macOS)\n\t\tguard let link = self.displayLink else { fatalError() }\n\t\tCVDisplayLinkStop(link)\n\t\t#else\n\t\tguard let displayLink = self.displayLink else { fatalError() }\n\t\tdisplayLink.remove(from: RunLoop.main, forMode: .default)\n\t\t#endif\n\n\t\t// Force the animation to complete\n\t\tself.progress = 1.0\n\t\tself.progressBlock?(self.progress)\n\t}\n\n\t#if !os(macOS)\n\t@objc func callback(displaylink _: CADisplayLink) {\n\t\tself.perform()\n\t}\n\t#endif\n\n\tfunc perform() {\n\t\tDispatchQueue.main.async { [weak self] in\n\t\t\tguard let `self` = self else { return }\n\n\t\t\tlet current = CACurrentMediaTime()\n\n\t\t\tif current >= self.endTime {\n\t\t\t\tself.progress = 1.0\n\t\t\t\tself.stop()\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet linearPosition = (current - self.startTime) / self.duration\n\t\t\t\tlet evaluatedPosition = self.animationFunction.evaluate(linearPosition: linearPosition)\n\t\t\t\tself.progress = evaluatedPosition\n\t\t\t}\n\t\t\tself.progressBlock?(self.progress)\n\t\t}\n\t}\n}\n\nextension ArbitraryAnimator.Function {\n\tclass EaseInEaseOut: ArbitraryAnimatorFunction {\n\t\tlet firstControlPoint: Double\n\t\tlet secondControlPoint: Double\n\t\tinit(firstControlPoint: Double = 0, secondControlPoint: Double = 1) {\n\t\t\tself.firstControlPoint = firstControlPoint\n\t\t\tself.secondControlPoint = secondControlPoint\n\t\t}\n\n\t\tfunc evaluate(linearPosition: Double) -> Double {\n\t\t\treturn\n\t\t\t\t3 * linearPosition * (1 - linearPosition) * (1 - linearPosition) * self.firstControlPoint +\n\t\t\t\t3 * linearPosition * linearPosition * (1 - linearPosition) * self.secondControlPoint +\n\t\t\t\tlinearPosition * linearPosition * linearPosition * 1.0\n\t\t}\n\t}\n\n\tclass Linear: ArbitraryAnimatorFunction {\n\t\tfunc evaluate(linearPosition: Double) -> Double {\n\t\t\treturn linearPosition\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/CGColor+BackwardsCompatibility.swift",
    "content": "//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n// Some basic support routines to abstract away differences between OS versions\n\nimport CoreGraphics\nimport Foundation\n\nextension CGColor {\n\t/// Creates a color in the Generic gray color space\n\t/// - Parameters:\n\t///   - gray: A grayscale value (0.0 - 1.0)\n\t///   - alpha: An alpha value (0.0 - 1.0)\n\t/// - Returns: A color object\n\t@inlinable static func gray(_ gray: CGFloat, _ a: CGFloat = 1.0) -> CGColor {\n\t\tif #available(iOS 13, tvOS 13, watchOS 6, *) {\n\t\t\treturn CGColor(gray: gray, alpha: a)\n\t\t}\n\t\treturn CGColor(colorSpace: _grayColorSpace, components: [gray, a]) ?? .standard.black\n\t}\n\n\t/// Creates a color in the Generic RGB color space\n\t/// - Parameters:\n\t///   - red: A red component value (0.0 - 1.0)\n\t///   - green: A green component value (0.0 - 1.0)\n\t///   - blue: A blue component value (0.0 - 1.0)\n\t///   - alpha: An alpha value (0.0 - 1.0)\n\t/// - Returns: A color object\n\t@inlinable static func RGBA(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat = 1.0) -> CGColor {\n\t\tif #available(iOS 13, tvOS 13, watchOS 6, *) {\n\t\t\treturn CGColor(red: red, green: green, blue: blue, alpha: alpha)\n\t\t}\n\t\treturn CGColor(colorSpace: _rgbaColorSpace, components: [red, green, blue, alpha]) ?? .standard.black\n\t}\n\n\t/// Creates a color in the sRGB color space.\n\t/// - Parameters:\n\t///   - red: A red component value (0.0 - 1.0)\n\t///   - green: A green component value (0.0 - 1.0)\n\t///   - blue: A blue component value (0.0 - 1.0)\n\t///   - alpha: An alpha value (0.0 - 1.0)\n\t/// - Returns: A color object\n\t@inlinable static func sRGBA(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat = 1.0) -> CGColor {\n\t\tif #available(macOS 15, iOS 13, tvOS 13, watchOS 6, *) {\n\t\t\treturn CGColor(srgbRed: red, green: green, blue: blue, alpha: alpha)\n\t\t}\n\t\treturn CGColor(colorSpace: _sRGBAColorSpace, components: [red, green, blue, alpha]) ?? .standard.black\n\t}\n}\n\n// cached colorspaces\n\n@usableFromInline internal let _sRGBAColorSpace = CGColorSpace(name: CGColorSpace.sRGB)!\n@usableFromInline internal let _rgbaColorSpace = CGColorSpace(name: CGColorSpace.genericRGBLinear)!\n@usableFromInline internal let _grayColorSpace = CGColorSpace(name: CGColorSpace.genericGrayGamma2_2)!\n\n// MARK: - Standard CGColors\n\nextension CGColor {\n\t@usableFromInline internal struct Colors {\n\t\t@usableFromInline internal let white = CGColor.gray(1)\n\t\t@usableFromInline internal let black = CGColor.gray(0)\n\t\t@usableFromInline internal let clear = CGColor.gray(0, 0)\n\t\t\n\t\t@usableFromInline internal let red = CGColor.sRGBA(1, 0, 0)\n\t\t@usableFromInline internal let green = CGColor.sRGBA(0, 1, 0)\n\t\t@usableFromInline internal let blue = CGColor.sRGBA(0, 0, 1)\n\n\t\t@usableFromInline internal let cyan = CGColor.sRGBA(0, 1, 1)\n\t\t@usableFromInline internal let yellow = CGColor.sRGBA(1, 1, 0)\n\t\t@usableFromInline internal let magenta = CGColor.sRGBA(1, 0, 1)\n\t}\n\t@usableFromInline internal static var standard: Colors { Colors() }\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/CGContext+extensions.swift",
    "content": "//\n//  CGContext+extensions.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics.CGContext\n\nextension CGContext {\n\t/// Execute the supplied block within a `saveGState() / restoreGState()` pair, providing a context\n\t/// to draw in during the execution of the block\n\t///\n\t/// - Parameter stateBlock: The block to execute within the new graphics state\n\t/// - Parameter context: The context to draw into within the block\n\t///\n\t/// Example usage:\n\t/// ```\n\t///    context.usingGState { (ctx) in\n\t///       ctx.addPath(unsetBackground)\n\t///       ctx.setFillColor(bgc1.cgColor)\n\t///       ctx.fillPath(using: .evenOdd)\n\t///    }\n\t/// ```\n\t@inlinable func usingGState(stateBlock: (_ context: CGContext) throws -> Void) rethrows {\n\t\tself.saveGState()\n\t\tdefer {\n\t\t\tself.restoreGState()\n\t\t}\n\t\ttry stateBlock(self)\n\t}\n\n\t/// Wrap the drawing commands in `block` within a transparency layer\n\t@inlinable func usingTransparencyLayer(auxiliaryInfo: CFDictionary? = nil, _ block: () -> Void) {\n\t\tself.beginTransparencyLayer(auxiliaryInfo: auxiliaryInfo)\n\t\tdefer { self.endTransparencyLayer() }\n\t\tblock()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/CGPath+Hermite.swift",
    "content": "//\n//  CGPath+Hermite.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/6/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\nextension CGMutablePath {\n\t@discardableResult\n\tfunc addPathWithPoints(_ points: [CGPoint], smoothed: Bool = false) -> CGPath {\n\t\tif smoothed {\n\t\t\treturn self.addPathByExtrapolatingPoints(points)\n\t\t}\n\t\telse {\n\t\t\treturn self.addPathWithPoints(points)\n\t\t}\n\t}\n\n\tprivate func addPathByExtrapolatingPoints(_ interpolationPoints: [CGPoint]) -> CGPath {\n\t\tself.interpolatePointsWithHermite(interpolationPoints: interpolationPoints)\n\t\treturn self\n\t}\n\n\tprivate func addPathWithPoints(_ points: [CGPoint]) -> CGPath {\n\t\tassert(points.count > 1)\n\t\tself.move(to: points.first!)\n\t\tfor point in points.dropFirst() {\n\t\t\tself.addLine(to: point)\n\t\t}\n\t\treturn self\n\t}\n}\n\nextension CGPath {\n\tfunc fit(verticallyIn rect: CGRect) -> CGPath? {\n\t\tlet boundingBox = self.boundingBox\n\t\tlet dy = rect.height / boundingBox.height\n\n\t\tlet scaleTransform = CGAffineTransform.identity\n\t\tvar tr = scaleTransform.scaledBy(x: 1.0, y: dy)\n\t\treturn self.copy(using: &tr)\n\t}\n\n\tstatic func pathWithPoints(_ points: [CGPoint], smoothed: Bool = false) -> CGPath {\n\t\tif smoothed {\n\t\t\treturn CGPath.byExtrapolatingPoints(points)\n\t\t}\n\t\telse {\n\t\t\treturn CGPath.byPathWithPoints(points)\n\t\t}\n\t}\n\n\tprivate static func byExtrapolatingPoints(_ interpolationPoints: [CGPoint]) -> CGPath {\n\t\tlet newPath = CGMutablePath()\n\t\tnewPath.interpolatePointsWithHermite(interpolationPoints: interpolationPoints)\n\t\treturn newPath\n\t}\n\n\tprivate static func byPathWithPoints(_ points: [CGPoint]) -> CGPath {\n\t\tassert(points.count > 1)\n\t\tlet path = CGMutablePath()\n\t\tpath.move(to: points.first!)\n\t\tfor point in points.dropFirst() {\n\t\t\tpath.addLine(to: point)\n\t\t}\n\t\treturn path\n\t}\n}\n\nextension CGMutablePath {\n\tfunc interpolatePointsWithHermite(interpolationPoints: [CGPoint]) {\n\t\tlet n = interpolationPoints.count - 1\n\n\t\tfor ii in 0 ..< n {\n\t\t\tvar currentPoint = interpolationPoints[ii]\n\n\t\t\tif ii == 0 {\n\t\t\t\tself.move(to: interpolationPoints[0])\n\t\t\t}\n\n\t\t\tvar nextii = (ii + 1) % interpolationPoints.count\n\t\t\tvar previi = (ii - 1 < 0 ? interpolationPoints.count - 1 : ii - 1)\n\t\t\tvar previousPoint = interpolationPoints[previi]\n\t\t\tvar nextPoint = interpolationPoints[nextii]\n\t\t\tlet endPoint = nextPoint\n\t\t\tvar mx: CGFloat = 0.0\n\t\t\tvar my: CGFloat = 0.0\n\n\t\t\tif ii > 0 {\n\t\t\t\tmx = (nextPoint.x - currentPoint.x) * 0.5 + (currentPoint.x - previousPoint.x) * 0.5\n\t\t\t\tmy = (nextPoint.y - currentPoint.y) * 0.5 + (currentPoint.y - previousPoint.y) * 0.5\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmx = (nextPoint.x - currentPoint.x) * 0.5\n\t\t\t\tmy = (nextPoint.y - currentPoint.y) * 0.5\n\t\t\t}\n\n\t\t\tlet controlPoint1 = CGPoint(x: currentPoint.x + mx / 3.0, y: currentPoint.y + my / 3.0)\n\n\t\t\tcurrentPoint = interpolationPoints[nextii]\n\t\t\tnextii = (nextii + 1) % interpolationPoints.count\n\t\t\tprevii = ii\n\t\t\tpreviousPoint = interpolationPoints[previi]\n\t\t\tnextPoint = interpolationPoints[nextii]\n\n\t\t\tif ii < n - 1 {\n\t\t\t\tmx = (nextPoint.x - currentPoint.x) * 0.5 + (currentPoint.x - previousPoint.x) * 0.5\n\t\t\t\tmy = (nextPoint.y - currentPoint.y) * 0.5 + (currentPoint.y - previousPoint.y) * 0.5\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmx = (currentPoint.x - previousPoint.x) * 0.5\n\t\t\t\tmy = (currentPoint.y - previousPoint.y) * 0.5\n\t\t\t}\n\n\t\t\tlet controlPoint2 = CGPoint(x: currentPoint.x - mx / 3.0, y: currentPoint.y - my / 3.0)\n\n\t\t\tself.addCurve(to: endPoint, control1: controlPoint1, control2: controlPoint2)\n\t\t}\n\t}\n}\n\nextension CGPath {\n\n\t/// Fit a bezier path through all of the points.\n\tstatic func InterpolatePointsUsingBezier(points: [CGPoint], f: CGFloat = 0.3, t: CGFloat = 0.6) -> CGPath? {\n\n\t\t// See: https://www.geeksforgeeks.org/how-to-draw-smooth-curve-through-multiple-points-using-javascript/\n\n\t\tlet path = CGMutablePath()\n\n\t\tguard let first: CGPoint = points.first,\n\t\t\t\tpoints.count > 1 else\n\t\t{\n\t\t\treturn nil\n\t\t}\n\n\t\tpath.move(to: first)\n\n\t\tlet remaining = [CGPoint](points.dropFirst())\n\t\tlet pairs: [(CGPoint, CGPoint?)] = remaining.enumerated().map { point in\n\t\t\tlet next: CGPoint? =\n\t\t\t\tpoint.offset < remaining.count - 1 ? remaining[point.offset + 1] : nil\n\t\t\treturn (point.element, next)\n\t\t}\n\n\t\tvar m: CGFloat = 0\n\t\tvar dx1: CGFloat = 0\n\t\tvar dy1: CGFloat = 0\n\t\tvar preP = first\n\n\t\tfor pair in pairs {\n\t\t\tlet curP = pair.0\n\t\t\tlet nexP = pair.1 // This is nil for the last point in the graph\n\n\t\t\tlet dx2: CGFloat\n\t\t\tlet dy2: CGFloat\n\n\t\t\tif let next = nexP {\n\t\t\t\tm = gradient(preP, next)\n\t\t\t\tdx2 = (next.x - curP.x) * -f\n\t\t\t\tdy2 = dx2 * m * t\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdx2 = 0\n\t\t\t\tdy2 = 0\n\t\t\t}\n\n\t\t\tpath.addCurve(to: curP,\n\t\t\t\t\t\t\t  control1: CGPoint(x: preP.x - dx1, y: preP.y - dy1),\n\t\t\t\t\t\t\t  control2: CGPoint(x: curP.x + dx2, y: curP.y + dy2))\n\n\t\t\tdx1 = dx2\n\t\t\tdy1 = dy2\n\t\t\tpreP = curP\n\t\t}\n\n\t\treturn path.copy()\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/CGPath+innerShadow.swift",
    "content": "//\n//  CGPath+innerShadow.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CoreGraphics\nimport Foundation\n\npublic extension CGContext {\n\t/// Draw an inner shadow in the path\n\t/// - Parameters:\n\t///   - path: The path to apply the inner shadow to\n\t///   - shadowColor: Specifies the color of the shadow, which may contain a non-opaque alpha value. If NULL, then shadowing is disabled.\n\t///   - offset: Specifies a translation in base-space.\n\t///   - blurRadius: A non-negative number specifying the amount of blur.\n\t///\n\t/// **Inner Shadows in Quartz: Helftone**\n\t/// [Blog Article](https://blog.helftone.com/demystifying-inner-shadows-in-quartz/)\n\t/// [(Archived)](https://web.archive.org/web/20221206132428/https://blog.helftone.com/demystifying-inner-shadows-in-quartz/)\n\tfunc drawInnerShadow(in path: CGPath, shadowColor: CGColor?, offset: CGSize, blurRadius: CGFloat) {\n\t\tguard\n\t\t\tlet shadowColor = shadowColor,\n\t\t\tlet opaqueShadowColor = shadowColor.copy(alpha: 1.0)\n\t\telse {\n\t\t\treturn\n\t\t}\n\n\t\tself.usingGState { ctx in\n\t\t\tctx.addPath(path)\n\t\t\tctx.clip()\n\t\t\tctx.setAlpha(shadowColor.alpha)\n\t\t\tctx.usingTransparencyLayer {\n\t\t\t\tctx.setShadow(offset: offset, blur: blurRadius, color: opaqueShadowColor)\n\t\t\t\tctx.setBlendMode(.sourceOut)\n\t\t\t\tctx.setFillColor(opaqueShadowColor)\n\t\t\t\tctx.addPath(path)\n\t\t\t\tctx.fillPath()\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/DSFSparkline+Shadow.swift",
    "content": "//\n//  CGContext+extensions.swift\n//\n//  Copyright © 2024 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension DSFSparkline {\n\t/// A shadow object\n\t@objc class Shadow: NSObject {\n\t\t/// The shadow\n\t\tpublic let shadow: NSShadow\n\t\t/// Is the shadow an inner shadow?\n\t\tpublic let isInner: Bool\n\n\t\t/// Create a new shadow object\n\t\t@objc public init(_ shadow: NSShadow, isInner: Bool = false) {\n\t\t\tself.shadow = shadow\n\t\t\tself.isInner = isInner\n\t\t\tsuper.init()\n\t\t}\n\n\t\t/// Create a new shadow object\n\t\t@objc convenience public init(blurRadius: CGFloat, offset: CGSize, color: CGColor, isInner: Bool = false) {\n\t\t\t#if os(macOS)\n\t\t\tlet color: DSFColor = DSFColor(cgColor: color) ?? .black\n\t\t\t#else\n\t\t\tlet color: DSFColor = DSFColor(cgColor: color)\n\t\t\t#endif\n\t\t\tself.init(\n\t\t\t\tNSShadow(blurRadius: blurRadius, offset: offset, color: color),\n\t\t\t\tisInner: isInner\n\t\t\t)\n\t\t}\n\n\t\t/// Shadow offset\n\t\t@inlinable @objc public var offset: CGSize {\n\t\t\tget { shadow.shadowOffset }\n\t\t\tset { shadow.shadowOffset = newValue }\n\t\t}\n\t\t#if os(macOS)\n\t\t/// Shadow color\n\t\t@inlinable @objc public var color: CGColor? {\n\t\t\tget { shadow.shadowColor?.cgColor }\n\t\t\tset { shadow.shadowColor = newValue != nil ? NSColor(cgColor: newValue!) : nil }\n\t\t}\n\t\t#else\n\t\t/// Shadow color\n\t\t@inlinable @objc public var color: CGColor? {\n\t\t\tget { (shadow.shadowColor as? DSFColor)?.cgColor }\n\t\t\tset { shadow.shadowColor = (newValue != nil) ? UIColor(cgColor: newValue!) : nil }\n\t\t}\n\t\t#endif\n\t\t/// Shadow blur radius\n\t\t@inlinable @objc public var blurRadius: CGFloat {\n\t\t\tget { shadow.shadowBlurRadius}\n\t\t\tset { shadow.shadowBlurRadius = newValue }\n\t\t}\n\n\t\t/// Calculate the amount of inset required to cater for drawing a shadow\n\t\t@inlinable internal var requiredShadowInset: CGFloat {\n\t\t\tif self.isInner { return 0 }\n\t\t\tlet dx = (abs(self.offset.width) + self.blurRadius) * 2\n\t\t\tlet dy = (abs(self.offset.height) + self.blurRadius) * 2\n\t\t\treturn max(dx, dy)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/LayerInvalidating.swift",
    "content": "//\n//  LayerInvalidating.swift\n//\n//  Copyright © 2023 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic struct LayerInvalidatingType: OptionSet {\n\tpublic let rawValue: UInt\n\t/// Call 'setNeedsDisplay()' on the layer whenever the property value changes\n\tpublic static let display = LayerInvalidatingType(rawValue: 1 << 0)\n\t/// Call 'setNeedsLayout()' on the layer whenever the property value changes\n\tpublic static let layout = LayerInvalidatingType(rawValue: 1 << 1)\n\tpublic static let all: LayerInvalidatingType = [.display, .layout]\n\tpublic init(rawValue: UInt) {\n\t\tself.rawValue = rawValue\n\t}\n}\n\n/// A property wrapper for CAlayer member properties to force a `setNeedsDisplay()` on the layer\n/// whenever the property changes\n@propertyWrapper\npublic struct LayerInvalidating<Value: Equatable> {\n\t// Stored value\n\tprivate var valueType: Value\n\n\t// The invalidation types for the property\n\tprivate let invalidationType: LayerInvalidatingType\n\n\t/// Wrapped value\n\tpublic var wrappedValue: Value {\n\t\tget {\tself.valueType }\n\t\tset { self.valueType = newValue }\n\t}\n\n\t/// Initialize with a built-in invalidating type(s).\n\tpublic init(wrappedValue: Value, _ invalidationType: LayerInvalidatingType) {\n\t\tself.valueType = wrappedValue\n\t\tself.invalidationType = invalidationType\n\t}\n\n\tpublic static subscript<EnclosingSelf: CALayer>(\n\t\t_enclosingInstance object: EnclosingSelf,\n\t\twrapped _: ReferenceWritableKeyPath<EnclosingSelf, Value>,\n\t\tstorage storageKeyPath: ReferenceWritableKeyPath<EnclosingSelf, LayerInvalidating<Value>>\n\t) -> Value {\n\t\tget {\n\t\t\treturn object[keyPath: storageKeyPath].wrappedValue\n\t\t}\n\t\tset {\n\t\t\tobject[keyPath: storageKeyPath].updateLayerInvalidatingPropertyWrapper(newValue, object)\n\t\t}\n\t}\n\n\tmutating func updateLayerInvalidatingPropertyWrapper(_ value: Value, _ layer: CALayer) {\n\t\tguard self.wrappedValue != value else { return }\n\n\t\t// Update the wrapped value\n\t\tself.wrappedValue = value\n\n\t\t// And trigger the invalidations associated with the propertywrapper\n\t\tif self.invalidationType.contains(.display) { layer.setNeedsDisplay() }\n\t\tif self.invalidationType.contains(.layout) { layer.setNeedsLayout() }\n\t}\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/NSShadow+extensions.swift",
    "content": "//\n//  NSShadow+extensions.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension NSShadow {\n\t@objc convenience init(blurRadius: CGFloat, offset: CGSize, color: DSFColor) {\n\t\tself.init()\n\t\t\n\t\tself.shadowBlurRadius = blurRadius\n\t\tself.shadowOffset = offset\n\t\tself.shadowColor = color\n\t}\n}\n\nextension CGContext {\n\t@inlinable func setShadow(_ shadow: NSShadow) {\n#if os(macOS)\n\t\tlet color = shadow.shadowColor\n#else\n\t\tlet color = shadow.shadowColor as? UIColor\n#endif\n\t\t\n\t\tself.setShadow(\n\t\t\toffset: shadow.shadowOffset,\n\t\t\tblur: shadow.shadowBlurRadius,\n\t\t\tcolor: color?.cgColor)\n\t}\n}\n\n// Static definition of the 'default' shadow.\nprivate let _NSShadowDefaultValue = NSShadow(\n\tblurRadius: 1.0,\n\toffset: CGSize(width: 0.5, height: 0.5),\n\tcolor: DSFColor.black.withAlphaComponent(0.3)\n)\n\ninternal extension NSShadow {\n\t/// The default shadow\n\t@objc static let sparklineDefault = _NSShadowDefaultValue\n}\n"
  },
  {
    "path": "Sources/DSFSparkline/util/Utilities.swift",
    "content": "//\n//  Utilities.swift\n//  DSFSparklines\n//\n//  Created by Darren Ford on 20/12/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport CoreGraphics.CGContext\n\n#if os(macOS)\nimport AppKit\npublic typealias DSFColor = NSColor\npublic typealias DSFView = NSView\npublic typealias DSFFont = NSFont\npublic typealias DSFEdgeInsets = NSEdgeInsets\npublic typealias DSFImage = NSImage\n#else\nimport UIKit\npublic typealias DSFColor = UIColor\npublic typealias DSFView = UIView\npublic typealias DSFFont = UIFont\npublic typealias DSFEdgeInsets = UIEdgeInsets\npublic typealias DSFImage = UIImage\n#endif\n\n#if canImport(SwiftUI)\nimport SwiftUI\n#if os(macOS)\n@available(macOS 10.15, *)\ntypealias DSFViewRepresentable = NSViewRepresentable\n#else\n@available(iOS 13.0, tvOS 13.0, *)\ntypealias DSFViewRepresentable = UIViewRepresentable\n#endif\n#endif\n\nextension ExpressibleByIntegerLiteral where Self: Comparable {\n\t/// Clamp a value to a closed range\n\t/// - Parameter range: the range to clamp to\n\t@inlinable func clamped(to range: ClosedRange<Self>) -> Self {\n\t\treturn min(max(self, range.lowerBound), range.upperBound)\n\t}\n}\n\npublic extension CGGradient {\n\tstatic func Create(_ definition: [(position: CGFloat, color: CGColor)],\n\t\t\t\t\t\t\t colorSpace: CGColorSpace? = nil) -> CGGradient {\n\t\treturn CGGradient(\n\t\t\tcolorsSpace: colorSpace,\n\t\t\tcolors: definition.map { $0.1 } as CFArray, // [c1, c2] as CFArray,\n\t\t\tlocations: definition.map { $0.0 } //[1.0, 0.0]\n\t\t)!\n\t}\n}\n\nextension DSFView {\n\t#if os(macOS)\n\t@objc func retinaScale() -> CGFloat {\n\t\treturn self.window?.screen?.backingScaleFactor ?? 1.0\n\t}\n\t@inlinable func setNeedsDisplay() { self.needsDisplay = true }\n\t#else\n\t@objc func retinaScale() -> CGFloat {\n\t\treturn self.window?.screen.scale ?? 1.0\n\t}\n\t#endif\n}\n\nextension CGPoint {\n\t@inlinable func offsettingX(by value: CGFloat) -> CGPoint {\n\t\treturn CGPoint(x: self.x + value, y: self.y)\n\t}\n\t@inlinable func offsettingY(by value: CGFloat) -> CGPoint {\n\t\treturn CGPoint(x: self.x, y: self.y + value)\n\t}\n}\n\n/// Return the slope of the line joining points a and b\n@inlinable func gradient(_ a: CGPoint, _ b: CGPoint) -> CGFloat {\n\treturn (b.y - a.y) / (b.x - a.x)\n}\n\n// MARK: - NSView/UIView snapshot\n\n#if os(macOS)\npublic extension NSView {\n\t@objc func snapshot() -> NSImage? {\n\t\tguard let bitmapRep = self.bitmapImageRepForCachingDisplay(in: self.bounds) else { return nil }\n\t\tself.cacheDisplay(in: self.bounds, to: bitmapRep)\n\t\tlet image = NSImage()\n\t\timage.addRepresentation(bitmapRep)\n\t\treturn image\n\t}\n}\n#else\npublic extension UIView {\n\t@objc func snapshot() -> UIImage {\n\t\tif #available(iOS 10.0, tvOS 10.0, *) {\n\t\t\tlet renderer = UIGraphicsImageRenderer(bounds: bounds)\n\t\t\treturn renderer.image { rendererContext in\n\t\t\t\tlayer.render(in: rendererContext.cgContext)\n\t\t\t}\n\t\t} else {\n\t\t\tUIGraphicsBeginImageContext(self.frame.size)\n\t\t\tself.layer.render(in:UIGraphicsGetCurrentContext()!)\n\t\t\tlet image = UIGraphicsGetImageFromCurrentImageContext()\n\t\t\tUIGraphicsEndImageContext()\n\t\t\treturn UIImage(cgImage: image!.cgImage!)\n\t\t}\n\t}\n}\n#endif\n\n// MARK: -\n\n@discardableResult\n@inlinable internal func UpdateIfNotEqual<T>(result: inout T, val: T) -> Bool where T: Equatable {\n\tif result != val {\n\t\tresult = val\n\t\treturn true\n\t}\n\treturn false\n}\n\n// MARK: - Debugging utils\n\n// Simple method to draw a rectangle in a context (usually for testing)\nfunc DrawRect(primary: CGContext, rect: CGRect, color: CGColor = DSFColor.systemRed.cgColor) {\n\tprimary.usingGState { (outer) in\n\t\touter.addRect(rect)\n\t\touter.setLineWidth(0.5)\n\t\touter.setStrokeColor(color)\n\t\touter.strokePath()\n\t}\n}\n\n#if !os(macOS)\nextension CGColor {\n\tstatic var black: CGColor { CGColor(gray: 0, alpha: 1) }\n\tstatic var white: CGColor { CGColor(gray: 1, alpha: 1) }\n\tstatic var clear: CGColor { CGColor(gray: 0, alpha: 0) }\n}\n#endif\n\nextension String {\n\tfunc extractCGFloats() -> [CGFloat] {\n\t\tlet components = self.split(separator: \",\")\n\t\tlet floats: [CGFloat] = components\n\t\t\t.map { String($0).trimmingCharacters(in: .whitespacesAndNewlines) } // Convert to string array\n\t\t\t.compactMap { Float($0) } // Convert to float array if possible\n\t\t\t.compactMap { CGFloat($0) } // Convert to CGFloat array\n\t\treturn floats\n\t}\n}\n\n// Returns the first item in the specified array which is non-nil. If all elements are nil, returns nil\n@inlinable internal func firstNotNil<T>(_ items: [T?]) -> T? {\n\tif let first = items.first(where: { $0 != nil }) {\n\t\treturn first\n\t}\n\treturn nil\n}\n\n// A CATextLayer that vertically centers its content\nclass LCTextLayer : CATextLayer {\n\n\t// REF: http://lists.apple.com/archives/quartz-dev/2008/Aug/msg00016.html\n\t// CREDIT: David Hoerl - https://github.com/dhoerl\n\t// USAGE: To fix the vertical alignment issue that currently exists within the CATextLayer class. Change made to the yDiff calculation.\n\n\toverride func draw(in context: CGContext) {\n\t\tlet height = self.bounds.size.height\n\t\tlet fontSize = self.fontSize\n\t\tlet yDiff = (height-fontSize)/2 - fontSize/10\n\n\t\tcontext.saveGState()\n\t\tcontext.translateBy(x: 0, y: yDiff) // Use -yDiff when in non-flipped coordinates (like macOS's default)\n\t\tsuper.draw(in: context)\n\t\tcontext.restoreGState()\n\t}\n}\n\n\nextension CGColor {\n\t/// Returns a black or white contrasting color for this color\n\t/// - Parameter defaultColor: If the color cannot be converted to the genericRGB colorspace, or the input color is .clear, the fallback color\n\t/// - Returns: black or white depending on which provides the greatest contrast to this color\n\tfunc flatContrastColor(defaultColor: CGColor = CGColor.DefaultBlack) -> CGColor {\n\t\tguard self != CGColor.clear,\n\t\t\tlet rgbColor = self.converted(to: CGColorSpace(name: CGColorSpace.sRGB)!,\n\t\t\t\t\t\t\t\t\t\t\t\t\tintent: .perceptual,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptions: nil) else {\n\t\t\treturn defaultColor\n\t\t}\n\n\t\tlet r = 0.299 * rgbColor.components![0]\n\t\tlet g = 0.587 * rgbColor.components![1]\n\t\tlet b = 0.114 * rgbColor.components![2]\n\t\tlet avgGray: CGFloat = 1 - (r + g + b)\n\t\treturn (avgGray >= 0.45) ? CGColor.DefaultWhite : CGColor.DefaultBlack\n\t}\n}\n\nextension CGColor {\n\n\tstatic let DefaultWhite = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 1, 1, 1])!\n\tstatic let DefaultBlack = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 0, 0, 1])!\n\tstatic let DefaultClear = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 1, 1, 0])!\n}\n\n// MARK: - CATextLayer extensions\n\nextension CATextLayer {\n\tfunc font() -> DSFFont? {\n\t\tif let f = self.font as? DSFFont {\n\t\t\treturn f //return DSFFont(name: f.fontName, size: self.fontSize)\n\t\t}\n\t\telse if let s = self.font as? String {\n\t\t\treturn DSFFont(name: s, size: self.fontSize)\n\t\t}\n\t\telse {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tfunc attributedString() -> NSAttributedString {\n\t\tif let asv = self.string as? NSAttributedString {\n\t\t\treturn asv\n\t\t}\n\t\telse if let s = self.string as? String {\n\t\t\tlet attrs = [NSAttributedString.Key.font: self.font() as Any]\n\t\t\treturn NSAttributedString(string: s, attributes: attrs)\n\t\t}\n\t\telse {\n\t\t\tfatalError()\n\t\t}\n\t}\n\n\t/// Get the required bounds for the text layer content given `size` constraints\n\tfunc textBounds(for size: CGSize) -> CGSize {\n\n\t\t#if os(macOS)\n\t\tlet options: NSString.DrawingOptions = [NSString.DrawingOptions.usesFontLeading, NSString.DrawingOptions.usesLineFragmentOrigin]\n\t\t#else\n\t\tlet options: NSStringDrawingOptions = [NSStringDrawingOptions.usesFontLeading, NSStringDrawingOptions.usesLineFragmentOrigin]\n\t\t#endif\n\n\t\tlet ttt = self.attributedString()\n\t\tlet br = ttt.boundingRect(\n\t\t\twith: CGSize(width: size.width, height: size.height),\n\t\t\toptions: options,\n\t\t\tcontext: nil)\n\t\treturn br.size\n\t}\n}\n\nextension CATransaction {\n\t/// Perform 'body' without implicit animations\n\t///\n\t/// - Parameters:\n\t///   - body: The block to execute without implicit animations\n\t///\n\t/// Example :-\n\t/// ```\n\t/// CATransaction.withDisabledActions {\n\t///     self.checkerboardLayer.image.frame = self.bounds\n\t///     ...\n\t/// }\n\t/// ```\n\tclass func withDisabledActions<T>(_ body: () throws -> T) rethrows -> T {\n\t\tCATransaction.begin()\n\t\tCATransaction.setDisableActions(true)\n\t\tdefer {\n\t\t\tCATransaction.commit()\n\t\t}\n\t\treturn try body()\n\t}\n}\n\n#if os(macOS)\nextension CGRect {\n\t/// Inset this rect by the amount specified in `insets`.\n\t@inlinable func inset(by insets: NSEdgeInsets) -> CGRect {\n\t\tvar result = self\n\t\tresult.origin.x    += insets.left\n\t\tresult.origin.y    += insets.top\n\t\tresult.size.width  -= (insets.left + insets.right)\n\t\tresult.size.height -= (insets.top  + insets.bottom)\n\t\treturn result\n\t}\n}\n#endif\n\nextension DSFEdgeInsets {\n\t/// A default zero inset\n\tstatic let zero = DSFEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)\n\n\t/// Calculate the maximum insets between the two edgeinset objects\n\t@inlinable func combineMaximum(using other: DSFEdgeInsets) -> DSFEdgeInsets {\n\t\treturn DSFEdgeInsets(top: max(self.top, other.top),\n\t\t\t\t\t\t\t\t\tleft: max(self.left, other.left),\n\t\t\t\t\t\t\t\t\tbottom: max(self.bottom, other.bottom),\n\t\t\t\t\t\t\t\t\tright: max(self.right, other.right))\n\t}\n}\n\nextension Array {\n\t/// Return a copy of this array with 'element' appended\n\t@inlinable func appending(_ element: Element) -> Self {\n\t\tvar result = self\n\t\tresult.append(element)\n\t\treturn result\n\t}\n\n\t/// Return a copy of this array with an array of 'element' appended\n\t@inlinable func appending(contentsOf elements: [Element]) -> Self {\n\t\tvar result = self\n\t\tresult.append(contentsOf: elements)\n\t\treturn result\n\t}\n}\n\nextension CGImage {\n\tfunc flipped() -> CGImage? {\n\t\tlet bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)\n\t\tlet flipped = CGContext(\n\t\t\tdata: nil,\n\t\t\twidth: self.width,\n\t\t\theight: self.height,\n\t\t\tbitsPerComponent: 8,\n\t\t\tbytesPerRow: 0,\n\t\t\tspace: CGColorSpaceCreateDeviceRGB(),\n\t\t\tbitmapInfo: bitmapInfo.rawValue\n\t\t)!\n\n\t\t// Flip the context\n\t\tflipped.translateBy(x: 0, y: CGFloat(height))\n\t\tflipped.scaleBy(x: 1.0, y: -1.0)\n\n\t\t// Draw the image into the context\n\t\tflipped.draw(self, in: CGRect(x: 0, y: 0, width: self.width, height: self.height))\n\n\t\t// Create a new CGImage from the context\n\t\treturn flipped.makeImage()\n\t}\n}\n"
  },
  {
    "path": "Tests/DSFSparklineTests/CircularGaugeTests.swift",
    "content": "//\n//  CircularGaugeTests.swift\n//\n//\n//  Created by Darren Ford on 12/3/2024.\n//\n\nimport XCTest\n@testable import DSFSparkline\nimport SwiftImageReadWrite\n\nprivate let outputFolder = try! testResultsContainer.subfolder(with: \"circular-gauge\")\nprivate let imagesFolder = try! outputFolder.subfolder(with: \"images\")\nprivate let imageStore = ImageOutput(imagesFolder)\nprivate var markdownText = \"# Circular Gauge\\n\\n\"\n\nfinal class CircularGaugeTests: XCTestCase {\n\n\toverride func setUpWithError() throws {\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\n\toverride func tearDownWithError() throws {\n\t\ttry! outputFolder.write(markdownText, to: \"circular-gauge.md\", encoding: .utf8)\n\t}\n\n\tfunc testSizing() throws {\n\t\tmarkdownText += \"## Sizing\\n\\n\"\n\n\t\ttry [16, 32, 48].forEach { sz in\n\t\t\ttry stride(from: 0, through: 1, by: 0.1).forEach { value in\n\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\t\t\t\ta1.value = value\n\t\t\t\tb1.addOverlay(a1)\n\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: sz, height: sz), scale: 2))\n\t\t\t\tlet filename = \"circular-gauge-ex-\\(sz)-\\(value).png\"\n\t\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"\\(sz)\\\" /></a>\\n\"\n\t\t\t}\n\t\t\tmarkdownText += \"\\n\"\n\t\t}\n\t}\n\n\tfunc testTrackInset() throws {\n\t\tmarkdownText += \"## Track inset\\n\\n\"\n\n\t\tlet tfc = DSFSparklineOverlay.CircularGauge.TrackStyle(\n\t\t\twidth: 10, \n\t\t\tfillColor: DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1, alpha: 0.1)\n\t\t)\n\t\tlet vfc = DSFSparklineOverlay.CircularGauge.TrackStyle(\n\t\t\twidth: 6,\n\t\t\tfillColor: DSFSparkline.Fill.Color(srgbRed: 0.2, green: 0.2, blue: 0.9),\n\t\t\tstrokeColor: CGColor.sRGBA(0, 0, 1)\n\t\t)\n\n\t\ttry [false, true].forEach { hasShadow in\n\t\t\tif hasShadow {\n\t\t\t\tmarkdownText += \"### Shadowed\\n\\n\"\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmarkdownText += \"### No Shadow\\n\\n\"\n\t\t\t}\n\t\t\ttry [10, 8, 6, 4].forEach { tw in\n\t\t\t\ttry stride(from: 0, through: 1, by: 0.1).forEach { value in\n\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\t\t\t\t\ta1.value = value\n\t\t\t\t\ta1.trackStyle = tfc\n\t\t\t\t\tvfc.width = CGFloat(tw)\n\t\t\t\t\ta1.lineStyle = vfc\n\n\t\t\t\t\tif hasShadow {\n\t\t\t\t\t\tvfc.shadow = .init(blurRadius: 3, offset: CGSize(width: 2, height: -3), color: .black)\n\t\t\t\t\t}\n\n\t\t\t\t\tb1.addOverlay(a1)\n\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 48, height: 48), scale: 2))\n\t\t\t\t\tlet filename = \"circular-gauge-inset-\\(hasShadow)-\\(tw)-\\(value).png\"\n\t\t\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"\\(48)\\\" /></a>\\n\"\n\t\t\t\t}\n\t\t\t\tmarkdownText += \"\\n\"\n\t\t\t}\n\t\t}\n\t}\n\n\tfunc testTrackShadow() throws {\n\t\tmarkdownText += \"## Shadowing\\n\\n\"\n\n\t\tmarkdownText += \"\\n### Track/Value shadows\\n\\n\"\n\n\t\tmarkdownText += \"| none    |  track only  |  value only  |  both   |\\n\"\n\t\tmarkdownText += \"|---------|--------------|--------------|---------|\\n\"\n\t\tmarkdownText += \"|\"\n\n\t\ttry [false, true].forEach { (lineShadow: Bool) in\n\t\t\ttry [false, true].forEach { (trackShadow: Bool) in\n\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\t\t\t\ta1.value = 0.65\n\n\t\t\t\ta1.trackStyle.width = 10\n\t\t\t\ta1.lineStyle.width = 4\n\n\t\t\t\tif trackShadow {\n\t\t\t\t\ta1.trackStyle.shadow = .init(blurRadius: 2, offset: CGSize(width: 1, height: -1), color: CGColor.sRGBA(0, 0, 1))\n\t\t\t\t}\n\t\t\t\tif lineShadow {\n\t\t\t\t\ta1.lineStyle.shadow = .init(blurRadius: 2, offset: CGSize(width: 1, height: -1), color: CGColor.sRGBA(1, 0, 0))\n\t\t\t\t}\n\n\t\t\t\tb1.addOverlay(a1)\n\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 48, height: 48), scale: 2))\n\t\t\t\tlet filename = \"circular-gauge-inset-\\(trackShadow)-\\(lineShadow).png\"\n\t\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"\\(48)\\\" /></a>|\"\n\t\t\t}\n\t\t}\n\n\t\tmarkdownText += \"|\\n\\n\"\n\n\t\tmarkdownText += \"### Shadow Offset\\n\\n\"\n\n\t\tmarkdownText += \"| -2, -2  |  -2, 2  |  2, -2  |  2, 2   |  4, 0  |  0, 4  |\\n\"\n\t\tmarkdownText += \"|---------|---------|---------|---------|--------|--------|\\n\"\n\t\tmarkdownText += \"|\"\n\n\t\ttry [(-2, -2), (-2, 2), (2, -2), (2, 2), (4, 0), (0, 4)].forEach { offset in\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\tlet sh = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: offset.0, height: offset.1), color: .black)\n\n\t\t\ta1.value = 0.65\n\t\t\ta1.trackStyle.width = 20\n\t\t\ta1.trackStyle.shadow = sh\n\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0)\n\t\t\ta1.lineStyle.shadow = sh\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-offset-standardshadow-\\(offset).png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>\"\n\t\t\tmarkdownText += \"|\"\n\t\t}\n\t\tmarkdownText += \"|\\n\\n\"\n\t}\n\n\tfunc testTrackShadowInset() throws {\n\t\tmarkdownText += \"## Inner Shadows\\n\\n\"\n\n\t\tlet innerShadow = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: 2, height: -2), color: .black, isInner: true)\n\t\tlet outerShadow = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: 2, height: -2), color: .black, isInner: false)\n\n\t\tmarkdownText += \"\\n### Track/Value shadows\\n\\n\"\n\n\t\tmarkdownText += \"| none  |  track only  |  value only  |  both   |  in/out |\\n\"\n\t\tmarkdownText += \"|---------|---------|---------|---------|---------|\\n\"\n\t\tmarkdownText += \"|\"\n\n\t\tenum OTS: CaseIterable {\n\t\t\tcase none\n\t\t\tcase track\n\t\t\tcase value\n\t\t\tcase all\n\t\t}\n\n\t\ttry OTS.allCases.forEach { useTrackInner in\n\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\ta1.value = 0.65\n\t\t\ta1.trackStyle.width = 20\n\n\t\t\tif useTrackInner == .track || useTrackInner == .all {\n\t\t\t\ta1.trackStyle.shadow = innerShadow\n\t\t\t}\n\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0)\n\t\t\ta1.lineStyle.strokeColor = CGColor.standard.yellow\n\t\t\ta1.lineStyle.strokeWidth = 0.1\n\n\t\t\tif useTrackInner == .value || useTrackInner == .all {\n\t\t\t\ta1.lineStyle.shadow = innerShadow\n\t\t\t}\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-inner-\\(useTrackInner).png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>|\"\n\t\t}\n\n\t\tdo {\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\ta1.value = 0.65\n\t\t\ta1.trackStyle.width = 20\n\t\t\ta1.trackStyle.shadow = innerShadow\n\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0)\n\t\t\ta1.lineStyle.shadow = outerShadow\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-inner-inout.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>|\\n\\n\"\n\t\t}\n\n\t\tmarkdownText += \"\\n### Shadow Offset\\n\\n\"\n\n\t\tmarkdownText += \"| -2, -2  |  -2, 2  |  2, -2  |  2, 2   |\\n\"\n\t\tmarkdownText += \"|---------|---------|---------|---------|\\n\"\n\t\tmarkdownText += \"|\"\n\n\t\ttry [(-2, -2), (-2, 2), (2, -2), (2, 2)].forEach { offset in\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\tlet sh = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: offset.0, height: offset.1), color: .black, isInner: true)\n\n\t\t\ta1.value = 0.65\n\t\t\ta1.trackStyle.width = 20\n\t\t\ta1.trackStyle.shadow = sh\n\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0)\n\t\t\ta1.lineStyle.shadow = sh\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-offset-\\(offset).png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>\"\n\t\t\tmarkdownText += \"|\"\n\t\t}\n\t\tmarkdownText += \"|\\n\\n\"\n\n\n\t}\n\n\tfunc testTrackShadowInset2() throws {\n\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\t\tlet innerShadow = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: 2, height: -2), color: .black, isInner: true)\n\n\t\ta1.value = 0.65\n\t\ta1.trackStyle.width = 20\n\t\ta1.lineStyle.width = 15\n\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0)\n\t\ta1.lineStyle.shadow = innerShadow\n\n\t\tb1.addOverlay(a1)\n\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\tSwift.print(image)\n\t}\n}\n"
  },
  {
    "path": "Tests/DSFSparklineTests/CircularProgressTests.swift",
    "content": "//\n//  CircularProgressTests.swift\n//\n//\n//  Created by Darren Ford on 1/3/2024.\n//\n\nimport XCTest\n@testable import DSFSparkline\nimport SwiftImageReadWrite\n\nprivate let outputFolder = try! testResultsContainer.subfolder(with: \"circular-progress\")\nprivate let imagesFolder = try! outputFolder.subfolder(with: \"images\")\nprivate let imageStore = ImageOutput(imagesFolder)\nprivate var markdownText = \"# Circular Progress\\n\\n\"\n\nfinal class CircularProgressTests: XCTestCase {\n\n\toverride class func tearDown() {\n\t\ttry! outputFolder.write(markdownText, to: \"circular-progress.md\", encoding: .utf8)\n\t}\n\n\toverride func setUpWithError() throws {\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\n\toverride func tearDownWithError() throws {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t}\n\n\tfunc testBasic() throws {\n\t\tdo {\n\t\t\tmarkdownText += \"### Inline documentation\\n\\n\"\n\n\t\t\ttry stride(from: 0, through: 1, by: 0.333).forEach { value in\n\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\ta1.fillStyle = primaryPoke\n\t\t\t\ta1.trackColor = primaryPoke.color.copy(alpha: 0.3)!\n\t\t\t\ta1.trackWidth = 3\n\t\t\t\ta1.value = value\n\t\t\t\tb1.addOverlay(a1)\n\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 16, height: 16), scale: 2))\n\t\t\t\tlet filename = \"circular-poke-\\(value).png\"\n\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"16\\\" /></a>\\n\"\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\n\t\t\tdo {\n\n\t\t\t\tmarkdownText += \"### Flat\\n\\n\"\n\n\t\t\t\tvar count = 1\n\n\t\t\t\ttry stride(from: 0, through: 2, by: 0.2).forEach { value in\n\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\ta1.fillStyle = DSFSparkline.Fill.Color(srgbRed: 0.5, green: 0, blue: 1, alpha: 1)\n\t\t\t\t\ta1.trackColor = CGColor(srgbRed: 0.5, green: 0, blue: 1, alpha: 0.2)\n\t\t\t\t\ta1.value = value\n\t\t\t\t\tb1.addOverlay(a1)\n\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 48, height: 48), scale: 2))\n\t\t\t\t\tlet filename = \"circular-\\(count).png\"\n\t\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"32\\\" /></a>\\n\"\n\t\t\t\t\tcount += 1\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\n\t\t\tdo {\n\t\t\t\tmarkdownText += \"### Gradient\\n\\n\"\n\n\t\t\t\tlet gradient = DSFSparkline.Fill.Gradient(\n\t\t\t\t\tcolors: [\n\t\t\t\t\t\tCGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 1.0),\n\t\t\t\t\t\tCGColor(srgbRed: 0.891, green: 0.000, blue: 0.090, alpha: 1.0),\n\t\t\t\t\t]\n\t\t\t\t)\n\n\t\t\t\tvar count = 1\n\t\t\t\ttry stride(from: 0, through: 2, by: 0.2).forEach { value in\n\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\ta1.fillStyle = gradient\n\t\t\t\t\ta1.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\ta1.value = value\n\t\t\t\t\tb1.addOverlay(a1)\n\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 48, height: 48), scale: 2))\n\t\t\t\t\tlet filename = \"circular-radial-\\(count).png\"\n\t\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"32\\\" /></a>\\n\"\n\t\t\t\t\tcount += 1\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\n\t\t\tdo {\n\t\t\t\tmarkdownText += \"### Nested\\n\\n\"\n\n\t\t\t\ttry [48, 64, 80].forEach { dimension in\n\n\t\t\t\t\tvar count = 1\n\t\t\t\t\ttry stride(from: 0, through: 1, by: 0.2).forEach { value in\n\t\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\t\ta1.fillStyle = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 1)\n\t\t\t\t\t\ta1.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\t\ta1.value = value\n\t\t\t\t\t\ta1.trackWidth = 5\n\t\t\t\t\t\tb1.addOverlay(a1)\n\n\t\t\t\t\t\tlet a2 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\t\ta2.fillStyle = DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1, alpha: 1)\n\t\t\t\t\t\ta2.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\t\ta2.trackWidth = 5\n\t\t\t\t\t\ta2.padding = 7\n\t\t\t\t\t\ta2.value = min(value + 0.1, 1.0)\n\t\t\t\t\t\tb1.addOverlay(a2)\n\n\t\t\t\t\t\tlet a3 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\t\ta3.fillStyle = DSFSparkline.Fill.Color(srgbRed: 0, green: 1, blue: 0, alpha: 1)\n\t\t\t\t\t\ta3.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\t\ta3.trackWidth = 5\n\t\t\t\t\t\ta3.padding = 14\n\t\t\t\t\t\ta3.value = min(value + 0.05, 1.0)\n\t\t\t\t\t\tb1.addOverlay(a3)\n\n\t\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: dimension, height: dimension), scale: 2))\n\t\t\t\t\t\tlet filename = \"circular-radial-2overlay\\(count)-\\(dimension).png\"\n\t\t\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"\\(dimension / 2)\\\" /></a>\\n\"\n\t\t\t\t\t\tcount += 1\n\t\t\t\t\t}\n\n\t\t\t\t\tmarkdownText += \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\n\t\t\tdo {\n\t\t\t\tmarkdownText += \"### Track width\\n\\n\"\n\n\t\t\t\ttry stride(from: 2, through: 12, by: 2).forEach { width in\n\n\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\ta1.fillStyle = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 1)\n\t\t\t\t\ta1.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\ta1.value = 0.65\n\t\t\t\t\ta1.trackWidth = CGFloat(width)\n\t\t\t\t\tb1.addOverlay(a1)\n\n\t\t\t\t\tlet a2 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\ta2.fillStyle = DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1, alpha: 1)\n\t\t\t\t\ta2.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\ta2.trackWidth = width\n\t\t\t\t\ta2.padding = 7\n\t\t\t\t\ta2.value = 0.25\n\t\t\t\t\tb1.addOverlay(a2)\n\n\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 48, height: 48), scale: 2))\n\t\t\t\t\tlet filename = \"circular-trackwidth-\\(width).png\"\n\t\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"48\\\" /></a>\\n\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\n\t\t\tdo {\n\t\t\t\tmarkdownText += \"### Track padding\\n\\n\"\n\n\t\t\t\ttry stride(from: 0, through: 10, by: 2).forEach { padding in\n\n\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\ta1.fillStyle = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 1)\n\t\t\t\t\ta1.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\ta1.value = 0.65\n\t\t\t\t\ta1.trackWidth = 4\n\t\t\t\t\tb1.addOverlay(a1)\n\n\t\t\t\t\tlet a2 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\ta2.fillStyle = DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1, alpha: 1)\n\t\t\t\t\ta2.trackColor = CGColor(gray: 0.5, alpha: 0.2)\n\t\t\t\t\ta2.trackWidth = 4\n\t\t\t\t\ta2.padding = padding\n\t\t\t\t\ta2.value = 0.25\n\t\t\t\t\tb1.addOverlay(a2)\n\n\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 48, height: 48), scale: 2))\n\t\t\t\t\tlet filename = \"circular-trackpadding-\\(padding).png\"\n\t\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"48\\\" /></a>\\n\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\n\t\t\tdo {\n\t\t\t\tmarkdownText += \"### Health rings\\n\\n\"\n\n\t\t\t\tlet g = DSFSparkline.Fill.Gradient(\n\t\t\t\t\tcolors: [\n\t\t\t\t\t\tCGColor(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 1.0),\n\t\t\t\t\t\tCGColor(srgbRed: 0.891, green: 0.000, blue: 0.090, alpha: 1.0),\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t\tlet g1 = DSFSparkline.Fill.Gradient(\n\t\t\t\t\tcolors: [\n\t\t\t\t\t\tCGColor(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 1.0),\n\t\t\t\t\t\tCGColor(srgbRed: 0.601, green: 1.000, blue: 0.009, alpha: 1.0),\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t\tlet g2 = DSFSparkline.Fill.Gradient(\n\t\t\t\t\tcolors: [\n\t\t\t\t\t\tCGColor(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 1.0),\n\t\t\t\t\t\tCGColor(srgbRed: 0.015, green: 0.847, blue: 1.000, alpha: 1.0),\n\t\t\t\t\t]\n\t\t\t\t)\n\n\t\t\t\ttry [0.0, 0.33, 0.66, 1.0].forEach { index in\n\n\t\t\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\t\t\tdo {\n\t\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\t\ta1.value = index\n\t\t\t\t\t\ta1.fillStyle = g\n\t\t\t\t\t\ta1.trackWidth = 10\n\t\t\t\t\t\ta1.trackColor = .init(srgbRed: 0.977, green: 0.221, blue: 0.520, alpha: 0.1)\n\t\t\t\t\t\tb1.addOverlay(a1)\n\t\t\t\t\t}\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\t\ta1.value = index * 0.8\n\t\t\t\t\t\ta1.fillStyle = g1\n\t\t\t\t\t\ta1.trackWidth = 10\n\t\t\t\t\t\ta1.padding = 12\n\t\t\t\t\t\ta1.trackColor = .init(srgbRed: 0.849, green: 1.000, blue: 0.000, alpha: 0.1)\n\t\t\t\t\t\tb1.addOverlay(a1)\n\t\t\t\t\t}\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\tlet a1 = DSFSparklineOverlay.CircularProgress()\n\t\t\t\t\t\ta1.value = index * 0.6\n\t\t\t\t\t\ta1.fillStyle = g2\n\t\t\t\t\t\ta1.trackWidth = 10\n\t\t\t\t\t\ta1.padding = 24\n\t\t\t\t\t\ta1.trackColor = .init(srgbRed: 0.000, green: 1.000, blue: 0.663, alpha: 0.1)\n\t\t\t\t\t\tb1.addOverlay(a1)\n\t\t\t\t\t}\n\n\t\t\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 96, height: 96), scale: 2))\n\t\t\t\t\tlet filename = \"circular-health-\\(index).png\"\n\t\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"96\\\" /></a>\\n\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarkdownText += \"\\n\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tests/DSFSparklineTests/DSFSparklineTests.swift",
    "content": "//\n//  DSFSparklinesTests.swift\n//  DSFSparklinesTests\n//\n//  Created by Darren Ford on 20/6/19.\n//  Copyright © 2019 Darren Ford. All rights reserved.\n//\n//  MIT license\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n//  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n//  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n//  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n//  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n//  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n//  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport XCTest\n@testable import DSFSparkline\n\n// A temporary file container to hold results\ninternal let testResultsContainer = try! TestFilesContainer(named: \"DSFSparkline_Tests\")\n\nclass DSFSparklineTests: XCTestCase {\n\n\toverride func setUp() {\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\n\toverride func tearDown() {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t}\n\n\tfunc testFixForWindowSizeSmallerThanInitialDataIssues() {\n\n\t\t// Testing for https://github.com/dagronf/DSFSparkline/issues/3\n\n\t\tlet ds = SparklineWindow<CGFloat>(windowSize: 5, dataRange: (-10 ... 10))\n\n\t\tds.push(values: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])\n\t\tXCTAssertEqual(ds.raw.count, 5)\n\t}\n\n\tfunc testBlah() {\n\n\t\tlet dd = SparklineWindow<CGFloat>(windowSize: 10, dataRange: (-100 ... 100))\n\n\t\t// Default values for the initializer\n\t\tXCTAssertEqual(dd.raw.count, 10)\n\t\tXCTAssertEqual(dd.normalized.count, 10)\n\n\t\tXCTAssertEqual(dd.raw, [-100, -100, -100, -100, -100, -100, -100, -100, -100, -100])\n\t\tXCTAssertEqual(dd.normalized, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n\n\t\tXCTAssertTrue(dd.push(value: 0))\n\t\tXCTAssertTrue(dd.push(value: 1))\n\n\t\tXCTAssertEqual(dd.raw.count, 10)\n\t\tXCTAssertEqual(dd.normalized.count, 10)\n\n\t\tXCTAssertEqual(dd.normalized, [0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.505])\n\t\tXCTAssertTrue(dd.push(value: 100))\n\t}\n\n\tfunc testDynamicallyRanged() {\n\t\tlet dd = SparklineWindow<CGFloat>(windowSize: 10)\n\n\t\t// Default values for the initializer\n\t\tXCTAssertEqual(dd.raw.count, 10)\n\t\tXCTAssertEqual(dd.normalized.count, 10)\n\n\t\tXCTAssertEqual(dd.raw, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n\t\tXCTAssertEqual(dd.normalized, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n\n\t\tXCTAssertTrue(dd.push(value: 10))\n\t\tXCTAssertEqual(dd.normalized, [0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n\n\t\tXCTAssertTrue(dd.push(value: 20))\n\t\tXCTAssertEqual(dd.normalized, [0, 0, 0, 0, 0, 0, 0, 0, 0.5, 1])\n\n\t\tXCTAssertTrue(dd.push(value: -20))\n\t\tXCTAssertEqual(dd.normalized, [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 1.0, 0.0])\n\n\t\tXCTAssertTrue(dd.push(value: -10))\n\t\tXCTAssertEqual(dd.normalized, [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 1.0, 0.0, 0.25])\n\t}\n\n\tfunc testResizing() {\n\t\tlet dd = SparklineWindow<CGFloat>(windowSize: 10)\n\t\tXCTAssertEqual(dd.raw.count, 10)\n\n\t\tdd.set(values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n\t\tXCTAssertEqual(dd.normalized, [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])\n\n\t\tdd.set(values: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])\n\t\tXCTAssertEqual(dd.normalized, [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])\n\n\t\t/// Resizing\n\t\tdd.set(values: [-5, -4, -3, -2, -1, 0])\n\t\tXCTAssertEqual(dd.normalized, [0.0, 0.2, 0.4, 0.6, 0.8, 1.0])\n\n\t\tdd.set(values: [-5, -4, -3, -2, -1, 0, 1, 2])\n\t\tXCTAssertEqual(dd.normalized, [0.0, 0.14285714285714285, 0.2857142857142857, 0.42857142857142855,\n\t\t\t\t\t\t\t\t\t   0.5714285714285714, 0.7142857142857143, 0.8571428571428571, 1.0])\n\n\t\tdd.reset()\n\t\tdd.windowSize = 3\n\t\tXCTAssertEqual(0, dd.counter)\n\t\tXCTAssertTrue(dd.push(value: 1))\n\t\tXCTAssertEqual(dd.raw, [0.0, 0.0, 1.0])\n\t\tXCTAssertEqual(dd.normalized, [0.0, 0.0, 1.0])\n\t\tXCTAssertEqual(1, dd.counter)\n\t\tXCTAssertTrue(dd.push(value: 2))\n\t\tXCTAssertEqual(dd.raw, [0.0, 1.0, 2.0])\n\t\tXCTAssertEqual(dd.normalized, [0.0, 0.5, 1.0])\n\t\tXCTAssertEqual(2, dd.counter)\n\t\tXCTAssertTrue(dd.push(value: 3))\n\t\tXCTAssertEqual(dd.raw, [1.0, 2.0, 3.0])\n\t\tXCTAssertEqual(dd.normalized, [0.0, 0.5, 1.0])\n\t\tXCTAssertEqual(3, dd.counter)\n\t\tXCTAssertTrue(dd.push(value: 4))\n\t\tXCTAssertEqual(dd.raw, [2.0, 3.0, 4.0])\n\t\tXCTAssertEqual(dd.normalized, [0.0, 0.5, 1.0])\n\t\tXCTAssertEqual(4, dd.counter)\n\t}\n\n\tfunc testWindowSizeChanging() {\n\t\tlet dd = SparklineWindow<CGFloat>(windowSize: 20)\n\t\tdd.set(values: [1.0, 2.0, 3.0, 4.0])\n\n\t\tdd.windowSize = 7\n\t\tXCTAssertEqual([0.0, 0.0, 0.0, 1.0, 2.0, 3.0, 4.0], dd.raw)\n\n\t\tdd.windowSize = 3\n\t\tXCTAssertEqual([2.0, 3.0, 4.0], dd.raw)\n\t}\n\n\tfunc testDataSource() {\n\n\t\t// Check that truncating to range works\n\t\tlet ds = DSFSparkline.DataSource(windowSize: 10, range: -10 ... 10)\n\t\tXCTAssertTrue(ds.push(value: 5))\n\t\tXCTAssertTrue(ds.push(value: 50))\n\t\tXCTAssertEqual(ds.data, [0, 0, 0, 0, 0, 0, 0, 0, 5, 10])\n\t\tXCTAssertEqual(ds.normalized, [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 1.0])\n\n\t\t// With no range, adding 5 here makes the implicit range to 0 ... 5\n\t\tlet ds2 = DSFSparkline.DataSource(windowSize: 5)\n\t\tXCTAssertTrue(ds2.push(value: 5))\n\t\tXCTAssertEqual(ds2.data, [0, 0, 0, 0, 5])\n\t\tXCTAssertEqual(ds2.normalized, [0, 0, 0, 0, 1])\n\n\t\t// With no range, adding -5 here makes the implicit range to -5 ... 5\n\t\tXCTAssertTrue(ds2.push(value: -5))\n\t\tXCTAssertEqual(ds2.data, [0, 0, 0, 5, -5])\n\t\tXCTAssertEqual(ds2.normalized, [0.5, 0.5, 0.5, 1, 0])\n\n\t\t// With no range, adding -5 here makes the implicit range to -5 ... 5\n\t\tXCTAssertTrue(ds2.push(value: 10))\n\t\tXCTAssertTrue(ds2.push(value: -3))\n\t\tXCTAssertEqual(ds2.data, [0, 5, -5, 10, -3])\n\t\tXCTAssertEqual(ds2.normalized, [0.3333333333333333, 0.6666666666666666, 0.0, 1.0, 0.13333333333333333])\n\n\t\tds2.windowSize = 3\n\t\tXCTAssertEqual(ds2.data, [-5, 10, -3])\n\t\tXCTAssertEqual(ds2.normalized, [0.0, 1.0, 0.13333333333333333])\n\n\t\tds2.windowSize = 10\n\t\tXCTAssertEqual(ds2.data, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.0, 10.0, -3.0])\n\t\tXCTAssertEqual(ds2.normalized,\n\t\t\t\t\t\t\t[0.3333333333333333, 0.3333333333333333, 0.3333333333333333, 0.3333333333333333, 0.3333333333333333,\n\t\t\t\t\t\t\t 0.3333333333333333, 0.3333333333333333, 0.0, 1.0, 0.13333333333333333])\n\n\t\tds2.reset()\n\t\tXCTAssertEqual(ds2.data, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])\n\n\t\tds2.set(values: [0, 1, 2, 3, 4, 5, 6])\n\t\tXCTAssertEqual(7, ds2.windowSize)\n\t\tXCTAssertEqual(ds2.data, [0, 1, 2, 3, 4, 5, 6])\n\t}\n\n\n\tfunc testAddValues() {\n\t\tlet ds = DSFSparkline.DataSource(windowSize: 5)\n\t\tds.push(values: [1.1, 2.2, 3.3])\n\t\tXCTAssertEqual(ds.data, [0, 0, 1.1, 2.2, 3.3])\n\t\tXCTAssertTrue(ds.push(value: 1.2))\n\t\tXCTAssertEqual(ds.data, [0, 1.1, 2.2, 3.3, 1.2])\n\n\t\tds.push(values: [10, 11, 12])\n\t\tXCTAssertEqual(ds.data, [3.3, 1.2, 10.0, 11.0, 12.0])\n\n\t\t// Check what happens if greater than window.  Should truncate to the last 5 values in the array\n\t\t// Equivalent to push 1, push 2, push 3, push 4 etc.\n\t\tds.push(values: [1, 2, 3, 4, 5, 6, 7, 8])\n\t\tXCTAssertEqual(ds.data, [4, 5, 6, 7, 8])\n\t}\n\n\tfunc testCircularProgress() throws {\n\n\t\tlet l1 = DSFSparklineOverlay.CircularProgress()\n\t\tl1.value = 1.8\n\t\tl1.trackWidth = 10\n\n\t\tlet l2 = DSFSparklineOverlay.CircularProgress()\n\t\tl2.value = 1.4\n\t\tl2.trackWidth = 10\n\t\tl2.padding = 12\n\t\tl2.fillStyle = DSFSparkline.Fill.Gradient(colors: [\n\t\t\tCGColor.init(red: 1, green: 0, blue: 0, alpha: 1),\n\t\t\tCGColor.init(red: 0, green: 1, blue: 0, alpha: 1),\n\t\t\tCGColor.init(red: 0, green: 0, blue: 1, alpha: 1),\n\t\t])\n\n\t\t// Solid white\n\t\tlet l3 = DSFSparklineOverlay.CircularProgress()\n\t\tl3.value = 0.35\n\t\tl3.trackWidth = 10\n\t\tl3.padding = 24\n\t\tl3.fillStyle = DSFSparkline.Fill.Gradient(colors: [\n\t\t\tCGColor.init(red: 1, green: 0, blue: 0, alpha: 1),\n\t\t\tCGColor.init(red: 0, green: 1, blue: 0, alpha: 1),\n\t\t\tCGColor.init(red: 0, green: 0, blue: 1, alpha: 1),\n\t\t])\n\n\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\tbitmap.addOverlay(l1)                    // And add the overlay to the surface.\n\t\tbitmap.addOverlay(l2)                    // And add the overlay to the surface.\n\t\tbitmap.addOverlay(l3)                    // And add the overlay to the surface.\n\n\t\tlet image = bitmap.image(width: 100, height: 100, scale: 2)\n\t\tSwift.print(image)\n\t}\n\n\tfunc testGradientPeek() throws {\n\n\t\tlet gr = CGGradient(\n\t\t\tcolorsSpace: nil,\n\t\t\tcolors: [\n\t\t\t\tCGColor(red: 1, green: 0, blue: 0, alpha: 1),\n\t\t\t\tCGColor(red: 0, green: 0, blue: 1, alpha: 1),\n\t\t\t] as CFArray,\n\t\t\tlocations: [0.0, 1.0]\n\t\t)!\n\n\t\tlet f1 = DSFSparkline.Fill.Gradient(gradient: gr)\n\t\tlet c1 = f1.color(at: 0)\n\t\tlet c2 = f1.color(at: 0.5)\n\t\tlet c3 = f1.color(at: 1)\n\t\t\n\t\tSwift.print([c1, c2, c3])\n\t}\n}\n"
  },
  {
    "path": "Tests/DSFSparklineTests/LineGraphTests.swift",
    "content": "//\n//  LineGraphTests.swift\n//\n//\n//  Created by Darren Ford on 1/3/2024.\n//\n\nimport XCTest\n@testable import DSFSparkline\nimport SwiftImageReadWrite\n\nprivate let outputFolder = try! testResultsContainer.subfolder(with: \"line-graph\")\nprivate let imagesFolder = try! outputFolder.subfolder(with: \"images\")\nprivate let imageStore = ImageOutput(imagesFolder)\nprivate var markdownText = \"# Line Graph\\n\\n\"\n\nfinal class LineGraphTests: XCTestCase {\n\n\toverride class func tearDown() {\n\t\ttry! outputFolder.write(markdownText, to: \"line-graph.md\", encoding: .utf8)\n\t}\n\n\toverride func setUpWithError() throws {\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\n\toverride func tearDownWithError() throws {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t}\n\n\tfunc testBasic() throws {\n\n\t\tmarkdownText += \"## Inline documentation\\n\\n\"\n\n\t\tlet source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)\n\n\t\ttry [0, 5].forEach { zeroline in\n\n\t\t\tsource.zeroLineValue = zeroline\n\n\t\t\tmarkdownText += \"| line | interpolated | line with markers | line with markers interpolated |\\n\"\n\t\t\tmarkdownText += \"|------|------|------|------|\\n\"\n\n\t\t\ttry [false, true].forEach { interpolated in\n\n\t\t\t\tmarkdownText += \"|\"\n\n\t\t\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\t\t\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\t\t\t\tline.interpolated = interpolated\n\t\t\t\tline.strokeWidth = 1\n\t\t\t\tline.primaryStrokeColor = primaryStroke\n\t\t\t\tline.primaryFill = primaryFill\n\t\t\t\tline.dataSource = source\n\t\t\t\tbitmap.addOverlay(line)\n\t\t\t\tif zeroline != 0 {\n\t\t\t\t\tbitmap.addOverlay(DSFSparklineOverlay.ZeroLine(dataSource: source))\n\t\t\t\t}\n\n\t\t\t\t// Generate an image with retina scale\n\t\t\t\tlet image = try XCTUnwrap(bitmap.cgImage(size: CGSize(width: 50, height: 25), scale: 2))\n\t\t\t\tlet filename = \"line-simple-small-interpolated(\\(interpolated))-zeroline(\\(zeroline)).png\"\n\t\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" /></a>\"\n\t\t\t}\n\n\t\t\ttry [false, true].forEach { interpolated in\n\n\t\t\t\tmarkdownText += \"|\"\n\n\t\t\t\tlet bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface\n\t\t\t\tlet line = DSFSparklineOverlay.Line()       // Create a line overlay\n\t\t\t\tline.strokeWidth = 1\n\t\t\t\tline.primaryStrokeColor = primaryStroke\n\t\t\t\tline.primaryFill = primaryFill\n\t\t\t\tline.markerSize = 3\n\t\t\t\tline.interpolated = interpolated\n\t\t\t\tline.dataSource = source                    // Assign the datasource to the overlay\n\t\t\t\tbitmap.addOverlay(line)                     // And add the overlay to the surface.\n\t\t\t\t\n\t\t\t\tif zeroline != 0 {\n\t\t\t\t\tbitmap.addOverlay(DSFSparklineOverlay.ZeroLine(dataSource: source))\n\t\t\t\t}\n\n\t\t\t\t// Generate an image with retina scale\n\t\t\t\tlet image3 = try XCTUnwrap(bitmap.cgImage(size: CGSize(width: 50, height: 25), scale: 2))\n\t\t\t\tlet filename3 = \"line-simple-attributed-string-inline-interpolated(\\(interpolated))-zeroline(\\(zeroline)).png\"\n\t\t\t\tlet link3 = try imageStore.store(image3.representation.png(scale: 2), filename: filename3)\n\t\t\t\tmarkdownText += \"<a href=\\\"\\(link3)\\\"><img src=\\\"\\(link3)\\\" /></a>\"\n\t\t\t}\n\n\t\t\tmarkdownText += \"|\\n\\n\"\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Tests/DSFSparklineTests/PresentationTests.swift",
    "content": "//\n//  PresentationTests.swift\n//  \n//\n//  Created by Darren Ford on 27/2/2024.\n//\n\nimport XCTest\n@testable import DSFSparkline\nimport SwiftImageReadWrite\n\nclass ImageOutput {\n\n\tlet _imagesFolder: TestFilesContainer.Subfolder\n\n\tinit(_ folder: TestFilesContainer.Subfolder) {\n\t\t_imagesFolder = folder\n\t}\n\n\tfunc store(_ data: Data, filename: String) throws -> String {\n\t\ttry _imagesFolder.write(data, to: filename)\n\t\treturn \"./images/\\(filename)\"\n\t}\n\n\tfunc store(_ string: String, filename: String) throws -> String {\n\t\ttry _imagesFolder.write(string, to: filename)\n\t\treturn \"./images/\\(filename)\"\n\t}\n}\n\nprivate let outputFolder = try! testResultsContainer.subfolder(with: \"generation\")\nprivate let imagesFolder = try! outputFolder.subfolder(with: \"images\")\nprivate let imageStore = ImageOutput(imagesFolder)\nprivate var markdownText = \"# Sparklines\\n\\n\"\n\nfinal class PresentationTests: XCTestCase {\n\n\toverride func setUpWithError() throws {\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\n\toverride func tearDownWithError() throws {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t}\n\n\toverride class func tearDown() {\n\t\ttry! outputFolder.write(markdownText, to: \"sparklines.md\", encoding: .utf8)\n\t}\n}\n\nlet primaryPoke = DSFSparkline.Fill.Color(srgbRed: 0.934, green: 0.000, blue: 0.000, alpha: 1.0)\n\n\nlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033,  0.277, 0.650, 1.000])!\nlet primaryStroke = baseColor // (gray: 0.0, alpha: 0.3))\nlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\n\nextension PresentationTests {\n\tfunc testCircularGraph() throws {\n\n\t\tmarkdownText += \"## Circular Grid\\n\\n\"\n\n\t\tdo {\n\t\t\ttry [0, 0.33, 0.66, 1.0].forEach { value in\n\t\t\t\tlet surface = DSFSparklineSurface.Bitmap()\n\t\t\t\tlet a = DSFSparklineOverlay.CircularGauge()\n\n\t\t\t\tlet baseColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0.033,  0.277, 0.650, 1.000])!\n\t\t\t\tlet primaryFill = DSFSparkline.Fill.Color(baseColor.copy(alpha: 0.3)!)\n\n\t\t\t\ta.trackStyle = DSFSparklineOverlay.CircularGauge.TrackStyle(width: 10, fillColor: primaryFill)\n\t\t\t\ta.lineStyle = DSFSparklineOverlay.CircularGauge.TrackStyle(width: 5, fillColor: DSFSparkline.Fill.Color(baseColor))\n\t\t\t\ta.value = value\n\t\t\t\tsurface.addOverlay(a)\n\n\t\t\t\tlet filename = \"circular-gauge-small-\\(value).png\"\n\t\t\t\tlet bitmap = surface.image(width: 40, height: 40, scale: 2)!\n\t\t\t\tlet link = try imageStore.store(bitmap.representation.png(scale: 2), filename: filename)\n\t\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"40\\\" /></a>\\n\"\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\tlet innerShadow = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: 2, height: -2), color: .black, isInner: true)\n\t\t\tlet outerShadow = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: 2, height: -2), color: .black, isInner: false)\n\n\t\t\ta1.value = 0.65\n\t\t\ta1.trackStyle.width = 20\n\t\t\ta1.trackStyle.shadow = innerShadow\n\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 1, blue: 0)\n\t\t\ta1.lineStyle.shadow = outerShadow\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-inner-inout.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>|\\n\\n\"\n\t\t}\n\n\t\tdo {\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\ta1.value = 0.35\n\t\t\ta1.trackStyle.width = 20\n\t\t\ta1.trackStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 0.1)\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 1)\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-basic.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>|\\n\\n\"\n\t\t}\n\n\t\tdo {\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\ta1.value = 0.35\n\t\t\ta1.trackStyle.width = 20\n\t\t\ta1.trackStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 0.1)\n\t\t\ta1.lineStyle.width = 10\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 0, alpha: 1)\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-basic.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>|\\n\\n\"\n\t\t}\n\n\t\tdo {\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\ta1.value = 0.55\n\t\t\ta1.trackStyle.width = 10\n\t\t\ta1.trackStyle.shadow = DSFSparkline.Shadow(blurRadius: 3, offset: CGSize(width: 2, height: -2), color: .black, isInner: true)\n\t\t\ta1.trackStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 1, alpha: 0.1)\n\t\t\ta1.lineStyle.width = 8\n\t\t\ta1.lineStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 1, green: 0, blue: 1, alpha: 1)\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 30, height: 30), scale: 2))\n\t\t\tlet filename = \"circular-gauge-slightly.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"30\\\" /></a>|\\n\\n\"\n\t\t}\n\n\t\tdo {\n\t\t\tlet b1 = DSFSparklineSurface.Bitmap()\n\t\t\tlet a1 = DSFSparklineOverlay.CircularGauge()\n\n\t\t\tlet gr = DSFSparkline.Fill.Gradient(colors: [\n\t\t\t\tCGColor.sRGBA(0, 0, 1),\n\t\t\t\tCGColor.sRGBA(0, 1, 1),\n\t\t\t])\n\n\t\t\ta1.value = 0.87\n\t\t\ta1.trackStyle.width = 15\n\t\t\ta1.trackStyle.fillColor = DSFSparkline.Fill.Color(srgbRed: 0, green: 0, blue: 1, alpha: 0.1)\n\t\t\ta1.lineStyle.width = 7\n\t\t\ta1.lineStyle.fillColor = gr\n\t\t\ta1.lineStyle.shadow = .init(\n\t\t\t\tblurRadius: 3,\n\t\t\t\toffset: .init(width: 2, height: -2),\n\t\t\t\tcolor: CGColor(gray: 0, alpha: 0.8)\n\t\t\t)\n\n\t\t\tb1.addOverlay(a1)\n\t\t\tlet image = try XCTUnwrap(b1.cgImage(size: CGSize(width: 64, height: 64), scale: 2))\n\t\t\tlet filename = \"circular-gauge-gradient.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"64\\\" /></a>|\\n\\n\"\n\t\t}\n\t}\n\n\tfunc testActivityGrid() throws {\n\t\tmarkdownText += \"## Activity Grid\\n\\n\"\n\n\t\tdo {\n\t\t\tmarkdownText += \"### Inline documentation\\n\\n\"\n\n\t\t\tlet surface = DSFSparklineSurface.Bitmap()\n\t\t\tlet grid = DSFSparklineOverlay.ActivityGrid()\n\t\t\tgrid.dataSource = DSFSparkline.StaticDataSource((0 ... 1000).map { _ in CGFloat.random(in: 0 ... 1) }, range: 0 ... 1)\n\t\t\tgrid.verticalCellCount = 3\n\t\t\tgrid.cellStyle = .init(\n\t\t\t\tfillScheme: DSFSparkline.ActivityGrid.CellStyle.DefaultLight,\n\t\t\t\tborderColor: .black,\n\t\t\t\tborderWidth: 0.5,\n\t\t\t\tcellDimension: 5,\n\t\t\t\tcellSpacing: 0.5,\n\t\t\t\tcornerRadius: 1\n\t\t\t)\n\t\t\tsurface.addOverlay(grid)\n\n\t\t\tlet bitmap = surface.image(width: 150, height: 17, scale: 2)!\n\t\t\t// Generate an image with retina scale\n\t\t\tlet filename = \"activity-grid-mini.png\"\n\t\t\tlet link = try imageStore.store(bitmap.representation.png(scale: 2), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"150\\\" /></a>\\n\"\n\t\t}\n\n\t\tmarkdownText += \"\\n\"\n\n\t\tdo {\n\t\t\tlet bitmap = DSFSparklineSurface.Bitmap()          // Create a bitmap surface\n\t\t\tlet activity = DSFSparklineOverlay.ActivityGrid()\n\t\t\tlet data: [CGFloat] = (0 ... 100).map { _ in CGFloat.random(in: 0...100) }\n\t\t\tactivity.dataSource = .init(data)\n\n\t\t\tbitmap.addOverlay(activity)                       // And add the overlay to the surface.\n\n\t\t\t// Generate an image with retina scale\n\t\t\tlet image = bitmap.image(width: 300, height: 100, scale: 2)!\n\t\t\tlet filename = \"activity-basic-1.png\"\n\t\t\tlet link = try imageStore.store(image.representation.png(scale: 2), filename: filename)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link)\\\"><img src=\\\"\\(link)\\\" width=\\\"300\\\" /></a>\\n\"\n\n\t\t\tactivity.verticalCellCount = 10\n\t\t\tactivity.cellDimension = 6\n\t\t\tactivity.cellSpacing = 1\n\t\t\tactivity.cellFillScheme = DSFSparkline.ActivityGrid.CellStyle.DefaultLight\n\t\t\tlet image2 = bitmap.image(width: 300, height: 100, scale: 2)!\n\t\t\tlet filename2 = \"activity-basic-2.png\"\n\t\t\tlet link2 = try imageStore.store(image2.representation.png(scale: 2), filename: filename2)\n\t\t\tmarkdownText += \"<a href=\\\"\\(link2)\\\"><img src=\\\"\\(link2)\\\" width=\\\"300\\\" /></a>\\n\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tests/DSFSparklineTests/utils/TestFilesContainer.swift",
    "content": "//\n//  File.swift\n//  \n//\n//  Created by Darren Ford on 12/4/2023.\n//\n\nimport Foundation\n\nclass TestFilesContainer {\n\n\t// Note:  DateFormatter is thread safe\n\t// See https://developer.apple.com/documentation/foundation/dateformatter#1680059\n\tprivate static let iso8601Formatter: DateFormatter = {\n\t\tlet dateFormatter = DateFormatter()\n\t\tdateFormatter.locale = Locale(identifier: \"en_US_POSIX\") // set locale to reliable US_POSIX ISO8601\n\t\tdateFormatter.dateFormat = \"yyyy-MM-dd'T'HHmmssZ\"\n\t\treturn dateFormatter\n\t}()\n\n\tprivate let root: Subfolder\n\tvar rootFolder: URL { self.root.folder }\n\tinit(named name: String) throws {\n\t\tlet baseURL = FileManager.default.temporaryDirectory.appendingPathComponent(name)\n\n\t\tlet url = baseURL.appendingPathComponent(Self.iso8601Formatter.string(from: Date()))\n\t\ttry? FileManager.default.removeItem(at: url)\n\t\ttry FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)\n\t\tself.root = Subfolder(url)\n\t\tSwift.print(\"TestContainer(\\(name) - Generated files at: \\(url)\")\n\n\t\tlet latest = baseURL.appendingPathComponent(\"_latest\")\n\t\ttry? FileManager.default.removeItem(at: latest)\n\t\ttry! FileManager.default.createSymbolicLink(at: latest, withDestinationURL: url)\n\t}\n\n\tfunc subfolder(with components: String...) throws -> Subfolder {\n\t\tvar subfolder = self.rootFolder\n\t\tcomponents.forEach { subfolder.appendPathComponent($0) }\n\t\ttry FileManager.default.createDirectory(at: subfolder, withIntermediateDirectories: true)\n\t\treturn Subfolder(subfolder)\n\t}\n\n\tclass Subfolder {\n\t\tlet folder: URL\n\n\t\tinit(_ parent: URL) {\n\t\t\tself.folder = parent\n\t\t}\n\t\tinit(named name: String, parent: URL) throws {\n\t\t\tlet subf = parent.appendingPathComponent(name)\n\t\t\ttry FileManager.default.createDirectory(at: subf, withIntermediateDirectories: true)\n\t\t\tself.folder = subf\n\t\t}\n\n\t\tfunc subfolder(with components: String...) throws -> Subfolder {\n\t\t\tvar subfolder = self.folder\n\t\t\tcomponents.forEach { subfolder.appendPathComponent($0) }\n\t\t\ttry FileManager.default.createDirectory(at: subfolder, withIntermediateDirectories: true)\n\t\t\treturn Subfolder(subfolder)\n\t\t}\n\n\t\t@discardableResult func write(\n\t\t\t_ data: Data,\n\t\t\tto file: String\n\t\t) throws -> URL {\n\t\t\tlet tempURL = self.folder.appendingPathComponent(file)\n\t\t\ttry data.write(to: tempURL)\n\t\t\treturn tempURL\n\t\t}\n\n\t\t@discardableResult func write(\n\t\t\t_ string: String,\n\t\t\tto file: String,\n\t\t\tencoding: String.Encoding = .utf8\n\t\t) throws -> URL {\n\t\t\tlet tempURL = self.folder.appendingPathComponent(file)\n\t\t\ttry string.write(to: tempURL, atomically: true, encoding: encoding)\n\t\t\treturn tempURL\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tools/sanity-check.sh",
    "content": "#!/bin/sh\n\n##\n##  sanity-check.sh\n##  DSFSparklines\n##\n##  Created by Darren Ford on 26/2/21.\n##  Copyright © 2021 Darren Ford. All rights reserved.\n##\n##  MIT license\n##\n##  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n##  documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n##  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n##  permit persons to whom the Software is furnished to do so, subject to the following conditions:\n##\n##  The above copyright notice and this permission notice shall be included in all copies or substantial\n##  portions of the Software.\n##\n##  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n##  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n##  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n##  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n##\n\n# A simple script to build all the supported platforms to make sure I havent overlooked an issue on one of them.\n\npushd .\n\ncd ..\n\necho \"Cleaning builds...\"\n\nswift package clean\n\n##\n## iOS versions\n##\necho \"Building iOS targets...\"\n\n# Simulator\nxcrun swift build -Xswiftc \"-sdk\" -Xswiftc \"`xcrun --sdk iphonesimulator --show-sdk-path`\" -Xswiftc \"-target\" -Xswiftc \"x86_64-apple-ios11-simulator\"\n# Latest iOS arm64\nxcrun swift build -Xswiftc \"-sdk\" -Xswiftc $(xcrun --sdk iphoneos --show-sdk-path) -Xswiftc \"-target\" -Xswiftc \"arm64-apple-ios`xcrun --sdk iphoneos --show-sdk-version`\"\n# Earliest iOS\nxcrun swift build -Xswiftc \"-sdk\" -Xswiftc $(xcrun --sdk iphoneos --show-sdk-path) -Xswiftc \"-target\" -Xswiftc \"arm64-apple-ios11\"\n\n##\n## macOS versions\n##\necho \"Building mac targets...\"\n\n# Current macOS\nxcrun swift build -Xswiftc \"-target\" -Xswiftc \"x86_64-apple-macosx`xcrun --sdk macosx --show-sdk-version`\"\n# Earliest macOS\nxcrun swift build -Xswiftc \"-target\" -Xswiftc \"x86_64-apple-macosx10.11\"\n# Arm64 macOS\nxcrun swift build -Xswiftc \"-target\" -Xswiftc \"arm64-apple-macosx`xcrun --sdk macosx --show-sdk-version`\"\n\n##\n## tvOS versions\n##\necho \"Building tvOS targets...\"\n\n# Simulator\nxcrun swift build -Xswiftc \"-sdk\" -Xswiftc \"`xcrun --sdk appletvsimulator --show-sdk-path`\" -Xswiftc \"-target\" -Xswiftc \"x86_64-apple-tvos`xcrun --sdk iphoneos --show-sdk-version`-simulator\"\n# Latest\nxcrun swift build -Xswiftc \"-sdk\" -Xswiftc $(xcrun --sdk appletvos --show-sdk-path) -Xswiftc -target -Xswiftc \"arm64-apple-tvos`xcrun --sdk iphoneos --show-sdk-version`\"\n# Earliest iOS (v11)\nxcrun swift build -Xswiftc \"-sdk\" -Xswiftc $(xcrun --sdk appletvos --show-sdk-path) -Xswiftc -target -Xswiftc \"arm64-apple-tvos11\"\n\n\n\n# xcrun --sdk iphoneos --show-sdk-version\n# xcrun --sdk macosx --show-sdk-version\n# xcrun --sdk appletvos --show-sdk-version\n\npopd\n"
  }
]