Add embedded about & open-source credits screen (license audit)

This commit is contained in:
2026-09-09 21:05:59 +07:00
parent 568f06306a
commit 5799210949
4 changed files with 696 additions and 2 deletions
+163
View File
@@ -0,0 +1,163 @@
import React, { useMemo, useState } from 'react';
import { View, Text, Modal, ScrollView, TouchableOpacity, Linking } from 'react-native';
import { X, ChevronDown, ChevronRight, ExternalLink, Scale } from 'lucide-react-native';
import { CREDITS, LICENSE_TEXTS, CreditEntry } from '../utils/credits';
// About + open-source credits, reachable from the settings sheet. Third-party
// data is generated from node_modules (src/utils/credits.ts + THIRD_PARTY_NOTICES.md);
// each project row links to its homepage, each license group expands to the
// full license text embedded in the app.
const APP_NAME = 'recipescamera';
const APP_VERSION = '1.0.0'; // keep in sync with app.json
function Group({
license,
entries,
}: {
license: string;
entries: CreditEntry[];
}) {
const [open, setOpen] = useState(false);
const text = LICENSE_TEXTS[license];
return (
<View className="rounded-xl border border-zinc-800/70 bg-black/30 overflow-hidden">
<TouchableOpacity
onPress={() => setOpen((v) => !v)}
className="flex-row items-center justify-between px-3 py-2.5"
activeOpacity={0.7}
>
<View className="flex-row items-center">
<Scale size={12} color="#f59e0b" strokeWidth={1.75} />
<Text className="text-zinc-300 font-mono text-xs font-bold tracking-widest ml-2">
{license}
</Text>
<Text className="text-zinc-600 font-mono text-[10px] ml-2">
{entries.length} {entries.length === 1 ? 'component' : 'components'}
</Text>
</View>
{open ? (
<ChevronDown size={14} color="#71717a" />
) : (
<ChevronRight size={14} color="#71717a" />
)}
</TouchableOpacity>
{open && (
<View className="px-3 pb-3 space-y-2">
{entries.map((e) => (
<View key={e.name} className="border-t border-zinc-800/60 pt-2">
<View className="flex-row items-start justify-between">
<Text className="text-zinc-200 font-mono text-[11px] font-semibold flex-1 pr-2">
{e.name}
</Text>
{e.url.startsWith('http') && (
<TouchableOpacity
onPress={() => Linking.openURL(e.url)}
accessibilityLabel={`Open ${e.name} project page`}
className="flex-row items-center"
hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}
>
<ExternalLink size={12} color="#f59e0b" />
</TouchableOpacity>
)}
</View>
{e.copyright ? (
<Text className="text-zinc-500 font-mono text-[10px] mt-0.5">{e.copyright}</Text>
) : null}
<Text className="text-zinc-600 font-mono text-[10px] mt-0.5">
{e.version}
</Text>
</View>
))}
{text ? (
<View className="border-t border-zinc-800/60 pt-2">
<Text selectable className="text-zinc-500 font-mono text-[9px] leading-4">
{text}
</Text>
</View>
) : null}
</View>
)}
</View>
);
}
export default function CreditsModal({
visible,
onClose,
}: {
visible: boolean;
onClose: () => void;
}) {
const groups = useMemo(() => {
const byLicense = new Map<string, CreditEntry[]>();
for (const e of CREDITS) {
const arr = byLicense.get(e.license) ?? [];
arr.push(e);
byLicense.set(e.license, arr);
}
// stable order: licenses as declared in LICENSE_TEXTS, then rest
const order = Object.keys(LICENSE_TEXTS);
const sorted = [...byLicense.keys()].sort(
(a, b) => order.indexOf(a) - order.indexOf(b)
);
return sorted
.filter((k) => byLicense.has(k))
.map((k) => ({ license: k, entries: byLicense.get(k)! }));
}, []);
return (
<Modal visible={visible} transparent animationType="fade" onRequestClose={onClose}>
<View className="flex-1 bg-black/70 items-center justify-center px-4">
<TouchableOpacity className="absolute inset-0" activeOpacity={1} onPress={onClose} />
<View
className="w-full max-w-md rounded-2xl border border-zinc-800/70 p-5"
style={{ backgroundColor: 'rgba(8,8,10,0.97)', maxHeight: '85%' }}
>
<View className="flex-row items-center justify-between mb-3">
<Text className="text-zinc-300 font-mono text-xs font-bold tracking-widest">
ABOUT &amp; CREDITS
</Text>
<TouchableOpacity
onPress={onClose}
className="w-8 h-8 rounded-full bg-zinc-900 flex items-center justify-center"
activeOpacity={0.7}
>
<X size={16} color="#ffffff" />
</TouchableOpacity>
</View>
<View className="rounded-xl border border-zinc-800/70 bg-black/30 px-3 py-2.5 mb-3">
<Text className="text-zinc-200 font-mono text-sm font-bold">{APP_NAME}</Text>
<Text className="text-zinc-500 font-mono text-[10px] mt-0.5">
version {APP_VERSION} · film-recipe camera (experimental)
</Text>
<View className="flex-row flex-wrap items-center mt-1">
<Text className="text-zinc-400 font-mono text-[10px]">Author: Lộc Phạm</Text>
<TouchableOpacity
onPress={() => Linking.openURL('mailto:tranloclqd@gmail.com')}
accessibilityLabel="Email author"
className="flex-row items-center ml-3"
hitSlop={{ top: 6, bottom: 6, left: 6, right: 6 }}
>
<Text className="text-amber-500/90 font-mono text-[10px] underline">
tranloclqd@gmail.com
</Text>
</TouchableOpacity>
</View>
<Text className="text-zinc-600 font-mono text-[10px] mt-1">
© 2026 Lộc Phạm · Built with React Native + Expo; icons by Lucide;
on-screen graphics rendered with Skia.
</Text>
</View>
<ScrollView className="space-y-2" showsVerticalScrollIndicator={false}>
{groups.map((g) => (
<Group key={g.license} license={g.license} entries={g.entries} />
))}
</ScrollView>
</View>
</View>
</Modal>
);
}
+28 -2
View File
@@ -1,8 +1,9 @@
import React from 'react';
import React, { useState } from 'react';
import { View, Text, Modal, TouchableOpacity } from 'react-native';
import * as Haptics from 'expo-haptics';
import { X, Volume2, Settings as SettingsIcon } from 'lucide-react-native';
import { X, Volume2, Info, ChevronRight, Settings as SettingsIcon } from 'lucide-react-native';
import { AspectRatio, MeterMode, ShutterSound, StartupMode } from '../types';
import CreditsModal from './CreditsModal';
// Gear-sheet (gear button between library picker and shutter). Groups the
// capture/composition choices that are NOT look-adjustments, so the tool rail
@@ -90,6 +91,7 @@ export default function SettingsModal({
startupMode,
onStartupMode,
}: SettingsModalProps) {
const [showCredits, setShowCredits] = useState(false);
return (
<Modal visible={visible} transparent animationType="fade" onRequestClose={onClose}>
<View className="flex-1 bg-black/70 items-center justify-center px-6">
@@ -189,8 +191,32 @@ export default function SettingsModal({
/>
<CameraOnlyNote cameraMode={cameraMode} />
</View>
{/* About & open-source credits */}
<View>
<TouchableOpacity
onPress={() => {
haptic();
setShowCredits(true);
}}
className="flex-row items-center justify-between rounded-xl border border-zinc-800/70 bg-black/30 px-3 py-2.5"
activeOpacity={0.7}
>
<View className="flex-row items-center">
<Info size={13} color="#a1a1aa" strokeWidth={1.75} />
<Text className="text-zinc-400 font-mono text-[10px] font-bold tracking-[0.2em] ml-2">
ABOUT &amp; CREDITS
</Text>
</View>
<ChevronRight size={14} color="#52525b" />
</TouchableOpacity>
<Text className="text-zinc-600 font-mono text-[10px] mt-1.5 ml-1">
App info + third-party open-source licenses.
</Text>
</View>
</View>
</View>
<CreditsModal visible={showCredits} onClose={() => setShowCredits(false)} />
</Modal>
);
}
+244
View File
@@ -0,0 +1,244 @@
// Generated by license audit — runtime (shipped) dependencies + bundled fonts/graphics.
// Do not edit by hand; regenerate from node_modules audit (see THIRD_PARTY_NOTICES.md).
export interface CreditEntry {
name: string;
version: string;
license: string;
copyright: string;
url: string;
}
export const CREDITS: CreditEntry[] = [
{
name: "Skia graphics library (bundled native in react-native-skia)",
version: "bundled",
license: "BSD-3-Clause",
copyright: "Copyright 2011 Google Inc. All rights reserved.",
url: "https://skia.org/",
},
{
name: "canvaskit-wasm",
version: "0.41.0",
license: "BSD-3-Clause",
copyright: "Copyright 2020 Google LLC",
url: "https://skia.org/",
},
{
name: "lucide-react-native",
version: "1.24.0",
license: "ISC",
copyright: "Copyright (c) 2026 Lucide Icons and Contributors",
url: "https://lucide.dev",
},
{
name: "@react-native-async-storage/async-storage",
version: "2.2.0",
license: "MIT",
copyright: "Copyright (c) 2015-present, Facebook, Inc.",
url: "https://github.com/react-native-async-storage/async-storage#readme",
},
{
name: "@react-native-community/slider",
version: "5.2.0",
license: "MIT",
copyright: "react-native-community",
url: "https://github.com/callstack/react-native-slider#readme",
},
{
name: "@shopify/react-native-skia",
version: "2.6.2",
license: "MIT",
copyright: "Copyright 2021-present, Shopify Inc.",
url: "git+https://github.com/Shopify/react-native-skia.git",
},
{
name: "expo",
version: "57.0.7",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://github.com/expo/expo/tree/main/packages/expo",
},
{
name: "expo-asset",
version: "57.0.6",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/asset/",
},
{
name: "expo-dev-client",
version: "57.0.6",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/dev-client/",
},
{
name: "expo-file-system",
version: "57.0.1",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/filesystem/",
},
{
name: "expo-font",
version: "57.0.1",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/font/",
},
{
name: "expo-haptics",
version: "57.0.1",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/haptics/",
},
{
name: "expo-image-picker",
version: "57.0.4",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/imagepicker/",
},
{
name: "expo-keep-awake",
version: "57.0.1",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/keep-awake/",
},
{
name: "expo-location",
version: "57.0.4",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/location/",
},
{
name: "expo-media-library",
version: "57.0.2",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/media-library/",
},
{
name: "expo-sharing",
version: "57.0.18",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/sharing/",
},
{
name: "expo-status-bar",
version: "57.0.1",
license: "MIT",
copyright: "Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)",
url: "https://docs.expo.dev/versions/latest/sdk/status-bar/",
},
{
name: "nativewind",
version: "4.2.6",
license: "MIT",
copyright: "Copyright (c) 2023 Mark Lawlor",
url: "https://nativewind.dev",
},
{
name: "react",
version: "19.2.3",
license: "MIT",
copyright: "Copyright (c) Meta Platforms, Inc. and affiliates.",
url: "https://react.dev/",
},
{
name: "react-dom",
version: "19.2.3",
license: "MIT",
copyright: "Copyright (c) Meta Platforms, Inc. and affiliates.",
url: "https://react.dev/",
},
{
name: "react-native",
version: "0.86.0",
license: "MIT",
copyright: "Copyright (c) Meta Platforms, Inc. and affiliates.",
url: "https://reactnative.dev/",
},
{
name: "react-native-nitro-image",
version: "0.15.2",
license: "MIT",
copyright: "Marc Rousavy <me@mrousavy.com> (https://github.com/mrousavy)",
url: "https://github.com/mrousavy/react-native-nitro-image#readme",
},
{
name: "react-native-nitro-modules",
version: "0.37.1",
license: "MIT",
copyright: "Marc Rousavy <me@mrousavy.com> (https://github.com/mrousavy)",
url: "https://nitro.margelo.com",
},
{
name: "react-native-reanimated",
version: "4.5.0",
license: "MIT",
copyright: "Copyright (c) 2016 Software Mansion <swmansion.com>",
url: "https://docs.swmansion.com/react-native-reanimated",
},
{
name: "react-native-safe-area-context",
version: "5.8.0",
license: "MIT",
copyright: "Copyright (c) 2019 Th3rd Wave",
url: "https://github.com/AppAndFlow/react-native-safe-area-context#readme",
},
{
name: "react-native-vision-camera",
version: "5.2.3",
license: "MIT",
copyright: "Marc Rousavy <me@mrousavy.com> (https://github.com/mrousavy)",
url: "https://visioncamera.margelo.com",
},
{
name: "react-native-vision-camera-skia",
version: "5.2.3",
license: "MIT",
copyright: "Marc Rousavy <me@mrousavy.com> (https://github.com/mrousavy)",
url: "https://visioncamera.margelo.com/api/react-native-vision-camera-skia",
},
{
name: "react-native-vision-camera-worklets",
version: "5.2.3",
license: "MIT",
copyright: "Marc Rousavy <me@mrousavy.com> (https://github.com/mrousavy)",
url: "https://visioncamera.margelo.com/api/react-native-vision-camera-worklets",
},
{
name: "react-native-web",
version: "0.21.2",
license: "MIT",
copyright: "Copyright (c) Nicolas Gallagher.",
url: "git://github.com/necolas/react-native-web.git",
},
{
name: "Cousine",
version: "Google Fonts",
license: "OFL-1.1",
copyright: "Copyright 2026 The Cousine Project Authors (github.com/googlefonts/cousine)",
url: "https://fonts.google.com/specimen/Cousine",
},
{
name: "Noto Emoji (GPS subset)",
version: "Google Fonts",
license: "OFL-1.1",
copyright: "Copyright 2022 The Noto Project Authors (github.com/notofonts/noto-emoji)",
url: "https://fonts.google.com/noto/specimen/Noto+Emoji",
},
];
export const LICENSE_TEXTS: Record<string, string> = {
"BSD-3-Clause": "// Copyright (c) 2011 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------",
"ISC": "ISC License\n\nCopyright (c) 2026 Lucide Icons and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n---\n\nThe following Lucide icons are derived from the Feather project:\n\nairplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n\nThe MIT License (MIT) (for the icons listed above)\n\nCopyright (c) 2013-present Cole Bemis\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.",
"MIT": "MIT License\n\nCopyright (c) Meta Platforms, Inc. and affiliates.\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.",
"OFL-1.1": "Copyright (c) <dates>, <Copyright Holder> (<URL|email>),\nwith Reserved Font Name <Reserved Font Name>.\nCopyright (c) <dates>, <additional Copyright Holder> (<URL|email>),\nwith Reserved Font Name <additional Reserved Font Name>.\nCopyright (c) <dates>, <additional Copyright Holder> (<URL|email>).\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttps://openfontlicense.org\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n",
};