From eecc878b5953366944fb7e7e461756b2fc73f3ba Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 6 Jul 2023 17:12:09 +0200 Subject: [PATCH 01/95] Addded meta field to entry model --- openapi/index_openapi.json | 24 ++- openapi/openapi.json | 146 ++++++++++-------- optimade/models/entries.py | 17 +- optimade/server/data/test_structures.json | 7 + optimade/server/mappers/entries.py | 8 +- .../test_data/test_good_structures.json | 7 + tests/server/query_params/conftest.py | 5 +- 7 files changed, 138 insertions(+), 76 deletions(-) diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index 9f5692009..e247ae069 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -467,6 +467,18 @@ }, "description": "Minimum requirements to represent a relationship resource" }, + "EntryMetadata": { + "title": "EntryMetadata", + "type": "object", + "properties": { + "property_metadata": { + "title": "Property Metadata", + "type": "object", + "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the meta data for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." + } + }, + "description": "Contains the metadata for the attributes of an entry" + }, "EntryRelationships": { "title": "EntryRelationships", "type": "object", @@ -528,10 +540,10 @@ "title": "Meta", "allOf": [ { - "$ref": "#/components/schemas/Meta" + "$ref": "#/components/schemas/EntryMetadata" } ], - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "title": "Attributes", @@ -573,8 +585,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -1137,10 +1149,10 @@ "title": "Meta", "allOf": [ { - "$ref": "#/components/schemas/Meta" + "$ref": "#/components/schemas/EntryMetadata" } ], - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "title": "Attributes", diff --git a/openapi/openapi.json b/openapi/openapi.json index 19c37f664..d23f8c4d0 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1341,8 +1341,8 @@ } }, "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "group_probabilities": { "title": "Group Probabilities", @@ -1351,8 +1351,8 @@ "type": "number" }, "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" } }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." @@ -1717,6 +1717,18 @@ }, "description": "errors are not allowed" }, + "EntryMetadata": { + "title": "EntryMetadata", + "type": "object", + "properties": { + "property_metadata": { + "title": "Property Metadata", + "type": "object", + "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the meta data for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." + } + }, + "description": "Contains the metadata for the attributes of an entry" + }, "EntryRelationships": { "title": "EntryRelationships", "type": "object", @@ -1778,10 +1790,10 @@ "title": "Meta", "allOf": [ { - "$ref": "#/components/schemas/Meta" + "$ref": "#/components/schemas/EntryMetadata" } ], - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "title": "Attributes", @@ -1823,8 +1835,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -2246,10 +2258,10 @@ "title": "Meta", "allOf": [ { - "$ref": "#/components/schemas/Meta" + "$ref": "#/components/schemas/EntryMetadata" } ], - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "title": "Attributes", @@ -2648,8 +2660,8 @@ "type": "string", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -2664,10 +2676,10 @@ "title": "Meta", "allOf": [ { - "$ref": "#/components/schemas/Meta" + "$ref": "#/components/schemas/EntryMetadata" } ], - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "$ref": "#/components/schemas/ReferenceResourceAttributes" @@ -2703,8 +2715,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "authors": { "title": "Authors", @@ -2713,8 +2725,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the authors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "editors": { "title": "Editors", @@ -2723,8 +2735,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the editors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "doi": { "title": "Doi", @@ -2740,8 +2752,8 @@ "type": "string", "description": "The URL of the reference.", "format": "uri", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "address": { "title": "Address", @@ -3327,8 +3339,8 @@ "type": "string" }, "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "concentration": { "title": "Concentration", @@ -3337,8 +3349,8 @@ "type": "number" }, "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "mass": { "title": "Mass", @@ -3347,8 +3359,8 @@ "type": "number" }, "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", - "x-optimade-support": "optional", "x-optimade-queryable": "optional", + "x-optimade-support": "optional", "x-optimade-unit": "a.m.u." }, "original_name": { @@ -3365,8 +3377,8 @@ "type": "string" }, "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "nattached": { "title": "Nattached", @@ -3375,8 +3387,8 @@ "type": "integer" }, "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" } }, "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." @@ -3454,8 +3466,8 @@ "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -3470,10 +3482,10 @@ "title": "Meta", "allOf": [ { - "$ref": "#/components/schemas/Meta" + "$ref": "#/components/schemas/EntryMetadata" } ], - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "$ref": "#/components/schemas/StructureResourceAttributes" @@ -3524,8 +3536,8 @@ "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "elements": { "title": "Elements", @@ -3535,16 +3547,16 @@ }, "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "nelements": { "title": "Nelements", "type": "integer", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "elements_ratios": { "title": "Elements Ratios", @@ -3554,16 +3566,16 @@ }, "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_descriptive": { "title": "Chemical Formula Descriptive", "type": "string", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_reduced": { "title": "Chemical Formula Reduced", @@ -3571,16 +3583,16 @@ "type": "string", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_hill": { "title": "Chemical Formula Hill", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "chemical_formula_anonymous": { "title": "Chemical Formula Anonymous", @@ -3588,8 +3600,8 @@ "type": "string", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "dimension_types": { "title": "Dimension Types", @@ -3601,16 +3613,16 @@ }, "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "nperiodic_dimensions": { "title": "Nperiodic Dimensions", "type": "integer", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "lattice_vectors": { "title": "Lattice Vectors", @@ -3627,8 +3639,8 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, - "x-optimade-support": "should", "x-optimade-queryable": "optional", + "x-optimade-support": "should", "x-optimade-unit": "\u00c5" }, "cartesian_site_positions": { @@ -3644,8 +3656,8 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, - "x-optimade-support": "should", "x-optimade-queryable": "optional", + "x-optimade-support": "should", "x-optimade-unit": "\u00c5" }, "nsites": { @@ -3653,8 +3665,8 @@ "type": "integer", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "species": { "title": "Species", @@ -3664,8 +3676,8 @@ }, "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "species_at_sites": { "title": "Species At Sites", @@ -3675,8 +3687,8 @@ }, "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "assemblies": { "title": "Assemblies", @@ -3685,8 +3697,8 @@ "$ref": "#/components/schemas/Assembly" }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "structure_features": { "title": "Structure Features", @@ -3695,8 +3707,8 @@ "$ref": "#/components/schemas/StructureFeatures" }, "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" } }, "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 7850565ea..b92c241c4 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -4,7 +4,7 @@ from pydantic import BaseModel, validator # pylint: disable=no-name-in-module -from optimade.models.jsonapi import Attributes, Relationships, Resource +from optimade.models.jsonapi import Attributes, Meta, Relationships, Resource from optimade.models.optimade_json import DataType, Relationship from optimade.models.utils import OptimadeField, StrictField, SupportLevel @@ -100,6 +100,16 @@ def cast_immutable_id_to_str(cls, value): return value +class EntryMetadata(Meta): + """Contains the metadata for the attributes of an entry""" + + property_metadata: Dict = StrictField( + None, + description="""A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the meta data for that property. +Database-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes).""", + ) + + class EntryResource(Resource): """The base model for an entry resource.""" @@ -147,6 +157,11 @@ class EntryResource(Resource): Database-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes).""", ) + meta: Optional[EntryMetadata] = StrictField( + None, + description="""A dictionary, containing entry and property-specific metadata for a given entry.""", + ) + relationships: Optional[EntryRelationships] = StrictField( None, description="""A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships). diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index 5ea0305b6..701810319 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -180,6 +180,13 @@ ], "structure_features": [], "task_id": "mpf_2", + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"piezoelectic_perovskites" + } + } + }, "relationships": { "references": { "data": [ diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index eb58002a0..3e29bbe4b 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -73,7 +73,13 @@ class BaseResourceMapper: PROVIDER_FIELDS: Tuple[str, ...] = () ENTRY_RESOURCE_CLASS: Type[EntryResource] = EntryResource RELATIONSHIP_ENTRY_TYPES: Set[str] = {"references", "structures"} - TOP_LEVEL_NON_ATTRIBUTES_FIELDS: Set[str] = {"id", "type", "relationships", "links"} + TOP_LEVEL_NON_ATTRIBUTES_FIELDS: Set[str] = { + "id", + "type", + "relationships", + "links", + "meta", + } @classmethod @lru_cache(maxsize=NUM_ENTRY_TYPES) diff --git a/tests/models/test_data/test_good_structures.json b/tests/models/test_data/test_good_structures.json index b84605832..1af63cfc6 100644 --- a/tests/models/test_data/test_good_structures.json +++ b/tests/models/test_data/test_good_structures.json @@ -179,6 +179,13 @@ "nperiodic_dimensions": 3, "lattice_vectors": [[4.0,0.0,0.0],[0.0, 4.0, 0.0],[0.0,1.0,4.0]], "cartesian_site_positions": [ [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0] ], + "meta": { + "property_metadata": { + "element_ratios": { + "_exmpl_originates_from_project": "piezoelectic_perovskites" + } + } + }, "species_at_sites": ["Cl", "O", "N", "met", "Os", "Na", "P"], "species": [ {"name": "Cl", "chemical_symbols": ["Cl"], "concentration": [1.0] }, diff --git a/tests/server/query_params/conftest.py b/tests/server/query_params/conftest.py index ce11819be..f6c7ee9f3 100644 --- a/tests/server/query_params/conftest.py +++ b/tests/server/query_params/conftest.py @@ -78,11 +78,14 @@ def inner( response = get_good_response(request, server) expected_fields.add("attributes") - + expected_fields.discard("meta") response_fields = set() for entry in response["data"]: response_fields.update(set(entry.keys())) response_fields.update(set(entry["attributes"].keys())) + response_fields.discard( + "meta" + ) # As "meta" is an optional field the response may or may not have it, so we remove it here to prevent problems in the assert below. assert sorted(expected_fields) == sorted(response_fields) return inner From 6ed4a5dd3c7d8c9fa90c089dc999f37be95f2e0b Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 19 Jul 2023 17:02:05 +0200 Subject: [PATCH 02/95] Added validator for meta field. --- optimade/models/entries.py | 53 ++++++++++++++++++- .../test_data/test_good_structures.json | 2 +- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index b92c241c4..d992b5e9b 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -2,8 +2,13 @@ from datetime import datetime from typing import Dict, List, Optional -from pydantic import BaseModel, validator # pylint: disable=no-name-in-module +from pydantic import ( + BaseModel, + root_validator, + validator, +) +# pylint: disable=no-name-in-module from optimade.models.jsonapi import Attributes, Meta, Relationships, Resource from optimade.models.optimade_json import DataType, Relationship from optimade.models.utils import OptimadeField, StrictField, SupportLevel @@ -168,6 +173,52 @@ class EntryResource(Resource): The OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object.""", ) + def check_field_supported_prefix(field): + from optimade.server.mappers import BaseResourceMapper + + prefix = field.split("_")[1] + if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: + raise ValueError( + f"The prefix {prefix} of the field {field} is not supported by this server." + ) + + @root_validator + def check_meta(cls, values): + """Validator to check whether meta field has been formatted correctly.""" + + meta = values.get("meta") + if meta is not None: + for field in meta.__dict__: + if field.startswith("_"): + cls.check_field_supported_prefix(field) + elif field == "property_metadata": + # check that all the fields under property metadata are in attributes + attributes = ( + values.get("attributes").__dict__ + if values.get("attributes") + else {} + ) + for subfield in meta.__dict__.get( + field + ): ## ToDo The names of the fields in atributes only need to be read once so this code can still be sped up. + if subfield not in attributes: + raise ValueError( + f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." + ) + # check that the fields under subfield are starting with prefix + for subsubfield in meta.__dict__.get(field).get(subfield): + if subsubfield.startswith("_"): + cls.check_field_supported_prefix(subsubfield) + else: + raise ValueError( + f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + ) + else: + raise ValueError( + "The fields under meta either need to be database specific fields or the field `property_metadata'" + ) + return values + class EntryInfoProperty(BaseModel): description: str = StrictField( diff --git a/tests/models/test_data/test_good_structures.json b/tests/models/test_data/test_good_structures.json index 1af63cfc6..15c3f6992 100644 --- a/tests/models/test_data/test_good_structures.json +++ b/tests/models/test_data/test_good_structures.json @@ -181,7 +181,7 @@ "cartesian_site_positions": [ [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0] ], "meta": { "property_metadata": { - "element_ratios": { + "elements_ratios": { "_exmpl_originates_from_project": "piezoelectic_perovskites" } } From ef1ca3c3c94796d5371cd58125942ab6f11ef172 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 20 Jul 2023 12:13:24 +0200 Subject: [PATCH 03/95] Update pyyaml version in requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8bee4a089..5c5488835 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ email_validator==2.0.0.post2 lark==1.1.5 pydantic==1.10.9 -pyyaml==6.0 +pyyaml==6.0.1 requests==2.31.0 uvicorn==0.22.0 From 89ac0fef24a0c441a465a2aa8a60b65be26083ef Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 20 Jul 2023 12:25:33 +0200 Subject: [PATCH 04/95] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5c5488835..59bf8d8bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ email_validator==2.0.0.post2 lark==1.1.5 pydantic==1.10.9 -pyyaml==6.0.1 +pyyaml==5.4.1 requests==2.31.0 uvicorn==0.22.0 From f229be156b387848627b292238a9171864e09ca4 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 20 Jul 2023 12:30:36 +0200 Subject: [PATCH 05/95] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 59bf8d8bb..5c5488835 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ email_validator==2.0.0.post2 lark==1.1.5 pydantic==1.10.9 -pyyaml==5.4.1 +pyyaml==6.0.1 requests==2.31.0 uvicorn==0.22.0 From a195fb506985639d7635502443c1e01368338d14 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 20 Jul 2023 15:48:49 +0200 Subject: [PATCH 06/95] Remove test structures to get an idea of what triggers yaml import error on github. --- optimade/server/data/test_structures.json | 7 ------- tests/models/test_data/test_good_structures.json | 7 ------- 2 files changed, 14 deletions(-) diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index 701810319..5ea0305b6 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -180,13 +180,6 @@ ], "structure_features": [], "task_id": "mpf_2", - "meta": { - "property_metadata": { - "elements_ratios": { - "_exmpl_originates_from_project":"piezoelectic_perovskites" - } - } - }, "relationships": { "references": { "data": [ diff --git a/tests/models/test_data/test_good_structures.json b/tests/models/test_data/test_good_structures.json index 15c3f6992..b84605832 100644 --- a/tests/models/test_data/test_good_structures.json +++ b/tests/models/test_data/test_good_structures.json @@ -179,13 +179,6 @@ "nperiodic_dimensions": 3, "lattice_vectors": [[4.0,0.0,0.0],[0.0, 4.0, 0.0],[0.0,1.0,4.0]], "cartesian_site_positions": [ [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0] ], - "meta": { - "property_metadata": { - "elements_ratios": { - "_exmpl_originates_from_project": "piezoelectic_perovskites" - } - } - }, "species_at_sites": ["Cl", "O", "N", "met", "Os", "Na", "P"], "species": [ {"name": "Cl", "chemical_symbols": ["Cl"], "concentration": [1.0] }, From 07d77feadda15784e434d338a53b9d7b97bc1316 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 20 Jul 2023 15:58:11 +0200 Subject: [PATCH 07/95] Readding meta field to test_good_structures. --- tests/models/test_data/test_good_structures.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/models/test_data/test_good_structures.json b/tests/models/test_data/test_good_structures.json index b84605832..63c7c6044 100644 --- a/tests/models/test_data/test_good_structures.json +++ b/tests/models/test_data/test_good_structures.json @@ -165,6 +165,13 @@ "last_modified": { "$date": "2019-06-08T05:13:37.331Z" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"piezoelectic_perovskites" + } + } + }, "band_gap": 1.23456, "chemsys": "C-H-Cl-N-Na-O-Os-P", "elements": ["C", "Cl", "H", "N", "Na", "O", "Os", "P"], From 2848dd3e2fd314b028fa025d735ec70b85dd801d Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 20 Jul 2023 16:07:21 +0200 Subject: [PATCH 08/95] Readding meta field to test_structures.json. --- optimade/server/data/test_structures.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index 5ea0305b6..9b753de98 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -3,6 +3,13 @@ "_id": { "$oid": "5cfb441f053b174410700d02" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"piezoelectic_perovskites" + } + } + }, "assemblies": null, "chemsys": "Ac", "cartesian_site_positions": [ From 80c4dc498402f2ba495e7cad0381ea960d2f38a8 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 21 Jul 2023 11:39:21 +0200 Subject: [PATCH 09/95] Added handling None for property_metadata to validator + small correctionds. --- optimade/models/entries.py | 30 +++++++++++++---------- optimade/server/data/test_structures.json | 2 +- tests/server/query_params/conftest.py | 5 ++-- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index d992b5e9b..88f6459e7 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -198,21 +198,25 @@ def check_meta(cls, values): if values.get("attributes") else {} ) - for subfield in meta.__dict__.get( - field - ): ## ToDo The names of the fields in atributes only need to be read once so this code can still be sped up. - if subfield not in attributes: - raise ValueError( - f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." - ) - # check that the fields under subfield are starting with prefix - for subsubfield in meta.__dict__.get(field).get(subfield): - if subsubfield.startswith("_"): - cls.check_field_supported_prefix(subsubfield) - else: + property_metadata = meta.__dict__.get(field) + if property_metadata is not None: + for ( + subfield + ) in ( + property_metadata + ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. + if subfield not in attributes: raise ValueError( - f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) + # check that the fields under subfield are starting with prefix + for subsubfield in meta.__dict__.get(field).get(subfield): + if subsubfield.startswith("_"): + cls.check_field_supported_prefix(subsubfield) + else: + raise ValueError( + f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + ) else: raise ValueError( "The fields under meta either need to be database specific fields or the field `property_metadata'" diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index 9b753de98..0adb5aa7f 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -6,7 +6,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"piezoelectic_perovskites" + "_exmpl_originates_from_project":"Actinides" } } }, diff --git a/tests/server/query_params/conftest.py b/tests/server/query_params/conftest.py index f6c7ee9f3..fb80dfb9d 100644 --- a/tests/server/query_params/conftest.py +++ b/tests/server/query_params/conftest.py @@ -83,9 +83,8 @@ def inner( for entry in response["data"]: response_fields.update(set(entry.keys())) response_fields.update(set(entry["attributes"].keys())) - response_fields.discard( - "meta" - ) # As "meta" is an optional field the response may or may not have it, so we remove it here to prevent problems in the assert below. + # As "meta" is an optional field the response may or may not have it, so we remove it here to prevent problems in the assert below. + response_fields.discard("meta") assert sorted(expected_fields) == sorted(response_fields) return inner From d55abec1fed0334dbe8c67fb57500e39b0ad32d0 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:32:37 +0200 Subject: [PATCH 10/95] Added test for validator per entry meta field. --- optimade/models/entries.py | 19 +++++++------- tests/models/test_entries.py | 48 +++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 88f6459e7..bbf8a785f 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -182,23 +182,19 @@ def check_field_supported_prefix(field): f"The prefix {prefix} of the field {field} is not supported by this server." ) - @root_validator + @root_validator(pre=True) def check_meta(cls, values): """Validator to check whether meta field has been formatted correctly.""" meta = values.get("meta") if meta is not None: - for field in meta.__dict__: - if field.startswith("_"): - cls.check_field_supported_prefix(field) - elif field == "property_metadata": + for field in meta: + if field == "property_metadata": # check that all the fields under property metadata are in attributes attributes = ( - values.get("attributes").__dict__ - if values.get("attributes") - else {} + values.get("attributes") if values.get("attributes") else {} ) - property_metadata = meta.__dict__.get(field) + property_metadata = meta.get(field) if property_metadata is not None: for ( subfield @@ -210,13 +206,16 @@ def check_meta(cls, values): f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) # check that the fields under subfield are starting with prefix - for subsubfield in meta.__dict__.get(field).get(subfield): + for subsubfield in meta.get(field).get(subfield): if subsubfield.startswith("_"): cls.check_field_supported_prefix(subsubfield) else: raise ValueError( f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." ) + # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + elif field.startswith("_"): + cls.check_field_supported_prefix(field) else: raise ValueError( "The fields under meta either need to be database specific fields or the field `property_metadata'" diff --git a/tests/models/test_entries.py b/tests/models/test_entries.py index a3ab7e318..c69816667 100644 --- a/tests/models/test_entries.py +++ b/tests/models/test_entries.py @@ -1,7 +1,7 @@ import pytest from pydantic import ValidationError -from optimade.models.entries import EntryRelationships +from optimade.models.entries import EntryRelationships, EntryResource def test_simple_relationships(): @@ -48,3 +48,49 @@ def test_advanced_relationships(): } with pytest.raises(ValidationError): EntryRelationships(**relationship) + + +def test_meta(): + import copy + + good_entry_resource = { + "id": "goodstruct123", + "type": "structure", + "attributes": { + "last_modified": "2023-07-21T05:13:37.331Z", + "elements": ["Ac"], + "_exmpl_database_specific_property": "value1", + "elements_ratios": [1.0], + }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_mearsurement_method": "ICP-OES", + }, + "_exmpl_database_specific_property": { + "_exmpl_metadata_property": "metadata_value" + }, + } + }, + } + + EntryResource(**good_entry_resource) + + bad_entry_resources = [ + good_entry_resource, + copy.deepcopy(good_entry_resource), + copy.deepcopy(good_entry_resource), + ] + bad_entry_resources[0]["meta"]["property_metadata"][ + "_exmpl_database_specific_property" + ] = {"metadata_property": "metadata_value"} + bad_entry_resources[1]["meta"]["property_metadata"][ + "database_specific_property" + ] = {"_exmpl_metadata_property": "metadata_value"} + bad_entry_resources[2]["meta"]["database_specific_property"] = { + "_exmpl_metadata_property": "metadata_value" + } + + for bad_entry in bad_entry_resources: + with pytest.raises(ValueError): + EntryResource(**bad_entry) From ff545bb41f744af42167957c3e1862198fb93fc3 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:02:30 +0200 Subject: [PATCH 11/95] Added test for presence metadata field in test_structures.py. --- tests/server/routers/test_structures.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/server/routers/test_structures.py b/tests/server/routers/test_structures.py index a0e089f2d..bf49797f2 100644 --- a/tests/server/routers/test_structures.py +++ b/tests/server/routers/test_structures.py @@ -69,6 +69,12 @@ def test_structures_endpoint_data(self): assert self.json_response["data"]["type"] == "structures" assert "attributes" in self.json_response["data"] assert "_exmpl_chemsys" in self.json_response["data"]["attributes"] + assert ( + self.json_response["data"]["meta"]["property_metadata"]["elements_ratios"][ + "_exmpl_originates_from_project" + ] + == "Actinides" + ) def test_check_response_single_structure(check_response): From e0d6ff3bb3b0f70cbdc56f1de06a808dc2ab53f3 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:37:15 +0200 Subject: [PATCH 12/95] Remove metadata fields when the fields that they belong to are not returned. --- optimade/server/routers/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index e79983547..5b5cf7281 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -125,6 +125,8 @@ def handle_response_fields( for field in exclude_fields: if field in new_entry["attributes"]: del new_entry["attributes"][field] + if field in new_entry.get("meta", {}).get("property_metadata", {}): + del new_entry["meta"]["property_metadata"][field] # Include missing fields that were requested in `response_fields` for field in include_fields: From 191fbba266f7f36d441a3be3c0cdead094f5d4b4 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:50:50 +0200 Subject: [PATCH 13/95] add extra test for bad prefix. --- tests/models/test_entries.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/models/test_entries.py b/tests/models/test_entries.py index c69816667..e1a8a492e 100644 --- a/tests/models/test_entries.py +++ b/tests/models/test_entries.py @@ -80,6 +80,7 @@ def test_meta(): good_entry_resource, copy.deepcopy(good_entry_resource), copy.deepcopy(good_entry_resource), + copy.deepcopy(good_entry_resource), ] bad_entry_resources[0]["meta"]["property_metadata"][ "_exmpl_database_specific_property" @@ -90,6 +91,9 @@ def test_meta(): bad_entry_resources[2]["meta"]["database_specific_property"] = { "_exmpl_metadata_property": "metadata_value" } + bad_entry_resources[3]["meta"]["_other_database_specific_property"] = { + "_exmpl_metadata_property": "metadata_value" + } for bad_entry in bad_entry_resources: with pytest.raises(ValueError): From 6251e48f0efa741fdc3156b90cf2cdc598541658 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 25 Jul 2023 18:57:28 +0200 Subject: [PATCH 14/95] Test if dependancy conflict causes error. --- requirements-http-client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-http-client.txt b/requirements-http-client.txt index 412427a58..abdb938cb 100644 --- a/requirements-http-client.txt +++ b/requirements-http-client.txt @@ -1,3 +1,3 @@ click==8.1.5 -httpx==0.24.1 +httpx==0.23.3 rich==13.4.2 From bf9692a8ffdfa584a915227520990d7120c69b50 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 25 Jul 2023 19:40:55 +0200 Subject: [PATCH 15/95] Revert "Test if dependancy conflict causes error." This reverts commit 6251e48f0efa741fdc3156b90cf2cdc598541658. --- requirements-http-client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-http-client.txt b/requirements-http-client.txt index abdb938cb..412427a58 100644 --- a/requirements-http-client.txt +++ b/requirements-http-client.txt @@ -1,3 +1,3 @@ click==8.1.5 -httpx==0.23.3 +httpx==0.24.1 rich==13.4.2 From 08649112d9d1f47e126dfd284a00e7b112776238 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 25 Jul 2023 19:40:59 +0200 Subject: [PATCH 16/95] Revert "Revert "Test if dependancy conflict causes error."" This reverts commit bf9692a8ffdfa584a915227520990d7120c69b50. --- requirements-http-client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-http-client.txt b/requirements-http-client.txt index 412427a58..abdb938cb 100644 --- a/requirements-http-client.txt +++ b/requirements-http-client.txt @@ -1,3 +1,3 @@ click==8.1.5 -httpx==0.24.1 +httpx==0.23.3 rich==13.4.2 From eb953ad2d009d698ed3f85e33336b72dc8e72318 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:13:32 +0200 Subject: [PATCH 17/95] correct version httpx. --- requirements-http-client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-http-client.txt b/requirements-http-client.txt index abdb938cb..412427a58 100644 --- a/requirements-http-client.txt +++ b/requirements-http-client.txt @@ -1,3 +1,3 @@ click==8.1.5 -httpx==0.23.3 +httpx==0.24.1 rich==13.4.2 From 2879fac9f53fec381ca2614c48010ca3a3c402f6 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 14:04:06 +0200 Subject: [PATCH 18/95] commenting out validator to see if this resolves issue github. --- optimade/models/entries.py | 79 +++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index bbf8a785f..d7550393c 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -4,7 +4,6 @@ from pydantic import ( BaseModel, - root_validator, validator, ) @@ -182,45 +181,45 @@ def check_field_supported_prefix(field): f"The prefix {prefix} of the field {field} is not supported by this server." ) - @root_validator(pre=True) - def check_meta(cls, values): - """Validator to check whether meta field has been formatted correctly.""" - - meta = values.get("meta") - if meta is not None: - for field in meta: - if field == "property_metadata": - # check that all the fields under property metadata are in attributes - attributes = ( - values.get("attributes") if values.get("attributes") else {} - ) - property_metadata = meta.get(field) - if property_metadata is not None: - for ( - subfield - ) in ( - property_metadata - ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. - if subfield not in attributes: - raise ValueError( - f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." - ) - # check that the fields under subfield are starting with prefix - for subsubfield in meta.get(field).get(subfield): - if subsubfield.startswith("_"): - cls.check_field_supported_prefix(subsubfield) - else: - raise ValueError( - f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." - ) - # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. - elif field.startswith("_"): - cls.check_field_supported_prefix(field) - else: - raise ValueError( - "The fields under meta either need to be database specific fields or the field `property_metadata'" - ) - return values + # @root_validator(pre=True) + # def check_meta(cls, values): + # """Validator to check whether meta field has been formatted correctly.""" + # + # meta = values.get("meta") + # if meta is not None: + # for field in meta: + # if field == "property_metadata": + # # check that all the fields under property metadata are in attributes + # attributes = ( + # values.get("attributes") if values.get("attributes") else {} + # ) + # property_metadata = meta.get(field) + # if property_metadata is not None: + # for ( + # subfield + # ) in ( + # property_metadata + # ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. + # if subfield not in attributes: + # raise ValueError( + # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." + # ) + # # check that the fields under subfield are starting with prefix + # for subsubfield in meta.get(field).get(subfield): + # if subsubfield.startswith("_"): + # cls.check_field_supported_prefix(subsubfield) + # else: + # raise ValueError( + # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + # ) + # # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + # elif field.startswith("_"): + # cls.check_field_supported_prefix(field) + # else: + # raise ValueError( + # "The fields under meta either need to be database specific fields or the field `property_metadata'" + # ) + # return values class EntryInfoProperty(BaseModel): From 18e2ef109cdccfe5ccd0c13bd5e86840790eb55e Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 14:17:51 +0200 Subject: [PATCH 19/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 84 +++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index d7550393c..c399a71e0 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -2,10 +2,7 @@ from datetime import datetime from typing import Dict, List, Optional -from pydantic import ( - BaseModel, - validator, -) +from pydantic import BaseModel, root_validator, validator # pylint: disable=no-name-in-module from optimade.models.jsonapi import Attributes, Meta, Relationships, Resource @@ -181,45 +178,46 @@ def check_field_supported_prefix(field): f"The prefix {prefix} of the field {field} is not supported by this server." ) - # @root_validator(pre=True) - # def check_meta(cls, values): - # """Validator to check whether meta field has been formatted correctly.""" - # - # meta = values.get("meta") - # if meta is not None: - # for field in meta: - # if field == "property_metadata": - # # check that all the fields under property metadata are in attributes - # attributes = ( - # values.get("attributes") if values.get("attributes") else {} - # ) - # property_metadata = meta.get(field) - # if property_metadata is not None: - # for ( - # subfield - # ) in ( - # property_metadata - # ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. - # if subfield not in attributes: - # raise ValueError( - # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." - # ) - # # check that the fields under subfield are starting with prefix - # for subsubfield in meta.get(field).get(subfield): - # if subsubfield.startswith("_"): - # cls.check_field_supported_prefix(subsubfield) - # else: - # raise ValueError( - # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." - # ) - # # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. - # elif field.startswith("_"): - # cls.check_field_supported_prefix(field) - # else: - # raise ValueError( - # "The fields under meta either need to be database specific fields or the field `property_metadata'" - # ) - # return values + @root_validator(pre=True) + def check_meta(cls, values): + pass + # """Validator to check whether meta field has been formatted correctly.""" + # + # meta = values.get("meta") + # if meta is not None: + # for field in meta: + # if field == "property_metadata": + # # check that all the fields under property metadata are in attributes + # attributes = ( + # values.get("attributes") if values.get("attributes") else {} + # ) + # property_metadata = meta.get(field) + # if property_metadata is not None: + # for ( + # subfield + # ) in ( + # property_metadata + # ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. + # if subfield not in attributes: + # raise ValueError( + # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." + # ) + # # check that the fields under subfield are starting with prefix + # for subsubfield in meta.get(field).get(subfield): + # if subsubfield.startswith("_"): + # cls.check_field_supported_prefix(subsubfield) + # else: + # raise ValueError( + # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + # ) + # # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + # elif field.startswith("_"): + # cls.check_field_supported_prefix(field) + # else: + # raise ValueError( + # "The fields under meta either need to be database specific fields or the field `property_metadata'" + # ) + return values class EntryInfoProperty(BaseModel): From 7fc19066e65f93bd7d4edc633069949fcf7e4f0a Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 14:25:46 +0200 Subject: [PATCH 20/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 70 +++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index c399a71e0..3453c6e98 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -180,43 +180,43 @@ def check_field_supported_prefix(field): @root_validator(pre=True) def check_meta(cls, values): - pass # """Validator to check whether meta field has been formatted correctly.""" # - # meta = values.get("meta") - # if meta is not None: - # for field in meta: - # if field == "property_metadata": - # # check that all the fields under property metadata are in attributes - # attributes = ( - # values.get("attributes") if values.get("attributes") else {} - # ) - # property_metadata = meta.get(field) - # if property_metadata is not None: - # for ( - # subfield - # ) in ( - # property_metadata - # ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. - # if subfield not in attributes: - # raise ValueError( - # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." - # ) - # # check that the fields under subfield are starting with prefix - # for subsubfield in meta.get(field).get(subfield): - # if subsubfield.startswith("_"): - # cls.check_field_supported_prefix(subsubfield) - # else: - # raise ValueError( - # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." - # ) - # # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. - # elif field.startswith("_"): - # cls.check_field_supported_prefix(field) - # else: - # raise ValueError( - # "The fields under meta either need to be database specific fields or the field `property_metadata'" - # ) + meta = values.get("meta") + if meta is not None: + for field in meta: + if field == "property_metadata": + pass + # # check that all the fields under property metadata are in attributes + # attributes = ( + # values.get("attributes") if values.get("attributes") else {} + # ) + # property_metadata = meta.get(field) + # if property_metadata is not None: + # for ( + # subfield + # ) in ( + # property_metadata + # ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. + # if subfield not in attributes: + # raise ValueError( + # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." + # ) + # # check that the fields under subfield are starting with prefix + # for subsubfield in meta.get(field).get(subfield): + # if subsubfield.startswith("_"): + # cls.check_field_supported_prefix(subsubfield) + # else: + # raise ValueError( + # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + # ) + # # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + elif field.startswith("_"): + cls.check_field_supported_prefix(field) + else: + raise ValueError( + "The fields under meta either need to be database specific fields or the field `property_metadata'" + ) return values From b6224147a976f818875dc5a2e8a19b955e8aefa6 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 14:38:26 +0200 Subject: [PATCH 21/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 3453c6e98..a2dc5104b 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -186,18 +186,14 @@ def check_meta(cls, values): if meta is not None: for field in meta: if field == "property_metadata": - pass - # # check that all the fields under property metadata are in attributes - # attributes = ( - # values.get("attributes") if values.get("attributes") else {} - # ) - # property_metadata = meta.get(field) - # if property_metadata is not None: - # for ( - # subfield - # ) in ( - # property_metadata - # ): ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. + # check that all the fields under property metadata are in attributes + (values.get("attributes") if values.get("attributes") else {}) + property_metadata = meta.get(field) + ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. + if property_metadata is not None: + for subfield in property_metadata: + pass + # # if subfield not in attributes: # raise ValueError( # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." From 95bf11bb64f9e717cc3bd72e8a7a9b8aa85857d6 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 15:34:49 +0200 Subject: [PATCH 22/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index a2dc5104b..b467be8dc 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -187,17 +187,17 @@ def check_meta(cls, values): for field in meta: if field == "property_metadata": # check that all the fields under property metadata are in attributes - (values.get("attributes") if values.get("attributes") else {}) + attributes = ( + values.get("attributes") if values.get("attributes") else {} + ) property_metadata = meta.get(field) ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. if property_metadata is not None: for subfield in property_metadata: - pass - # - # if subfield not in attributes: - # raise ValueError( - # f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." - # ) + if subfield not in attributes: + raise ValueError( + f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." + ) # # check that the fields under subfield are starting with prefix # for subsubfield in meta.get(field).get(subfield): # if subsubfield.startswith("_"): From 7c02f388e16abf26023495ea1198649dd7862226 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 15:48:15 +0200 Subject: [PATCH 23/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index b467be8dc..6a8e6f16b 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -198,10 +198,10 @@ def check_meta(cls, values): raise ValueError( f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) - # # check that the fields under subfield are starting with prefix - # for subsubfield in meta.get(field).get(subfield): - # if subsubfield.startswith("_"): - # cls.check_field_supported_prefix(subsubfield) + # # check that the fields under subfield are starting with prefix + for subsubfield in meta.get(field).get(subfield): + if subsubfield.startswith("_"): + cls.check_field_supported_prefix(subsubfield) # else: # raise ValueError( # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." From 2b52248640367a25f12fa80a5f4fdfc00bde1b56 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 16:47:15 +0200 Subject: [PATCH 24/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 6a8e6f16b..4f79b6001 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -190,16 +190,16 @@ def check_meta(cls, values): attributes = ( values.get("attributes") if values.get("attributes") else {} ) - property_metadata = meta.get(field) + property_metadata = meta.get("property_metadata") ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. - if property_metadata is not None: + if property_metadata: for subfield in property_metadata: if subfield not in attributes: raise ValueError( f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) # # check that the fields under subfield are starting with prefix - for subsubfield in meta.get(field).get(subfield): + for subsubfield in property_metadata.get(subfield, {}): if subsubfield.startswith("_"): cls.check_field_supported_prefix(subsubfield) # else: From 20e228d2832b0469b43d97f01fb0305014fff25c Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:09:59 +0200 Subject: [PATCH 25/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 4f79b6001..ac7c82b01 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -200,8 +200,9 @@ def check_meta(cls, values): ) # # check that the fields under subfield are starting with prefix for subsubfield in property_metadata.get(subfield, {}): - if subsubfield.startswith("_"): - cls.check_field_supported_prefix(subsubfield) + pass + # if subsubfield.startswith("_"): + # cls.check_field_supported_prefix(subsubfield) # else: # raise ValueError( # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." From 7be2a0fa2266db6f4607bce94616c4d923b0e29f Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:15:17 +0200 Subject: [PATCH 26/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index ac7c82b01..f15410d11 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -200,8 +200,8 @@ def check_meta(cls, values): ) # # check that the fields under subfield are starting with prefix for subsubfield in property_metadata.get(subfield, {}): - pass - # if subsubfield.startswith("_"): + if subsubfield.startswith("_"): + pass # cls.check_field_supported_prefix(subsubfield) # else: # raise ValueError( From bffb5d1df9681170334c0117939b844d9703121b Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:20:50 +0200 Subject: [PATCH 27/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index f15410d11..4f79b6001 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -201,8 +201,7 @@ def check_meta(cls, values): # # check that the fields under subfield are starting with prefix for subsubfield in property_metadata.get(subfield, {}): if subsubfield.startswith("_"): - pass - # cls.check_field_supported_prefix(subsubfield) + cls.check_field_supported_prefix(subsubfield) # else: # raise ValueError( # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." From 1f0bbb964b09a3543a4e384437f03c11222b75ba Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:32:07 +0200 Subject: [PATCH 28/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 4f79b6001..db54420d1 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -201,12 +201,12 @@ def check_meta(cls, values): # # check that the fields under subfield are starting with prefix for subsubfield in property_metadata.get(subfield, {}): if subsubfield.startswith("_"): - cls.check_field_supported_prefix(subsubfield) - # else: - # raise ValueError( - # f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." - # ) - # # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + pass # cls.check_field_supported_prefix(subsubfield) + else: + raise ValueError( + f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + ) + # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. elif field.startswith("_"): cls.check_field_supported_prefix(field) else: From 7c0a8be46e47087f1fc520e7371a046df63453d1 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:52:49 +0200 Subject: [PATCH 29/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index db54420d1..e398a0150 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -170,13 +170,13 @@ class EntryResource(Resource): ) def check_field_supported_prefix(field): - from optimade.server.mappers import BaseResourceMapper - - prefix = field.split("_")[1] - if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: - raise ValueError( - f"The prefix {prefix} of the field {field} is not supported by this server." - ) + # from optimade.server.mappers import BaseResourceMapper + pass + # prefix = field.split("_")[1] + # if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: + # raise ValueError( + # f"The prefix {prefix} of the field {field} is not supported by this server." + # ) @root_validator(pre=True) def check_meta(cls, values): @@ -201,7 +201,7 @@ def check_meta(cls, values): # # check that the fields under subfield are starting with prefix for subsubfield in property_metadata.get(subfield, {}): if subsubfield.startswith("_"): - pass # cls.check_field_supported_prefix(subsubfield) + cls.check_field_supported_prefix(subsubfield) else: raise ValueError( f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." From 456f34fd78cb6714f01f52c66804e5cd9e29694c Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 18:10:36 +0200 Subject: [PATCH 30/95] Slowly reassembling validator to see if this resolves issue github. --- optimade/models/entries.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index e398a0150..a326e9d7c 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -170,10 +170,11 @@ class EntryResource(Resource): ) def check_field_supported_prefix(field): - # from optimade.server.mappers import BaseResourceMapper - pass - # prefix = field.split("_")[1] - # if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: + from optimade.server.mappers import BaseResourceMapper + + prefix = field.split("_")[1] + if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: + pass # raise ValueError( # f"The prefix {prefix} of the field {field} is not supported by this server." # ) From 960327721fdc564005a38776151c1e4f4f099369 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 18:54:37 +0200 Subject: [PATCH 31/95] Slowly reassembling validator to see if this resolves issue Github. --- optimade/models/entries.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index a326e9d7c..80f3c69f2 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -170,14 +170,15 @@ class EntryResource(Resource): ) def check_field_supported_prefix(field): - from optimade.server.mappers import BaseResourceMapper + # from optimade.server.mappers import BaseResourceMapper + from optimade.server.config import CONFIG prefix = field.split("_")[1] - if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: - pass - # raise ValueError( - # f"The prefix {prefix} of the field {field} is not supported by this server." - # ) + # if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: + if prefix not in CONFIG.provider.prefix: + raise ValueError( + f"The prefix {prefix} of the field {field} is not supported by this server." + ) @root_validator(pre=True) def check_meta(cls, values): From c621412b576b9e1f2bb1bae2b0e443619f0b165d Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:24:58 +0200 Subject: [PATCH 32/95] Slowly reassembling validator to see if this resolves issue Github. --- optimade/models/entries.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 80f3c69f2..dbabf8cd8 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -171,11 +171,11 @@ class EntryResource(Resource): def check_field_supported_prefix(field): # from optimade.server.mappers import BaseResourceMapper - from optimade.server.config import CONFIG + # from optimade.server.config import CONFIG prefix = field.split("_")[1] # if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: - if prefix not in CONFIG.provider.prefix: + if prefix not in "exmpl": raise ValueError( f"The prefix {prefix} of the field {field} is not supported by this server." ) From ed447362ba41386eb1a1ff278d1f9f8c14a89f7c Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:51:43 +0200 Subject: [PATCH 33/95] Slowly reassembling validator to see if this resolves issue Github.. --- optimade/models/entries.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index dbabf8cd8..a067a8c1f 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -170,12 +170,16 @@ class EntryResource(Resource): ) def check_field_supported_prefix(field): - # from optimade.server.mappers import BaseResourceMapper + import optimade.server.mappers.entries + # from optimade.server.config import CONFIG prefix = field.split("_")[1] - # if prefix not in BaseResourceMapper.SUPPORTED_PREFIXES: - if prefix not in "exmpl": + if ( + prefix + not in optimade.server.mappers.entries.BaseResourceMapper.SUPPORTED_PREFIXES + ): + # if prefix not in "exmpl": raise ValueError( f"The prefix {prefix} of the field {field} is not supported by this server." ) From 4f28acc0bdf027cd5f278b1c91f41cb48ee44002 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:15:02 +0200 Subject: [PATCH 34/95] Slowly reassembling validator to see if this resolves issue Github.. --- optimade/models/entries.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index a067a8c1f..3b5fdee5f 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -170,10 +170,12 @@ class EntryResource(Resource): ) def check_field_supported_prefix(field): + import yaml + import optimade.server.mappers.entries # from optimade.server.config import CONFIG - + yaml prefix = field.split("_")[1] if ( prefix From 63af8dc658f14685946998d5ea8240bd51d3475f Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:30:54 +0200 Subject: [PATCH 35/95] Placed yaml import in try except block. --- optimade/models/entries.py | 3 --- optimade/server/config.py | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 3b5fdee5f..37bd0b379 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -170,12 +170,9 @@ class EntryResource(Resource): ) def check_field_supported_prefix(field): - import yaml - import optimade.server.mappers.entries # from optimade.server.config import CONFIG - yaml prefix = field.split("_")[1] if ( prefix diff --git a/optimade/server/config.py b/optimade/server/config.py index 48c71fc86..bd090bb95 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -87,8 +87,6 @@ def config_file_settings(settings: BaseSettings) -> Dict[str, Any]: import json import os - import yaml - encoding = settings.__config__.env_file_encoding config_file = Path(os.getenv("OPTIMADE_CONFIG_FILE", DEFAULT_CONFIG_FILE_PATH)) @@ -100,6 +98,8 @@ def config_file_settings(settings: BaseSettings) -> Dict[str, Any]: res = json.loads(config_file_content) except json.JSONDecodeError as json_exc: try: + import yaml + # This can essentially also load JSON files, as JSON is a subset of YAML v1, # but I suspect it is not as rigorous res = yaml.safe_load(config_file_content) From 5b41b71f6f1166014e5db2ffeb34c18747963557 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 2 Aug 2023 14:15:21 +0200 Subject: [PATCH 36/95] Added more cases to test data and added bugfix for removing associated metadata when a field is excluded. --- optimade/models/entries.py | 73 +++++++++++++---------- optimade/server/data/test_structures.json | 53 +++++++++++++++- optimade/server/routers/utils.py | 9 ++- tests/server/routers/test_structures.py | 2 +- 4 files changed, 100 insertions(+), 37 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 37bd0b379..608b4cafc 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -2,7 +2,11 @@ from datetime import datetime from typing import Dict, List, Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import ( + BaseModel, + root_validator, + validator, +) # pylint: disable=no-name-in-module from optimade.models.jsonapi import Attributes, Meta, Relationships, Resource @@ -18,6 +22,26 @@ ) +def starts_with_supported_prefix(field): + from optimade.server.mappers.entries import BaseResourceMapper + + prefix = None + if field.startswith("_"): + prefix = field.split("_")[1] + if prefix in BaseResourceMapper.SUPPORTED_PREFIXES: + return True, prefix + return False, prefix + + +def _check_starts_with_supported_prefix(field, message=""): + prefixed, prefix = starts_with_supported_prefix(field) + if not prefixed: + raise ValueError( + f"The field {field} either has no prefix or the prefix {prefix} is not supported by this server." + + message + ) + + class TypedRelationship(Relationship): # This may be updated when moving to Python 3.8 @validator("data") @@ -169,55 +193,38 @@ class EntryResource(Resource): The OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object.""", ) - def check_field_supported_prefix(field): - import optimade.server.mappers.entries - - # from optimade.server.config import CONFIG - prefix = field.split("_")[1] - if ( - prefix - not in optimade.server.mappers.entries.BaseResourceMapper.SUPPORTED_PREFIXES - ): - # if prefix not in "exmpl": - raise ValueError( - f"The prefix {prefix} of the field {field} is not supported by this server." - ) - @root_validator(pre=True) def check_meta(cls, values): - # """Validator to check whether meta field has been formatted correctly.""" - # + """Validator to check whether meta field has been formatted correctly.""" meta = values.get("meta") - if meta is not None: + if meta: for field in meta: if field == "property_metadata": # check that all the fields under property metadata are in attributes - attributes = ( - values.get("attributes") if values.get("attributes") else {} - ) + attributes = values.get("attributes", {}) property_metadata = meta.get("property_metadata") - ## ToDo The names of the fields in attributes only need to be read once so this code can still be sped up. if property_metadata: for subfield in property_metadata: if subfield not in attributes: raise ValueError( f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) - # # check that the fields under subfield are starting with prefix - for subsubfield in property_metadata.get(subfield, {}): - if subsubfield.startswith("_"): - cls.check_field_supported_prefix(subsubfield) - else: - raise ValueError( - f"The Provider/Domain specific field {subsubfield} must be prefixed with a prefix that is supported by this database." + # check that the fields under subfield are starting with prefix + subsubfields = property_metadata.get(subfield) + if subsubfields: + for subsubfield in subsubfields: + _check_starts_with_supported_prefix( + subsubfield, + "Currently no OPTIMADE fields have been defined for the per attribute metadata, thus only database and domain specific fields are allowed", ) + # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. - elif field.startswith("_"): - cls.check_field_supported_prefix(field) else: - raise ValueError( - "The fields under meta either need to be database specific fields or the field `property_metadata'" + _check_starts_with_supported_prefix( + field, + 'Currently no OPTIMADE fields other than "property_metadata" have been defined for the per entry "meta" field, thus only database and domain specific fields are allowed.', ) + return values diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index 9ca447bf6..3d147c5ba 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -6,7 +6,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"Actinides" + "_exmpl_originates_from_project":"Pure Metals" } } }, @@ -87,6 +87,13 @@ "_id": { "$oid": "5cfb441f053b174410700d03" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"Actinides_Alloys" + } + } + }, "assemblies": null, "chemsys": "Ac-Ag-Ir", "cartesian_site_positions": [ @@ -204,6 +211,13 @@ "_id": { "$oid": "5cfb441f053b174410700d04" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"Actinides_Alloys" + } + } + }, "assemblies": null, "chemsys": "Ac-Ag-Pb", "cartesian_site_positions": [ @@ -330,6 +344,13 @@ "_id": { "$oid": "5cfb441f053b174410700d18" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"Actinides_Alloys" + } + } + }, "assemblies": null, "chemsys": "Ac-Mg", "cartesian_site_positions": [ @@ -420,6 +441,13 @@ "_id": { "$oid": "5cfb441f053b174410700d1f" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":null + } + } + }, "assemblies": null, "chemsys": "Ac-O", "cartesian_site_positions": [ @@ -522,6 +550,11 @@ "_id": { "$oid": "5cfb441f053b174410700d6f" }, + "meta": { + "property_metadata": { + "elements_ratios": {} + } + }, "assemblies": null, "chemsys": "Ac-Cu-F-O", "cartesian_site_positions": [ @@ -646,6 +679,13 @@ "_id": { "$oid": "5cfb441f053b174410700dc9" }, + "meta": { + "property_metadata": { + "elements_ratios": { + "_exmpl_originates_from_project":"Pure Metals" + } + } + }, "assemblies": null, "chemsys": "Ag", "cartesian_site_positions": [ @@ -713,6 +753,11 @@ "_id": { "$oid": "5cfb441f053b174410700ddd" }, + "meta": { + "property_metadata": { + "elements_ratios": null + } + }, "assemblies": null, "chemsys": "Ag-Br-Cl-Te", "cartesian_site_positions": [ @@ -903,6 +948,9 @@ "_id": { "$oid": "5cfb441f053b174410700e04" }, + "meta": { + "property_metadata": {} + }, "assemblies": null, "chemsys": "Ag-C-Cl-N-O-S", "cartesian_site_positions": [ @@ -1079,6 +1127,9 @@ "_id": { "$oid": "5cfb441f053b174410700e11" }, + "meta": { + "property_metadata": null + }, "assemblies": null, "chemsys": "Ag-C-Cl-H-N", "cartesian_site_positions": [ diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index f72f9f2a0..96a9d42cd 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -125,8 +125,13 @@ def handle_response_fields( for field in exclude_fields: if field in new_entry["attributes"]: del new_entry["attributes"][field] - if field in new_entry.get("meta", {}).get("property_metadata", {}): - del new_entry["meta"]["property_metadata"][field] + if new_entry.get("meta") and new_entry.get("meta").get( # type: ignore[union-attr] + "property_metadata" + ): + if field in new_entry.get("meta", {}).get( + "property_metadata", {} + ): # type: ignore[union-attr] + del new_entry["meta"]["property_metadata"][field] # Include missing fields that were requested in `response_fields` for field in include_fields: diff --git a/tests/server/routers/test_structures.py b/tests/server/routers/test_structures.py index bf49797f2..7f8bfa726 100644 --- a/tests/server/routers/test_structures.py +++ b/tests/server/routers/test_structures.py @@ -73,7 +73,7 @@ def test_structures_endpoint_data(self): self.json_response["data"]["meta"]["property_metadata"]["elements_ratios"][ "_exmpl_originates_from_project" ] - == "Actinides" + == "Pure Metals" ) From f694d1518895c06810fd9584c7875cdca84b4b6b Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:26:14 +0200 Subject: [PATCH 37/95] Removed seemingly unneccesary mypy ignore exception statement. --- optimade/models/entries.py | 1 - 1 file changed, 1 deletion(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 608b4cafc..f987bec9f 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -8,7 +8,6 @@ validator, ) -# pylint: disable=no-name-in-module from optimade.models.jsonapi import Attributes, Meta, Relationships, Resource from optimade.models.optimade_json import DataType, Relationship from optimade.models.utils import OptimadeField, StrictField, SupportLevel From 40ff136e86bfd8b19774cca3eb5738ee3724530a Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:30:31 +0200 Subject: [PATCH 38/95] remove change in version pyyaml in requirements.txt. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9df703569..ed6568ac5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ email_validator==2.0.0.post2 lark==1.1.7 pydantic==1.10.9 -pyyaml==6.0.1 +pyyaml==6.0 requests==2.31.0 uvicorn==0.23.1 From 8f7ca29345f26410faf7e0cca6c595658157ef40 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:59:27 +0200 Subject: [PATCH 39/95] correct spelling mistake --- openapi/index_openapi.json | 6 +- openapi/openapi.json | 126 ++++++++++++++++++------------------- optimade/models/entries.py | 2 +- 3 files changed, 67 insertions(+), 67 deletions(-) diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index c2079a213..79ad66476 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -474,7 +474,7 @@ "property_metadata": { "title": "Property Metadata", "type": "object", - "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the meta data for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." + "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." } }, "description": "Contains the metadata for the attributes of an entry" @@ -585,8 +585,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" } }, "description": "Contains key-value pairs representing the entry's properties." diff --git a/openapi/openapi.json b/openapi/openapi.json index 8fef2fe68..9f1ecd33e 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1341,8 +1341,8 @@ } }, "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "group_probabilities": { "title": "Group Probabilities", @@ -1351,8 +1351,8 @@ "type": "number" }, "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" } }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." @@ -1724,7 +1724,7 @@ "property_metadata": { "title": "Property Metadata", "type": "object", - "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the meta data for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." + "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." } }, "description": "Contains the metadata for the attributes of an entry" @@ -1835,8 +1835,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -2660,8 +2660,8 @@ "type": "string", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "links": { "title": "Links", @@ -2715,8 +2715,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "authors": { "title": "Authors", @@ -2725,8 +2725,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the authors of the reference.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "editors": { "title": "Editors", @@ -2735,8 +2735,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the editors of the reference.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "doi": { "title": "Doi", @@ -2752,8 +2752,8 @@ "type": "string", "description": "The URL of the reference.", "format": "uri", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "address": { "title": "Address", @@ -3339,8 +3339,8 @@ "type": "string" }, "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "concentration": { "title": "Concentration", @@ -3349,8 +3349,8 @@ "type": "number" }, "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "mass": { "title": "Mass", @@ -3359,9 +3359,9 @@ "type": "number" }, "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", - "x-optimade-queryable": "optional", "x-optimade-unit": "a.m.u.", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "original_name": { "title": "Original Name", @@ -3377,8 +3377,8 @@ "type": "string" }, "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "nattached": { "title": "Nattached", @@ -3387,8 +3387,8 @@ "type": "integer" }, "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" } }, "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." @@ -3466,8 +3466,8 @@ "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "links": { "title": "Links", @@ -3536,8 +3536,8 @@ "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "elements": { "title": "Elements", @@ -3547,16 +3547,16 @@ }, "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "nelements": { "title": "Nelements", "type": "integer", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "elements_ratios": { "title": "Elements Ratios", @@ -3566,16 +3566,16 @@ }, "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "chemical_formula_descriptive": { "title": "Chemical Formula Descriptive", "type": "string", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "chemical_formula_reduced": { "title": "Chemical Formula Reduced", @@ -3583,16 +3583,16 @@ "type": "string", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "chemical_formula_hill": { "title": "Chemical Formula Hill", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "chemical_formula_anonymous": { "title": "Chemical Formula Anonymous", @@ -3600,8 +3600,8 @@ "type": "string", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "dimension_types": { "title": "Dimension Types", @@ -3613,16 +3613,16 @@ }, "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", "nullable": true, - "x-optimade-queryable": "optional", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "nperiodic_dimensions": { "title": "Nperiodic Dimensions", "type": "integer", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "lattice_vectors": { "title": "Lattice Vectors", @@ -3639,9 +3639,9 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, - "x-optimade-queryable": "optional", + "x-optimade-unit": "\u00c5", "x-optimade-support": "should", - "x-optimade-unit": "\u00c5" + "x-optimade-queryable": "optional" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3656,17 +3656,17 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, - "x-optimade-queryable": "optional", + "x-optimade-unit": "\u00c5", "x-optimade-support": "should", - "x-optimade-unit": "\u00c5" + "x-optimade-queryable": "optional" }, "nsites": { "title": "Nsites", "type": "integer", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "species": { "title": "Species", @@ -3676,8 +3676,8 @@ }, "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", "nullable": true, - "x-optimade-queryable": "optional", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "species_at_sites": { "title": "Species At Sites", @@ -3687,8 +3687,8 @@ }, "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", "nullable": true, - "x-optimade-queryable": "optional", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "assemblies": { "title": "Assemblies", @@ -3697,8 +3697,8 @@ "$ref": "#/components/schemas/Assembly" }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "structure_features": { "title": "Structure Features", @@ -3707,8 +3707,8 @@ "$ref": "#/components/schemas/StructureFeatures" }, "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" } }, "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." diff --git a/optimade/models/entries.py b/optimade/models/entries.py index f987bec9f..535cc7d98 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -129,7 +129,7 @@ class EntryMetadata(Meta): property_metadata: Dict = StrictField( None, - description="""A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the meta data for that property. + description="""A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property. Database-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes).""", ) From 6a20ef9ab5df11486be0b6884c4bfddff18864f9 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 2 Aug 2023 19:19:28 +0200 Subject: [PATCH 40/95] moved starts_with_supported_prefix and check_starts_with_supported_prefix functions to BaseresouceMapper. --- optimade/models/entries.py | 28 ++++++------------------- optimade/server/mappers/entries.py | 33 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 535cc7d98..85ed9d267 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -21,26 +21,6 @@ ) -def starts_with_supported_prefix(field): - from optimade.server.mappers.entries import BaseResourceMapper - - prefix = None - if field.startswith("_"): - prefix = field.split("_")[1] - if prefix in BaseResourceMapper.SUPPORTED_PREFIXES: - return True, prefix - return False, prefix - - -def _check_starts_with_supported_prefix(field, message=""): - prefixed, prefix = starts_with_supported_prefix(field) - if not prefixed: - raise ValueError( - f"The field {field} either has no prefix or the prefix {prefix} is not supported by this server." - + message - ) - - class TypedRelationship(Relationship): # This may be updated when moving to Python 3.8 @validator("data") @@ -195,6 +175,10 @@ class EntryResource(Resource): @root_validator(pre=True) def check_meta(cls, values): """Validator to check whether meta field has been formatted correctly.""" + from optimade.server.mappers.entries import ( + BaseResourceMapper, + ) + meta = values.get("meta") if meta: for field in meta: @@ -212,14 +196,14 @@ def check_meta(cls, values): subsubfields = property_metadata.get(subfield) if subsubfields: for subsubfield in subsubfields: - _check_starts_with_supported_prefix( + BaseResourceMapper.check_starts_with_supported_prefix( subsubfield, "Currently no OPTIMADE fields have been defined for the per attribute metadata, thus only database and domain specific fields are allowed", ) # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. else: - _check_starts_with_supported_prefix( + BaseResourceMapper.check_starts_with_supported_prefix( field, 'Currently no OPTIMADE fields other than "property_metadata" have been defined for the per entry "meta" field, thus only database and domain specific fields are allowed.', ) diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index 4c5895504..6853c94f3 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -383,3 +383,36 @@ def deserialize( return cls.ENTRY_RESOURCE_CLASS(**cls.map_back(results)) return [cls.ENTRY_RESOURCE_CLASS(**cls.map_back(doc)) for doc in results] + + @staticmethod + def starts_with_supported_prefix(field: str): + """Tests whether the supplied field has a field that is supported by this server. + Parameters: + field: The field/string for which it should be checked that it starts with a supported prefix. + + Returns: + A boolean which is true if the field/string starts with a supported prefix. + A string, containing the prefix if the field has a prefix otherwise it returns 'None'. + """ + + prefix = None + if field.startswith("_"): + prefix = field.split("_")[1] + if prefix in BaseResourceMapper.SUPPORTED_PREFIXES: + return True, prefix + return False, prefix + + @classmethod + def check_starts_with_supported_prefix(cls, field: str, message: str = ""): + """Raises a value error if the field does not start with a supported prefix. + Parameters: + field: The field/string for which it should be checked that it starts with a supported prefix. + message: An additional error message that will be appended to the default error message. + """ + + prefixed, prefix = cls.starts_with_supported_prefix(field) + if not prefixed: + raise ValueError( + f"The field {field} either has no prefix or the prefix {prefix} is not supported by this server." + + message + ) From e95c9b481aa31d664dace150b287b0628ffb2175 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:10:16 +0200 Subject: [PATCH 41/95] Expanded docstring check_starts_with_supported_prefix --- optimade/server/mappers/entries.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index 6853c94f3..20a3ddb36 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -408,6 +408,8 @@ def check_starts_with_supported_prefix(cls, field: str, message: str = ""): Parameters: field: The field/string for which it should be checked that it starts with a supported prefix. message: An additional error message that will be appended to the default error message. + Rerturns: + Raises a value error when the field has no valid prefix. """ prefixed, prefix = cls.starts_with_supported_prefix(field) From bcd79714d1c40fac706d34d2708b0754a2627ba1 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:15:05 +0200 Subject: [PATCH 42/95] Expanded docstring check_starts_with_supported_prefix --- optimade/server/mappers/entries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index 20a3ddb36..d561da9ca 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -408,7 +408,7 @@ def check_starts_with_supported_prefix(cls, field: str, message: str = ""): Parameters: field: The field/string for which it should be checked that it starts with a supported prefix. message: An additional error message that will be appended to the default error message. - Rerturns: + Returns: Raises a value error when the field has no valid prefix. """ From 748baccc681cf515254aa8f4868d9b957607be7e Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:36:10 +0200 Subject: [PATCH 43/95] Added return type for starts_with_supported_prefix and check_starts_with_supported_prefix. --- optimade/server/mappers/entries.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index d561da9ca..bd566acea 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -1,6 +1,16 @@ import warnings from functools import lru_cache -from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type, Union +from typing import ( + Any, + Dict, + Iterable, + List, + Optional, + Set, + Tuple, + Type, + Union, +) from optimade.models.entries import EntryResource @@ -385,7 +395,7 @@ def deserialize( return [cls.ENTRY_RESOURCE_CLASS(**cls.map_back(doc)) for doc in results] @staticmethod - def starts_with_supported_prefix(field: str): + def starts_with_supported_prefix(field: str) -> Tuple[bool, str | None]: """Tests whether the supplied field has a field that is supported by this server. Parameters: field: The field/string for which it should be checked that it starts with a supported prefix. @@ -403,7 +413,7 @@ def starts_with_supported_prefix(field: str): return False, prefix @classmethod - def check_starts_with_supported_prefix(cls, field: str, message: str = ""): + def check_starts_with_supported_prefix(cls, field: str, message: str = "") -> None: """Raises a value error if the field does not start with a supported prefix. Parameters: field: The field/string for which it should be checked that it starts with a supported prefix. From 8430ddd27a1f5ca650db1dcc64e04c9b95eb37fe Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:46:49 +0200 Subject: [PATCH 44/95] Added return type for starts_with_supported_prefix and check_starts_with_supported_prefix. --- optimade/server/mappers/entries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index bd566acea..d46566386 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -395,7 +395,7 @@ def deserialize( return [cls.ENTRY_RESOURCE_CLASS(**cls.map_back(doc)) for doc in results] @staticmethod - def starts_with_supported_prefix(field: str) -> Tuple[bool, str | None]: + def starts_with_supported_prefix(field: str) -> Tuple[bool, Union[str, None]]: """Tests whether the supplied field has a field that is supported by this server. Parameters: field: The field/string for which it should be checked that it starts with a supported prefix. From ac26f090d82f850a3a7324330e71759d323232e8 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 13:56:44 +0200 Subject: [PATCH 45/95] Adjusted validators baseed on suggestion Matthew. Co-authored-by: ml-evs ml-evs@users.noreply.github.com --- optimade/models/entries.py | 65 +++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 85ed9d267..b9e7802a8 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -113,6 +113,23 @@ class EntryMetadata(Meta): Database-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes).""", ) + @validator("property_metadata") + def check_property_metadata_subfields(cls, property_metadata): + from optimade.server.mappers.entries import ( + BaseResourceMapper, + ) + + if property_metadata: + for field in property_metadata: + subfields = property_metadata.get(field) + if subfields: + for subsubfield in subfields: + BaseResourceMapper.check_starts_with_supported_prefix( + subsubfield, + "Currently no OPTIMADE fields have been defined for the per attribute metadata, thus only database and domain specific fields are allowed", + ) + return property_metadata + class EntryResource(Resource): """The base model for an entry resource.""" @@ -180,34 +197,30 @@ def check_meta(cls, values): ) meta = values.get("meta") - if meta: - for field in meta: - if field == "property_metadata": - # check that all the fields under property metadata are in attributes - attributes = values.get("attributes", {}) - property_metadata = meta.get("property_metadata") - if property_metadata: - for subfield in property_metadata: - if subfield not in attributes: - raise ValueError( - f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." - ) - # check that the fields under subfield are starting with prefix - subsubfields = property_metadata.get(subfield) - if subsubfields: - for subsubfield in subsubfields: - BaseResourceMapper.check_starts_with_supported_prefix( - subsubfield, - "Currently no OPTIMADE fields have been defined for the per attribute metadata, thus only database and domain specific fields are allowed", - ) - - # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. - else: - BaseResourceMapper.check_starts_with_supported_prefix( - field, - 'Currently no OPTIMADE fields other than "property_metadata" have been defined for the per entry "meta" field, thus only database and domain specific fields are allowed.', + if not meta: + return values + + if property_metadata := meta.pop("property_metadata", None): + # check that all the fields under property metadata are in attributes + attributes = values.get("attributes", {}) + for subfield in property_metadata: + if subfield not in attributes: + raise ValueError( + f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) + for ( + field + ) in ( + meta + ): # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + BaseResourceMapper.check_starts_with_supported_prefix( + field, + 'Currently no OPTIMADE fields other than "property_metadata" have been defined for the per entry "meta" field, thus only database and domain specific fields are allowed.', + ) + + values["meta"]["property_metadata"] = property_metadata + return values From e1c4901373f4c4923ff063ce5a39600d562c321c Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 15:48:33 +0200 Subject: [PATCH 46/95] small corrections validators. --- optimade/models/entries.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index b9e7802a8..d0bffac77 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -121,11 +121,10 @@ def check_property_metadata_subfields(cls, property_metadata): if property_metadata: for field in property_metadata: - subfields = property_metadata.get(field) - if subfields: - for subsubfield in subfields: + if attribute_meta_dict := property_metadata.get(field): + for subfield in attribute_meta_dict: BaseResourceMapper.check_starts_with_supported_prefix( - subsubfield, + subfield, "Currently no OPTIMADE fields have been defined for the per attribute metadata, thus only database and domain specific fields are allowed", ) return property_metadata @@ -209,11 +208,8 @@ def check_meta(cls, values): f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) - for ( - field - ) in ( - meta - ): # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. + for field in meta: BaseResourceMapper.check_starts_with_supported_prefix( field, 'Currently no OPTIMADE fields other than "property_metadata" have been defined for the per entry "meta" field, thus only database and domain specific fields are allowed.', From 7dab3a7a04b050f47809555be4aa885f7f0b9f78 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:47:15 +0200 Subject: [PATCH 47/95] small correction in removing unrequested metadata. --- optimade/server/routers/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index 96a9d42cd..72e92fcf7 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -125,12 +125,12 @@ def handle_response_fields( for field in exclude_fields: if field in new_entry["attributes"]: del new_entry["attributes"][field] - if new_entry.get("meta") and new_entry.get("meta").get( # type: ignore[union-attr] - "property_metadata" + if new_entry.get("meta") and ( + property_meta_data_fields := new_entry.get("meta").get( # type: ignore[union-attr] + "property_metadata" + ) ): - if field in new_entry.get("meta", {}).get( - "property_metadata", {} - ): # type: ignore[union-attr] + if field in property_meta_data_fields: del new_entry["meta"]["property_metadata"][field] # Include missing fields that were requested in `response_fields` From da8a026a9bfec996fd753a57ecdccf862297e9f9 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 3 Aug 2023 17:01:03 +0200 Subject: [PATCH 48/95] Added spaces before values 'exmpl_originates_from _project'. --- optimade/server/data/test_structures.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index 3d147c5ba..c189ad981 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -6,7 +6,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"Pure Metals" + "_exmpl_originates_from_project": "Pure Metals" } } }, @@ -90,7 +90,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"Actinides_Alloys" + "_exmpl_originates_from_project": "Actinides_Alloys" } } }, @@ -214,7 +214,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"Actinides_Alloys" + "_exmpl_originates_from_project": "Actinides_Alloys" } } }, @@ -347,7 +347,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"Actinides_Alloys" + "_exmpl_originates_from_project": "Actinides_Alloys" } } }, @@ -444,7 +444,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":null + "_exmpl_originates_from_project": null } } }, @@ -682,7 +682,7 @@ "meta": { "property_metadata": { "elements_ratios": { - "_exmpl_originates_from_project":"Pure Metals" + "_exmpl_originates_from_project": "Pure Metals" } } }, From 92da84e3d1d317cdf556ef4ba34746e329b7a43e Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 4 Aug 2023 17:19:02 +0200 Subject: [PATCH 49/95] First draft version of model of jsonlines response. --- docs/api_reference/JSONLines.md | 3 + docs/api_reference/models/jsonlines.md | 5 + optimade/JSONLines.py | 0 optimade/models/jsonlines.py | 124 +++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 docs/api_reference/JSONLines.md create mode 100644 docs/api_reference/models/jsonlines.md create mode 100644 optimade/JSONLines.py create mode 100644 optimade/models/jsonlines.py diff --git a/docs/api_reference/JSONLines.md b/docs/api_reference/JSONLines.md new file mode 100644 index 000000000..63c2638e1 --- /dev/null +++ b/docs/api_reference/JSONLines.md @@ -0,0 +1,3 @@ +# JSONLines + +::: optimade.JSONLines diff --git a/docs/api_reference/models/jsonlines.md b/docs/api_reference/models/jsonlines.md new file mode 100644 index 000000000..e2d6628c7 --- /dev/null +++ b/docs/api_reference/models/jsonlines.md @@ -0,0 +1,5 @@ +# jsonlines + +::: optimade.models.jsonlines + options: + show_if_no_docstring: true diff --git a/optimade/JSONLines.py b/optimade/JSONLines.py new file mode 100644 index 000000000..e69de29bb diff --git a/optimade/models/jsonlines.py b/optimade/models/jsonlines.py new file mode 100644 index 000000000..c96e27b74 --- /dev/null +++ b/optimade/models/jsonlines.py @@ -0,0 +1,124 @@ +from typing import Optional + +from pydantic import BaseModel # pylint: disable=no-name-in-module + +from optimade.models.utils import OptimadeField, SupportLevel + + +class JsonLinesHeader(BaseModel): + optimade_partial_data: dict = OptimadeField( + ..., + description="""An object identifying the response as being on OPTIMADE partial data format. +It MUST contain the following key: +"version": String. Specifies the minor version of the partial data format used. The string MUST be of the format "MAJOR.MINOR", referring to the version of the OPTIMADE standard that describes the format. The version number string MUST NOT be prefixed by, e.g., "v". In implementations of the present version of the standard, the value MUST be exactly 1.2. A client MUST NOT expect to be able to parse the version value if the field is not a string of the format MAJOR.MINOR or if the MAJOR version number is unrecognized. + +- **Type**: Dictionary. + +- **Requirements/Conventions**: + - **Support**: MUST be supported by all implementations, MUST NOT be `null`. + +- **Examples**: + - `""optimade-partial-data": {"version": "1.2.0"}"`""", + support=SupportLevel.MUST, + ) + layout: str = OptimadeField( + ..., + description="""A string either equal to "dense" or "sparse" to indicate whether the returned format uses a dense or sparse layout. + +- **Type**: string. + +- **Requirements/Conventions**: + - **Support**: MUST be supported by all implementations, MUST NOT be `null`. + +- **Examples**: + - `"dense"` + - `"sparse"`""", + support=SupportLevel.MUST, + ) + returned_ranges: Optional[list[dict]] = OptimadeField( + None, + description="""Array of Objects. For dense layout, and sparse layout of one dimensional list properties, the array contains a single element which is a slice object representing the range of data present in the response. In the specific case of a hierarchy of list properties represented as a sparse multi-dimensional array, if the field "returned_ranges" is given, it MUST contain one slice object per dimension of the multi-dimensional array, representing slices for each dimension that cover the data given in the response. + +- **Type**: List of Dictionaries. + +- **Requirements/Conventions**: + - **Support**: SHOULD be supported by all implementations, SHOULD NOT be `null`. + +- **Examples**: + - `""returned_ranges": [{"start": 10, "stop": 20, "step": 2}]"` + - `""returned_ranges": [{"start": 10, "stop": 20, "step": 2}, {"start": 0, "stop": 9, "step": 1}]"`""", + support=SupportLevel.SHOULD, + ) + property_name: Optional[str] = OptimadeField( + None, + description="""The name of the property being provided. + +- **Type**: string. + +- **Requirements/Conventions**: + - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.. + +- **Examples**: + - `"cartesian_site_positions"`""", + support=SupportLevel.OPTIONAL, + ) + entry: Optional[dict] = OptimadeField( + None, + description=""" Object. An object that MUST have the following two keys: + + "id": String. The id of the entry of the property being provided. + "type": String. The type of the entry of the property being provided. + + +- **Type**: string. + +- **Requirements/Conventions**: + - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.. + +- **Examples**: + - `"{"id": "mpf_72", "type": structure"}`""", + support=SupportLevel.OPTIONAL, + ) + has_references: Optional[bool] = OptimadeField( + None, + description=""" An optional boolean to indicate whether any of the data lines in the response contains a reference marker. A value of false means that the client does not have to process any of the lines to detect reference markers, which may speed up the parsing. + +- **Type**: boolean. + +- **Requirements/Conventions**: + - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.. + +- **Examples**: + - `false`""", + support=SupportLevel.OPTIONAL, + ) + item_schema: Optional[dict] = OptimadeField( + None, + description="""An object that represents a JSON Schema that validates the data lines of the response. The format SHOULD be the relevant partial extract of a valid property definition as described in Property Definitions. If a schema is provided, it MUST be a valid JSON schema using the same version of JSON schema as described in that section. +- **Type**: dictionary. + +- **Requirements/Conventions**: + - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.. +""", + support=SupportLevel.OPTIONAL, + ) + + links: Optional[dict] = OptimadeField( + None, + description=""" An object to provide relevant links for the property being provided. It MAY contain the following key: + + "base_url": String. The base URL of the implementation serving the database to which this property belongs. + "item_describedby": String. A URL to an external JSON Schema that validates the data lines of the response. The format and requirements on this schema are the same as for the inline schema field item_schema. + +- **Type**: dictionary. + +- **Requirements/Conventions**: + - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.. +""", + support=SupportLevel.OPTIONAL, + ) + + +class JsonLinesResponse(BaseModel): + header: JsonLinesHeader + data: list From f39c734b19838ad1bf211d92c6ebf9f19c24d2de Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 8 Aug 2023 18:10:11 +0200 Subject: [PATCH 50/95] renamed files to partialdata. --- .../models/{jsonlines.md => partialdata.md} | 4 ++-- optimade/JSONLines.py | 8 +++++++ .../models/{jsonlines.py => partialdata.py} | 12 +++++------ tests/models/test_partialdata.py | 21 +++++++++++++++++++ 4 files changed, 37 insertions(+), 8 deletions(-) rename docs/api_reference/models/{jsonlines.md => partialdata.md} (50%) rename optimade/models/{jsonlines.py => partialdata.py} (95%) create mode 100644 tests/models/test_partialdata.py diff --git a/docs/api_reference/models/jsonlines.md b/docs/api_reference/models/partialdata.md similarity index 50% rename from docs/api_reference/models/jsonlines.md rename to docs/api_reference/models/partialdata.md index e2d6628c7..0665311ef 100644 --- a/docs/api_reference/models/jsonlines.md +++ b/docs/api_reference/models/partialdata.md @@ -1,5 +1,5 @@ -# jsonlines +# partialdata -::: optimade.models.jsonlines +::: optimade.models.partialdata options: show_if_no_docstring: true diff --git a/optimade/JSONLines.py b/optimade/JSONLines.py index e69de29bb..62d2a2e44 100644 --- a/optimade/JSONLines.py +++ b/optimade/JSONLines.py @@ -0,0 +1,8 @@ +from typing import Union + +from optimade.models.partialdata import PartialDataResponse + + +def to_JSONL(input: Union[list[dict], PartialDataResponse]): + """This function convert a list of dictionaries to the JSONL format which can be send back in an OPTIMADE partial data response""" + pass diff --git a/optimade/models/jsonlines.py b/optimade/models/partialdata.py similarity index 95% rename from optimade/models/jsonlines.py rename to optimade/models/partialdata.py index c96e27b74..1af84fedd 100644 --- a/optimade/models/jsonlines.py +++ b/optimade/models/partialdata.py @@ -1,11 +1,11 @@ -from typing import Optional +from typing import Literal, Optional -from pydantic import BaseModel # pylint: disable=no-name-in-module +from pydantic import BaseModel from optimade.models.utils import OptimadeField, SupportLevel -class JsonLinesHeader(BaseModel): +class PartialDataHeader(BaseModel): optimade_partial_data: dict = OptimadeField( ..., description="""An object identifying the response as being on OPTIMADE partial data format. @@ -21,7 +21,7 @@ class JsonLinesHeader(BaseModel): - `""optimade-partial-data": {"version": "1.2.0"}"`""", support=SupportLevel.MUST, ) - layout: str = OptimadeField( + layout: Literal["dense", "sparse"] = OptimadeField( ..., description="""A string either equal to "dense" or "sparse" to indicate whether the returned format uses a dense or sparse layout. @@ -119,6 +119,6 @@ class JsonLinesHeader(BaseModel): ) -class JsonLinesResponse(BaseModel): - header: JsonLinesHeader +class PartialDataResponse(BaseModel): + header: PartialDataHeader data: list diff --git a/tests/models/test_partialdata.py b/tests/models/test_partialdata.py new file mode 100644 index 000000000..3fcf4b194 --- /dev/null +++ b/tests/models/test_partialdata.py @@ -0,0 +1,21 @@ +from optimade.models.partialdata import PartialDataResponse + + +def test_object_generation(): + test_object = { + "header": { + "optimade_partial_data": {"version": "1.2.0"}, + "layout": "dense", + "returned_ranges": [{"start": 10, "stop": 20, "step": 2}], + }, + "data": [ + 123, + 345, + -12.6, + ["PARTIAL-DATA-NEXT", ["https://example.db.org/value4"]], + ], + } + + PartialDataResponse(**test_object) + + pass From 8c889c6152c79cb55dacd2ee94da516b5e864e78 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 10 Aug 2023 11:47:51 +0200 Subject: [PATCH 51/95] First draft version of model of jsonlines response. --- docs/api_reference/JSONLines.md | 3 -- docs/api_reference/adapters/jsonl.md | 3 ++ optimade/JSONLines.py | 8 ------ optimade/adapters/jsonl.py | 42 ++++++++++++++++++++++++++++ tests/adapters/test_jsonl.py | 19 +++++++++++++ 5 files changed, 64 insertions(+), 11 deletions(-) delete mode 100644 docs/api_reference/JSONLines.md create mode 100644 docs/api_reference/adapters/jsonl.md delete mode 100644 optimade/JSONLines.py create mode 100644 optimade/adapters/jsonl.py create mode 100644 tests/adapters/test_jsonl.py diff --git a/docs/api_reference/JSONLines.md b/docs/api_reference/JSONLines.md deleted file mode 100644 index 63c2638e1..000000000 --- a/docs/api_reference/JSONLines.md +++ /dev/null @@ -1,3 +0,0 @@ -# JSONLines - -::: optimade.JSONLines diff --git a/docs/api_reference/adapters/jsonl.md b/docs/api_reference/adapters/jsonl.md new file mode 100644 index 000000000..6e9eeb43e --- /dev/null +++ b/docs/api_reference/adapters/jsonl.md @@ -0,0 +1,3 @@ +# jsonl + +::: optimade.adapters.jsonl diff --git a/optimade/JSONLines.py b/optimade/JSONLines.py deleted file mode 100644 index 62d2a2e44..000000000 --- a/optimade/JSONLines.py +++ /dev/null @@ -1,8 +0,0 @@ -from typing import Union - -from optimade.models.partialdata import PartialDataResponse - - -def to_JSONL(input: Union[list[dict], PartialDataResponse]): - """This function convert a list of dictionaries to the JSONL format which can be send back in an OPTIMADE partial data response""" - pass diff --git a/optimade/adapters/jsonl.py b/optimade/adapters/jsonl.py new file mode 100644 index 000000000..60979192c --- /dev/null +++ b/optimade/adapters/jsonl.py @@ -0,0 +1,42 @@ +from io import BufferedReader, BytesIO +from pathlib import Path +from typing import Union + +from jsonlines import Reader, Writer + +from optimade.models.partialdata import PartialDataResponse + + +def to_jsonl(input_data: Union[list[dict], PartialDataResponse]) -> bytes: + """This function convert a list of dictionaries to the JSONL format which can be sent back in an OPTIMADE partial data response""" + temp_file = BytesIO() + writer = Writer(temp_file) + if isinstance(input_data, PartialDataResponse): + writer.write(input_data.header) + input_data = input_data.data + if isinstance(input_data, list): + writer.write_all(input_data) + else: + writer.write(input_data) + writer.close() + file_content = temp_file.getvalue() + temp_file.close() + return file_content + + +def from_jsonl( + jsonl_input: Union[Path, str, bytes] +) -> Union[list, PartialDataResponse]: + if isinstance(jsonl_input, (Path, str)): + fp: Union[BytesIO, BufferedReader] = open(jsonl_input, "rb") + else: + fp = BytesIO(jsonl_input) + decoded = [] + reader = Reader(fp) + for obj in reader: + decoded.append( + obj + ) # Appending is slow, so it would be better to use a more efficient method + reader.close() + fp.close() + return decoded diff --git a/tests/adapters/test_jsonl.py b/tests/adapters/test_jsonl.py new file mode 100644 index 000000000..2bda96c2c --- /dev/null +++ b/tests/adapters/test_jsonl.py @@ -0,0 +1,19 @@ +from optimade.adapters.jsonl import from_jsonl, to_jsonl + + +def test_to_jsonl(): + test_object = [ + { + "optimade_partial_data": {"version": "1.2.0"}, + "layout": "dense", + "returned_ranges": [{"start": 10, "stop": 20, "step": 2}], + }, + 1243, + 345, + -12.6, + ["PARTIAL-DATA-NEXT", ["https://example.db.org/value4"]], + ] + file_content = to_jsonl(test_object) + reprocessed_file = from_jsonl(file_content) + assert test_object == reprocessed_file + pass From 75669c81f98eeeddf2a5208a0debabd383d76592 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:35:56 +0200 Subject: [PATCH 52/95] added metadata fields for partial data protocal to entry models. --- openapi/index_openapi.json | 36 +- openapi/openapi.json | 156 +++++---- optimade/models/entries.py | 47 ++- optimade/server/data/test_structures.json | 383 +--------------------- tests/adapters/test_jsonl.py | 18 +- tests/adapters/testdata.jsonl | 5 + 6 files changed, 191 insertions(+), 454 deletions(-) create mode 100644 tests/adapters/testdata.jsonl diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index 79ad66476..fae87ce9b 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -475,6 +475,17 @@ "title": "Property Metadata", "type": "object", "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." + }, + "partial_data_links": { + "title": "Partial Data Links", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PartialDataLink" + } + }, + "description": "A dictionary, where the keys are the names of the properties in the attributes field for which the value is too large to be shared by default.\n For each property one or more links are provided from which the value of the attribute can be retrieved." } }, "description": "Contains the metadata for the attributes of an entry" @@ -585,8 +596,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -1405,6 +1416,27 @@ }, "description": "detail MUST be present" }, + "PartialDataLink": { + "title": "PartialDataLink", + "required": [ + "link", + "format" + ], + "type": "object", + "properties": { + "link": { + "title": "Link", + "maxLength": 65536, + "minLength": 1, + "type": "string", + "format": "uri" + }, + "format": { + "title": "Format", + "type": "string" + } + } + }, "Provider": { "title": "Provider", "required": [ diff --git a/openapi/openapi.json b/openapi/openapi.json index 9f1ecd33e..e2523f4e4 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1341,8 +1341,8 @@ } }, "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "group_probabilities": { "title": "Group Probabilities", @@ -1351,8 +1351,8 @@ "type": "number" }, "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" } }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." @@ -1725,6 +1725,17 @@ "title": "Property Metadata", "type": "object", "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." + }, + "partial_data_links": { + "title": "Partial Data Links", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PartialDataLink" + } + }, + "description": "A dictionary, where the keys are the names of the properties in the attributes field for which the value is too large to be shared by default.\n For each property one or more links are provided from which the value of the attribute can be retrieved." } }, "description": "Contains the metadata for the attributes of an entry" @@ -1835,8 +1846,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -2514,6 +2525,27 @@ }, "description": "detail MUST be present" }, + "PartialDataLink": { + "title": "PartialDataLink", + "required": [ + "link", + "format" + ], + "type": "object", + "properties": { + "link": { + "title": "Link", + "maxLength": 65536, + "minLength": 1, + "type": "string", + "format": "uri" + }, + "format": { + "title": "Format", + "type": "string" + } + } + }, "Periodicity": { "title": "Periodicity", "enum": [ @@ -2660,8 +2692,8 @@ "type": "string", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -2715,8 +2747,8 @@ "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "authors": { "title": "Authors", @@ -2725,8 +2757,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the authors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "editors": { "title": "Editors", @@ -2735,8 +2767,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the editors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "doi": { "title": "Doi", @@ -2752,8 +2784,8 @@ "type": "string", "description": "The URL of the reference.", "format": "uri", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "address": { "title": "Address", @@ -3339,8 +3371,8 @@ "type": "string" }, "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "concentration": { "title": "Concentration", @@ -3349,8 +3381,8 @@ "type": "number" }, "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "mass": { "title": "Mass", @@ -3359,9 +3391,9 @@ "type": "number" }, "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", + "x-optimade-queryable": "optional", "x-optimade-unit": "a.m.u.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-support": "optional" }, "original_name": { "title": "Original Name", @@ -3377,8 +3409,8 @@ "type": "string" }, "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "nattached": { "title": "Nattached", @@ -3387,8 +3419,8 @@ "type": "integer" }, "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" } }, "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." @@ -3466,8 +3498,8 @@ "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -3536,8 +3568,8 @@ "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "elements": { "title": "Elements", @@ -3547,16 +3579,16 @@ }, "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "nelements": { "title": "Nelements", "type": "integer", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "elements_ratios": { "title": "Elements Ratios", @@ -3566,16 +3598,16 @@ }, "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_descriptive": { "title": "Chemical Formula Descriptive", "type": "string", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_reduced": { "title": "Chemical Formula Reduced", @@ -3583,16 +3615,16 @@ "type": "string", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_hill": { "title": "Chemical Formula Hill", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "chemical_formula_anonymous": { "title": "Chemical Formula Anonymous", @@ -3600,8 +3632,8 @@ "type": "string", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "dimension_types": { "title": "Dimension Types", @@ -3613,16 +3645,16 @@ }, "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "nperiodic_dimensions": { "title": "Nperiodic Dimensions", "type": "integer", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "lattice_vectors": { "title": "Lattice Vectors", @@ -3639,9 +3671,9 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, + "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-support": "should" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3656,17 +3688,17 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, + "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-support": "should" }, "nsites": { "title": "Nsites", "type": "integer", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "species": { "title": "Species", @@ -3676,8 +3708,8 @@ }, "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "species_at_sites": { "title": "Species At Sites", @@ -3687,8 +3719,8 @@ }, "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "assemblies": { "title": "Assemblies", @@ -3697,8 +3729,8 @@ "$ref": "#/components/schemas/Assembly" }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "structure_features": { "title": "Structure Features", @@ -3707,8 +3739,8 @@ "$ref": "#/components/schemas/StructureFeatures" }, "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" } }, "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." diff --git a/optimade/models/entries.py b/optimade/models/entries.py index d0bffac77..5eca558c5 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -2,11 +2,7 @@ from datetime import datetime from typing import Dict, List, Optional -from pydantic import ( - BaseModel, - root_validator, - validator, -) +from pydantic import AnyUrl, BaseModel, root_validator, validator from optimade.models.jsonapi import Attributes, Meta, Relationships, Resource from optimade.models.optimade_json import DataType, Relationship @@ -104,6 +100,11 @@ def cast_immutable_id_to_str(cls, value): return value +class PartialDataLink(BaseModel): + link: AnyUrl + format: str # todo add check that the value of format is in a list of supported formats. + + class EntryMetadata(Meta): """Contains the metadata for the attributes of an entry""" @@ -113,6 +114,12 @@ class EntryMetadata(Meta): Database-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes).""", ) + partial_data_links: Dict[str, list[PartialDataLink]] = StrictField( + None, + description="""A dictionary, where the keys are the names of the properties in the attributes field for which the value is too large to be shared by default. + For each property one or more links are provided from which the value of the attribute can be retrieved.""", + ) + @validator("property_metadata") def check_property_metadata_subfields(cls, property_metadata): from optimade.server.mappers.entries import ( @@ -129,6 +136,25 @@ def check_property_metadata_subfields(cls, property_metadata): ) return property_metadata + @validator("partial_data_links") + def check_partial_data_links_subfields(cls, partial_data_links): + from optimade.server.mappers.entries import ( + BaseResourceMapper, + ) + + if partial_data_links: + for field in partial_data_links: + if attribute_partial_data_link := partial_data_links.get(field): + for subdict in attribute_partial_data_link: + for subfield in subdict.__dict__: + if subfield in ("link", "format"): + continue + BaseResourceMapper.check_starts_with_supported_prefix( + subfield, + "The only OPTIMADE fields defined under the 'partial_data_links' field are 'format'and ĺinks' all other database and domain specific fields must have a database/domain specific prefix.", + ) + return partial_data_links + class EntryResource(Resource): """The base model for an entry resource.""" @@ -199,6 +225,7 @@ def check_meta(cls, values): if not meta: return values + # todo the code for property_metadata and partial_data_links is very similar so it should be possible to reduce the size of the code here. if property_metadata := meta.pop("property_metadata", None): # check that all the fields under property metadata are in attributes attributes = values.get("attributes", {}) @@ -208,6 +235,15 @@ def check_meta(cls, values): f"The keys under the field `property_metadata` need to match with the field names in attributes. The field {subfield} is however not in attributes." ) + if partial_data_links := meta.pop("partial_data_links", None): + # check that all the fields under property metadata are in attributes + attributes = values.get("attributes", {}) + for subfield in partial_data_links: + if subfield not in attributes: + raise ValueError( + f"The keys under the field `partial_data_links` need to match with the field names in attributes. The field {subfield} is however not in attributes." + ) + # At this point I am getting ahead of the specification. There is the intention to allow database specific fields(with the database specific prefixes) here in line with the JSON API specification, but it has not been decided yet how this case should be handled in the property definitions. for field in meta: BaseResourceMapper.check_starts_with_supported_prefix( @@ -216,6 +252,7 @@ def check_meta(cls, values): ) values["meta"]["property_metadata"] = property_metadata + values["meta"]["partial_data_links"] = partial_data_links return values diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index c189ad981..d9710600f 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -2125,378 +2125,17 @@ }, "assemblies": null, "chemsys": "Ag-B-C-Cl-H-N-O-P", - "cartesian_site_positions": [ - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ] - ], + "cartesian_site_positions": null, + "meta": { + "partial_data_links": { + "cartesian_site_positions": [ + { + "format": "jsonlines", + "link": "https://example.org/optimade/v1.2/extensions/partial_data/structures/mpf_551/a/default_format" + } + ] + } + }, "dimension_types": [ 1, 1, diff --git a/tests/adapters/test_jsonl.py b/tests/adapters/test_jsonl.py index 2bda96c2c..d5843fcc3 100644 --- a/tests/adapters/test_jsonl.py +++ b/tests/adapters/test_jsonl.py @@ -1,19 +1,11 @@ +from pathlib import Path + from optimade.adapters.jsonl import from_jsonl, to_jsonl +test_object = from_jsonl(Path(__file__).parent.resolve() / "testdata.jsonl") + -def test_to_jsonl(): - test_object = [ - { - "optimade_partial_data": {"version": "1.2.0"}, - "layout": "dense", - "returned_ranges": [{"start": 10, "stop": 20, "step": 2}], - }, - 1243, - 345, - -12.6, - ["PARTIAL-DATA-NEXT", ["https://example.db.org/value4"]], - ] +def test_to_and_from_jsonl(): file_content = to_jsonl(test_object) reprocessed_file = from_jsonl(file_content) assert test_object == reprocessed_file - pass diff --git a/tests/adapters/testdata.jsonl b/tests/adapters/testdata.jsonl new file mode 100644 index 000000000..47eb9346b --- /dev/null +++ b/tests/adapters/testdata.jsonl @@ -0,0 +1,5 @@ +{"optimade_partial_data": {"version": "1.2.0"}, "layout": "dense", "returned_ranges": [{"start": 10, "stop": 20, "step": 2}]} +1243 +345 +-12.6 +["PARTIAL-DATA-NEXT", ["https://example.db.org/value4"]] From 9657ff3a0a366fa11a5216712d932b71e8ed3774 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Mon, 14 Aug 2023 16:33:49 +0200 Subject: [PATCH 53/95] Added descriptions for fields partial data links. --- openapi/index_openapi.json | 24 ++-- openapi/openapi.json | 272 +++++++++++++++++++------------------ optimade/models/entries.py | 10 +- 3 files changed, 158 insertions(+), 148 deletions(-) diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index fae87ce9b..755227873 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -528,15 +528,15 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "type": { "title": "Type", "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "links": { "title": "Links", @@ -588,16 +588,16 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-queryable": "must", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "must" }, "last_modified": { "title": "Last Modified", "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -1137,8 +1137,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "type": { "title": "Type", @@ -1429,11 +1429,13 @@ "maxLength": 65536, "minLength": 1, "type": "string", + "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", "format": "uri" }, "format": { "title": "Format", - "type": "string" + "type": "string", + "description": "String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value \"jsonlines\", which refers to the format in OPTIMADE JSON lines partial data format." } } }, diff --git a/openapi/openapi.json b/openapi/openapi.json index e2523f4e4..0c7898c45 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1341,8 +1341,8 @@ } }, "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "group_probabilities": { "title": "Group Probabilities", @@ -1351,8 +1351,8 @@ "type": "number" }, "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" } }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." @@ -1778,15 +1778,15 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "type": { "title": "Type", "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "links": { "title": "Links", @@ -1838,16 +1838,16 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-queryable": "must", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "must" }, "last_modified": { "title": "Last Modified", "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -2246,8 +2246,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "type": { "title": "Type", @@ -2538,11 +2538,13 @@ "maxLength": 65536, "minLength": 1, "type": "string", + "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", "format": "uri" }, "format": { "title": "Format", - "type": "string" + "type": "string", + "description": "String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value \"jsonlines\", which refers to the format in OPTIMADE JSON lines partial data format." } } }, @@ -2566,22 +2568,22 @@ "title": "Name", "type": "string", "description": "Full name of the person, REQUIRED.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "firstname": { "title": "Firstname", "type": "string", "description": "First name of the person.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "lastname": { "title": "Lastname", "type": "string", "description": "Last name of the person.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" } }, "description": "A person, i.e., an author, editor or other." @@ -2683,8 +2685,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "type": { "title": "Type", @@ -2692,8 +2694,8 @@ "type": "string", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "links": { "title": "Links", @@ -2739,16 +2741,16 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-queryable": "must", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "must" }, "last_modified": { "title": "Last Modified", "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "authors": { "title": "Authors", @@ -2757,8 +2759,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the authors of the reference.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "editors": { "title": "Editors", @@ -2767,15 +2769,15 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the editors of the reference.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "doi": { "title": "Doi", "type": "string", "description": "The digital object identifier of the reference.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "url": { "title": "Url", @@ -2784,162 +2786,162 @@ "type": "string", "description": "The URL of the reference.", "format": "uri", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "address": { "title": "Address", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "annote": { "title": "Annote", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "booktitle": { "title": "Booktitle", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "chapter": { "title": "Chapter", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "crossref": { "title": "Crossref", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "edition": { "title": "Edition", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "howpublished": { "title": "Howpublished", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "institution": { "title": "Institution", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "journal": { "title": "Journal", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "key": { "title": "Key", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "month": { "title": "Month", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "note": { "title": "Note", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "number": { "title": "Number", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "organization": { "title": "Organization", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "pages": { "title": "Pages", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "publisher": { "title": "Publisher", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "school": { "title": "School", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "series": { "title": "Series", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "title": { "title": "Title", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "bib_type": { "title": "Bib Type", "type": "string", "description": "Type of the reference, corresponding to the **type** property in the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "volume": { "title": "Volume", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "year": { "title": "Year", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" } }, "description": "Model that stores the attributes of a reference.\n\nMany properties match the meaning described in the\n[BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf)." @@ -3361,8 +3363,8 @@ "title": "Name", "type": "string", "description": "Gives the name of the species; the **name** value MUST be unique in the `species` list.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "chemical_symbols": { "title": "Chemical Symbols", @@ -3371,8 +3373,8 @@ "type": "string" }, "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "concentration": { "title": "Concentration", @@ -3381,8 +3383,8 @@ "type": "number" }, "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", - "x-optimade-queryable": "optional", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "optional" }, "mass": { "title": "Mass", @@ -3391,16 +3393,16 @@ "type": "number" }, "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", + "x-optimade-support": "optional", "x-optimade-queryable": "optional", - "x-optimade-unit": "a.m.u.", - "x-optimade-support": "optional" + "x-optimade-unit": "a.m.u." }, "original_name": { "title": "Original Name", "type": "string", "description": "Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\nNote: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "attached": { "title": "Attached", @@ -3409,8 +3411,8 @@ "type": "string" }, "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "nattached": { "title": "Nattached", @@ -3419,8 +3421,8 @@ "type": "integer" }, "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" } }, "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." @@ -3489,8 +3491,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "type": { "title": "Type", @@ -3498,8 +3500,8 @@ "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" }, "links": { "title": "Links", @@ -3559,8 +3561,8 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-queryable": "must", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "must" }, "last_modified": { "title": "Last Modified", @@ -3568,8 +3570,8 @@ "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "elements": { "title": "Elements", @@ -3579,16 +3581,16 @@ }, "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "nelements": { "title": "Nelements", "type": "integer", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "elements_ratios": { "title": "Elements Ratios", @@ -3598,16 +3600,16 @@ }, "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "chemical_formula_descriptive": { "title": "Chemical Formula Descriptive", "type": "string", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "chemical_formula_reduced": { "title": "Chemical Formula Reduced", @@ -3615,16 +3617,16 @@ "type": "string", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "chemical_formula_hill": { "title": "Chemical Formula Hill", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "chemical_formula_anonymous": { "title": "Chemical Formula Anonymous", @@ -3632,8 +3634,8 @@ "type": "string", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "dimension_types": { "title": "Dimension Types", @@ -3645,16 +3647,16 @@ }, "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", "nullable": true, - "x-optimade-queryable": "optional", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "nperiodic_dimensions": { "title": "Nperiodic Dimensions", "type": "integer", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "lattice_vectors": { "title": "Lattice Vectors", @@ -3671,9 +3673,9 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, - "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3688,17 +3690,17 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, - "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "nsites": { "title": "Nsites", "type": "integer", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", "nullable": true, - "x-optimade-queryable": "must", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "must" }, "species": { "title": "Species", @@ -3708,8 +3710,8 @@ }, "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", "nullable": true, - "x-optimade-queryable": "optional", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "species_at_sites": { "title": "Species At Sites", @@ -3719,8 +3721,8 @@ }, "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", "nullable": true, - "x-optimade-queryable": "optional", - "x-optimade-support": "should" + "x-optimade-support": "should", + "x-optimade-queryable": "optional" }, "assemblies": { "title": "Assemblies", @@ -3729,8 +3731,8 @@ "$ref": "#/components/schemas/Assembly" }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", - "x-optimade-queryable": "optional", - "x-optimade-support": "optional" + "x-optimade-support": "optional", + "x-optimade-queryable": "optional" }, "structure_features": { "title": "Structure Features", @@ -3739,8 +3741,8 @@ "$ref": "#/components/schemas/StructureFeatures" }, "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", - "x-optimade-queryable": "must", - "x-optimade-support": "must" + "x-optimade-support": "must", + "x-optimade-queryable": "must" } }, "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 5eca558c5..4b0a8d145 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -101,8 +101,14 @@ def cast_immutable_id_to_str(cls, value): class PartialDataLink(BaseModel): - link: AnyUrl - format: str # todo add check that the value of format is in a list of supported formats. + link: AnyUrl = OptimadeField( + ..., + description="String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", + ) + format: str = OptimadeField( + ..., + description='String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value "jsonlines", which refers to the format in OPTIMADE JSON lines partial data format.', + ) # todo add check that the value of format is in a list of supported formats. class EntryMetadata(Meta): From 281551e357d22a667c9fb9c11c819e0f150bc457 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 22 Aug 2023 12:31:35 +0200 Subject: [PATCH 54/95] Storing intermediate code on the way to implement partial data to get second opinion on behaviour mongomock vs pymogo. --- docs/api_reference/models/partial_data.md | 5 + docs/api_reference/models/partialdata.md | 5 - .../server/mappers/partial_data.md | 3 + .../server/routers/partial_data.md | 3 + openapi/index_openapi.json | 20 +- openapi/openapi.json | 419 ++++++++++++------ optimade/adapters/jsonl.py | 8 +- optimade/models/__init__.py | 2 + .../{partialdata.py => partial_data.py} | 8 +- optimade/models/responses.py | 8 + optimade/server/config.py | 6 +- optimade/server/data/__init__.py | 1 + .../mpf_551_cartesian_site_positions.json | 372 ++++++++++++++++ .../entry_collections/entry_collections.py | 22 +- optimade/server/entry_collections/mongo.py | 36 +- optimade/server/main.py | 28 +- optimade/server/mappers/__init__.py | 2 + optimade/server/mappers/partial_data.py | 9 + optimade/server/query_params.py | 78 +++- optimade/server/routers/partial_data.py | 36 ++ optimade/server/routers/utils.py | 68 ++- tests/models/test_partialdata.py | 4 +- tests/server/routers/test_partial_data.py | 15 + 23 files changed, 988 insertions(+), 170 deletions(-) create mode 100644 docs/api_reference/models/partial_data.md delete mode 100644 docs/api_reference/models/partialdata.md create mode 100644 docs/api_reference/server/mappers/partial_data.md create mode 100644 docs/api_reference/server/routers/partial_data.md rename optimade/models/{partialdata.py => partial_data.py} (97%) create mode 100644 optimade/server/data/mpf_551_cartesian_site_positions.json create mode 100644 optimade/server/mappers/partial_data.py create mode 100644 optimade/server/routers/partial_data.py create mode 100644 tests/server/routers/test_partial_data.py diff --git a/docs/api_reference/models/partial_data.md b/docs/api_reference/models/partial_data.md new file mode 100644 index 000000000..07200e8b8 --- /dev/null +++ b/docs/api_reference/models/partial_data.md @@ -0,0 +1,5 @@ +# partial_data + +::: optimade.models.partial_data + options: + show_if_no_docstring: true diff --git a/docs/api_reference/models/partialdata.md b/docs/api_reference/models/partialdata.md deleted file mode 100644 index 0665311ef..000000000 --- a/docs/api_reference/models/partialdata.md +++ /dev/null @@ -1,5 +0,0 @@ -# partialdata - -::: optimade.models.partialdata - options: - show_if_no_docstring: true diff --git a/docs/api_reference/server/mappers/partial_data.md b/docs/api_reference/server/mappers/partial_data.md new file mode 100644 index 000000000..fee81e882 --- /dev/null +++ b/docs/api_reference/server/mappers/partial_data.md @@ -0,0 +1,3 @@ +# partial_data + +::: optimade.server.mappers.partial_data diff --git a/docs/api_reference/server/routers/partial_data.md b/docs/api_reference/server/routers/partial_data.md new file mode 100644 index 000000000..c9e94cfa4 --- /dev/null +++ b/docs/api_reference/server/routers/partial_data.md @@ -0,0 +1,3 @@ +# partial_data + +::: optimade.server.routers.partial_data diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index 755227873..4ec0acd36 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -528,15 +528,15 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "title": "Type", "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -588,16 +588,16 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, "last_modified": { "title": "Last Modified", "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -1137,8 +1137,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "title": "Type", diff --git a/openapi/openapi.json b/openapi/openapi.json index 0c7898c45..bffdeff8b 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1309,6 +1309,171 @@ } } } + }, + "/partial_data/{entry_id}": { + "get": { + "tags": [ + "partial_data" + ], + "summary": "Get Partial Data", + "operationId": "get_partial_data_partial_data__entry_id__get", + "parameters": [ + { + "required": true, + "schema": { + "title": "Entry Id", + "type": "string" + }, + "name": "entry_id", + "in": "path" + }, + { + "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + "required": false, + "schema": { + "title": "Response Format", + "type": "string", + "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + "default": "json" + }, + "name": "response_format", + "in": "query" + }, + { + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + "required": false, + "schema": { + "title": "Email Address", + "type": "string", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + "format": "email", + "default": "" + }, + "name": "email_address", + "in": "query" + }, + { + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "required": false, + "schema": { + "title": "Api Hint", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "type": "string", + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "default": "" + }, + "name": "api_hint", + "in": "query" + }, + { + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "required": false, + "schema": { + "title": "Response Fields", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "type": "string", + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "default": "" + }, + "name": "response_fields", + "in": "query" + }, + { + "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "required": false, + "schema": { + "title": "Filter", + "type": "string", + "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "default": "" + }, + "name": "filter", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/vnd.api+json": { + "schema": { + "title": "Response Get Partial Data Partial Data Entry Id Get" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "422": { + "description": "Unprocessable Entity", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "501": { + "description": "Not Implemented", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "553": { + "description": "Version Not Supported", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } } }, "components": { @@ -1341,8 +1506,8 @@ } }, "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "group_probabilities": { "title": "Group Probabilities", @@ -1351,8 +1516,8 @@ "type": "number" }, "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" } }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." @@ -1778,15 +1943,15 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "title": "Type", "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -1838,16 +2003,16 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, "last_modified": { "title": "Last Modified", "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "description": "Contains key-value pairs representing the entry's properties." @@ -2246,8 +2411,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "title": "Type", @@ -2568,22 +2733,22 @@ "title": "Name", "type": "string", "description": "Full name of the person, REQUIRED.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "firstname": { "title": "Firstname", "type": "string", "description": "First name of the person.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "lastname": { "title": "Lastname", "type": "string", "description": "Last name of the person.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" } }, "description": "A person, i.e., an author, editor or other." @@ -2685,8 +2850,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "title": "Type", @@ -2694,8 +2859,8 @@ "type": "string", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -2741,16 +2906,16 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, "last_modified": { "title": "Last Modified", "type": "string", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "authors": { "title": "Authors", @@ -2759,8 +2924,8 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the authors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "editors": { "title": "Editors", @@ -2769,15 +2934,15 @@ "$ref": "#/components/schemas/Person" }, "description": "List of person objects containing the editors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "doi": { "title": "Doi", "type": "string", "description": "The digital object identifier of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "url": { "title": "Url", @@ -2793,155 +2958,155 @@ "title": "Address", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "annote": { "title": "Annote", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "booktitle": { "title": "Booktitle", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "chapter": { "title": "Chapter", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "crossref": { "title": "Crossref", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "edition": { "title": "Edition", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "howpublished": { "title": "Howpublished", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "institution": { "title": "Institution", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "journal": { "title": "Journal", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "key": { "title": "Key", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "month": { "title": "Month", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "note": { "title": "Note", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "number": { "title": "Number", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "organization": { "title": "Organization", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "pages": { "title": "Pages", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "publisher": { "title": "Publisher", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "school": { "title": "School", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "series": { "title": "Series", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "title": { "title": "Title", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "bib_type": { "title": "Bib Type", "type": "string", "description": "Type of the reference, corresponding to the **type** property in the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "volume": { "title": "Volume", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "year": { "title": "Year", "type": "string", "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" } }, "description": "Model that stores the attributes of a reference.\n\nMany properties match the meaning described in the\n[BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf)." @@ -3363,8 +3528,8 @@ "title": "Name", "type": "string", "description": "Gives the name of the species; the **name** value MUST be unique in the `species` list.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "chemical_symbols": { "title": "Chemical Symbols", @@ -3373,8 +3538,8 @@ "type": "string" }, "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "concentration": { "title": "Concentration", @@ -3383,8 +3548,8 @@ "type": "number" }, "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, "mass": { "title": "Mass", @@ -3393,16 +3558,16 @@ "type": "number" }, "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", - "x-optimade-support": "optional", "x-optimade-queryable": "optional", + "x-optimade-support": "optional", "x-optimade-unit": "a.m.u." }, "original_name": { "title": "Original Name", "type": "string", "description": "Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\nNote: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "attached": { "title": "Attached", @@ -3411,8 +3576,8 @@ "type": "string" }, "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "nattached": { "title": "Nattached", @@ -3421,8 +3586,8 @@ "type": "integer" }, "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" } }, "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." @@ -3491,8 +3656,8 @@ "title": "Id", "type": "string", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "title": "Type", @@ -3500,8 +3665,8 @@ "type": "string", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "title": "Links", @@ -3561,8 +3726,8 @@ "title": "Immutable Id", "type": "string", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, "last_modified": { "title": "Last Modified", @@ -3570,8 +3735,8 @@ "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "elements": { "title": "Elements", @@ -3581,16 +3746,16 @@ }, "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "nelements": { "title": "Nelements", "type": "integer", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "elements_ratios": { "title": "Elements Ratios", @@ -3600,16 +3765,16 @@ }, "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_descriptive": { "title": "Chemical Formula Descriptive", "type": "string", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_reduced": { "title": "Chemical Formula Reduced", @@ -3617,16 +3782,16 @@ "type": "string", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "chemical_formula_hill": { "title": "Chemical Formula Hill", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "chemical_formula_anonymous": { "title": "Chemical Formula Anonymous", @@ -3634,8 +3799,8 @@ "type": "string", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "dimension_types": { "title": "Dimension Types", @@ -3655,8 +3820,8 @@ "type": "integer", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "lattice_vectors": { "title": "Lattice Vectors", @@ -3673,8 +3838,8 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, - "x-optimade-unit": "\u00c5", "x-optimade-support": "should", + "x-optimade-unit": "\u00c5", "x-optimade-queryable": "optional" }, "cartesian_site_positions": { @@ -3690,8 +3855,8 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, - "x-optimade-unit": "\u00c5", "x-optimade-support": "should", + "x-optimade-unit": "\u00c5", "x-optimade-queryable": "optional" }, "nsites": { @@ -3699,8 +3864,8 @@ "type": "integer", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, "species": { "title": "Species", @@ -3710,8 +3875,8 @@ }, "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "species_at_sites": { "title": "Species At Sites", @@ -3721,8 +3886,8 @@ }, "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "assemblies": { "title": "Assemblies", @@ -3731,8 +3896,8 @@ "$ref": "#/components/schemas/Assembly" }, "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "structure_features": { "title": "Structure Features", @@ -3741,8 +3906,8 @@ "$ref": "#/components/schemas/StructureFeatures" }, "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" } }, "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." diff --git a/optimade/adapters/jsonl.py b/optimade/adapters/jsonl.py index 60979192c..9f7bfac21 100644 --- a/optimade/adapters/jsonl.py +++ b/optimade/adapters/jsonl.py @@ -4,14 +4,14 @@ from jsonlines import Reader, Writer -from optimade.models.partialdata import PartialDataResponse +from optimade.models.partial_data import PartialDataResource -def to_jsonl(input_data: Union[list[dict], PartialDataResponse]) -> bytes: +def to_jsonl(input_data: Union[list[dict], PartialDataResource]) -> bytes: """This function convert a list of dictionaries to the JSONL format which can be sent back in an OPTIMADE partial data response""" temp_file = BytesIO() writer = Writer(temp_file) - if isinstance(input_data, PartialDataResponse): + if isinstance(input_data, PartialDataResource): writer.write(input_data.header) input_data = input_data.data if isinstance(input_data, list): @@ -26,7 +26,7 @@ def to_jsonl(input_data: Union[list[dict], PartialDataResponse]) -> bytes: def from_jsonl( jsonl_input: Union[Path, str, bytes] -) -> Union[list, PartialDataResponse]: +) -> Union[list, PartialDataResource]: if isinstance(jsonl_input, (Path, str)): fp: Union[BytesIO, BufferedReader] = open(jsonl_input, "rb") else: diff --git a/optimade/models/__init__.py b/optimade/models/__init__.py index 018560412..af5814317 100644 --- a/optimade/models/__init__.py +++ b/optimade/models/__init__.py @@ -5,6 +5,7 @@ from .jsonapi import * # noqa: F403 from .links import * # noqa: F403 from .optimade_json import * # noqa: F403 +from .partial_data import * # noqa: F403 from .references import * # noqa: F403 from .responses import * # noqa: F403 from .structures import * # noqa: F403 @@ -18,6 +19,7 @@ + index_metadb.__all__ # type: ignore[name-defined] # noqa: F405 + links.__all__ # type: ignore[name-defined] # noqa: F405 + optimade_json.__all__ # type: ignore[name-defined] # noqa: F405 + + partial_data.__all__ # type: ignore[name-defined] # noqa: F405 + references.__all__ # type: ignore[name-defined] # noqa: F405 + responses.__all__ # type: ignore[name-defined] # noqa: F405 + structures.__all__ # type: ignore[name-defined] # noqa: F405 diff --git a/optimade/models/partialdata.py b/optimade/models/partial_data.py similarity index 97% rename from optimade/models/partialdata.py rename to optimade/models/partial_data.py index 1af84fedd..610640359 100644 --- a/optimade/models/partialdata.py +++ b/optimade/models/partial_data.py @@ -2,8 +2,14 @@ from pydantic import BaseModel +from optimade.models.entries import EntryResource from optimade.models.utils import OptimadeField, SupportLevel +__all__ = ( + "PartialDataHeader", + "PartialDataResource", +) + class PartialDataHeader(BaseModel): optimade_partial_data: dict = OptimadeField( @@ -119,6 +125,6 @@ class PartialDataHeader(BaseModel): ) -class PartialDataResponse(BaseModel): +class PartialDataResource(EntryResource): header: PartialDataHeader data: list diff --git a/optimade/models/responses.py b/optimade/models/responses.py index 01845dc82..abfcdee0d 100644 --- a/optimade/models/responses.py +++ b/optimade/models/responses.py @@ -9,6 +9,7 @@ from optimade.models.jsonapi import Response from optimade.models.links import LinksResource from optimade.models.optimade_json import OptimadeError, ResponseMeta, Success +from optimade.models.partial_data import PartialDataResource from optimade.models.references import ReferenceResource from optimade.models.structures import StructureResource from optimade.models.utils import StrictField @@ -25,6 +26,7 @@ "StructureResponseMany", "ReferenceResponseOne", "ReferenceResponseMany", + "PartialDataResponse", ) @@ -115,3 +117,9 @@ class ReferenceResponseMany(EntryResponseMany): description="List of unique OPTIMADE references entry resource objects.", uniqueItems=True, ) + + +class PartialDataResponse(EntryResponseOne): + data: Union[PartialDataResource, Dict[str, Any], None] = StrictField( + ..., description="(Part of) the data for a single property of an entry." + ) diff --git a/optimade/server/config.py b/optimade/server/config.py index bd090bb95..1346cb3c7 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -14,7 +14,7 @@ from pydantic.env_settings import SettingsSourceCallable from optimade import __api_version__, __version__ -from optimade.models import Implementation, Provider +from optimade.models import Implementation, Provider # type: ignore[attr-defined] DEFAULT_CONFIG_FILE_PATH: str = str(Path.home().joinpath(".optimade.json")) """Default configuration file path. @@ -172,6 +172,10 @@ class ServerConfig(BaseSettings): "structures", description="Mongo collection name for /structures endpoint resources", ) + partial_data_collection: str = Field( + "fs.files", + description="Mongo Grid FS system containing the data that needs to be returned via the partial data mechanism.", + ) page_limit: int = Field(20, description="Default number of resources per page") page_limit_max: int = Field( 500, description="Max allowed number of resources per page" diff --git a/optimade/server/data/__init__.py b/optimade/server/data/__init__.py index 87060d387..4b0c41087 100644 --- a/optimade/server/data/__init__.py +++ b/optimade/server/data/__init__.py @@ -10,6 +10,7 @@ "providers": "providers.json", } +data_files = ["mpf_551_cartesian_site_positions.json"] for var, path in data_paths.items(): try: diff --git a/optimade/server/data/mpf_551_cartesian_site_positions.json b/optimade/server/data/mpf_551_cartesian_site_positions.json new file mode 100644 index 000000000..d41a4b4f8 --- /dev/null +++ b/optimade/server/data/mpf_551_cartesian_site_positions.json @@ -0,0 +1,372 @@ +[ + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ], + [ + 0.449480176317956, + 0.449480176317956, + 0.449480176317956 + ] +] diff --git a/optimade/server/entry_collections/entry_collections.py b/optimade/server/entry_collections/entry_collections.py index 6153216ad..02a8dc02f 100644 --- a/optimade/server/entry_collections/entry_collections.py +++ b/optimade/server/entry_collections/entry_collections.py @@ -10,8 +10,12 @@ from optimade.filterparser import LarkParser from optimade.models.entries import EntryResource from optimade.server.config import CONFIG, SupportedBackend -from optimade.server.mappers import BaseResourceMapper -from optimade.server.query_params import EntryListingQueryParams, SingleEntryQueryParams +from optimade.server.mappers import BaseResourceMapper # type: ignore[attr-defined] +from optimade.server.query_params import ( + EntryListingQueryParams, + PartialDataQueryParams, + SingleEntryQueryParams, +) from optimade.warnings import ( FieldValueNotRecognized, QueryParamNotUsed, @@ -137,7 +141,7 @@ def count(self, **kwargs: Any) -> int: def find( self, params: Union[EntryListingQueryParams, SingleEntryQueryParams] - ) -> Tuple[Union[None, Dict, List[Dict]], int, bool, Set[str], Set[str],]: + ) -> Tuple[Union[None, Dict, List[Dict]], int, bool, Set[str], Set[str]]: """ Fetches results and indicates if more data is available. @@ -158,11 +162,14 @@ def find( """ criteria = self.handle_query_params(params) - single_entry = isinstance(params, SingleEntryQueryParams) + single_entry = isinstance( + params, (SingleEntryQueryParams, PartialDataQueryParams) + ) response_fields = criteria.pop("fields") + partial_data = isinstance(params, PartialDataQueryParams) raw_results, data_returned, more_data_available = self._run_db_query( - criteria, single_entry + criteria, single_entry, partial_data ) exclude_fields = self.all_fields - response_fields @@ -220,7 +227,10 @@ def find( @abstractmethod def _run_db_query( - self, criteria: Dict[str, Any], single_entry: bool = False + self, + criteria: Dict[str, Any], + single_entry: bool = False, + partial_data: bool = False, ) -> Tuple[List[Dict[str, Any]], int, bool]: """Run the query on the backend and collect the results. diff --git a/optimade/server/entry_collections/mongo.py b/optimade/server/entry_collections/mongo.py index 03a63bcce..dd442c6a6 100644 --- a/optimade/server/entry_collections/mongo.py +++ b/optimade/server/entry_collections/mongo.py @@ -1,12 +1,16 @@ from typing import Any, Dict, List, Tuple, Type, Union from optimade.filtertransformers.mongo import MongoTransformer -from optimade.models import EntryResource +from optimade.models import EntryResource # type: ignore[attr-defined] from optimade.server.config import CONFIG, SupportedBackend from optimade.server.entry_collections import EntryCollection from optimade.server.logger import LOGGER -from optimade.server.mappers import BaseResourceMapper -from optimade.server.query_params import EntryListingQueryParams, SingleEntryQueryParams +from optimade.server.mappers import BaseResourceMapper # type: ignore[attr-defined] +from optimade.server.query_params import ( + EntryListingQueryParams, + PartialDataQueryParams, + SingleEntryQueryParams, +) if CONFIG.database_backend.value == "mongodb": from pymongo import MongoClient, version_tuple @@ -20,9 +24,11 @@ LOGGER.info("Using: Real MongoDB (pymongo)") elif CONFIG.database_backend.value == "mongomock": + import mongomock.gridfs from mongomock import MongoClient LOGGER.info("Using: Mock MongoDB (mongomock)") + mongomock.gridfs.enable_gridfs_integration() if CONFIG.database_backend.value in ("mongomock", "mongodb"): CLIENT = MongoClient(CONFIG.mongo_uri) @@ -132,10 +138,19 @@ def handle_query_params( if criteria.get("projection", {}).get("_id"): criteria["projection"]["_id"] = {"$toString": "$_id"} + if isinstance(params, PartialDataQueryParams): + entry_id = params.filter.split("=")[1][1:-1] + criteria["filter"] = { + "filename": {"$eq": f"{entry_id}_{params.response_fields}"} + } # Todo make sure response fields has only one value + return criteria def _run_db_query( - self, criteria: Dict[str, Any], single_entry: bool = False + self, + criteria: Dict[str, Any], + single_entry: bool = False, + partial_data: bool = False, ) -> Tuple[List[Dict[str, Any]], int, bool]: """Run the query on the backend and collect the results. @@ -148,7 +163,18 @@ def _run_db_query( entries matching the query and a boolean for whether or not there is more data available. """ - results = list(self.collection.find(**criteria)) + if partial_data: + import gridfs + + fs = gridfs.GridFS(self.collection.database) + # file = fs.find({"filename": }) + for grid_out in fs.find( + {"filename": "mpf_551_cartesian_site_positions.json"} + ): + grid_out.read() + results = [] + else: + results = list(self.collection.find(**criteria)) if CONFIG.database_backend == SupportedBackend.MONGOMOCK and criteria.get( "projection", {} diff --git a/optimade/server/main.py b/optimade/server/main.py index 4f95dcccb..09c8a936d 100644 --- a/optimade/server/main.py +++ b/optimade/server/main.py @@ -25,6 +25,7 @@ info, landing, links, + partial_data, references, structures, versions, @@ -68,6 +69,29 @@ from optimade.server.routers import ENTRY_COLLECTIONS from optimade.server.routers.utils import get_providers + # Todo Do we need to check a file is not already stored in gridfs? + # Load test data from files into gridfs + if CONFIG.database_backend.value in ("mongomock", "mongodb"): + from pathlib import Path + + if CONFIG.database_backend.value == "mongodb": + from pymongo import MongoClient + elif CONFIG.database_backend.value == "mongomock": + import mongomock.gridfs + from mongomock import MongoClient + + mongomock.gridfs.enable_gridfs_integration() + import gridfs + + db = MongoClient(CONFIG.mongo_uri)[ + CONFIG.mongo_database + ] # Somehow importing the client from optimade.server.entry_collections.mongo gives an error that the type of db is not "Database" eventhough it is. + fs = gridfs.GridFS(db) + for filename in getattr(data, "data_files", []): + with open(Path(__file__).parent / "data" / filename, "rb") as f: + a = fs.put(f, filename=filename) + pass + def load_entries(endpoint_name: str, endpoint_collection: EntryCollection): LOGGER.debug("Loading test %s...", endpoint_name) @@ -103,7 +127,7 @@ def load_entries(endpoint_name: str, endpoint_collection: EntryCollection): app.add_exception_handler(exception, handler) # Add various endpoints to unversioned URL -for endpoint in (info, links, references, structures, landing, versions): +for endpoint in (info, links, references, structures, landing, versions, partial_data): app.include_router(endpoint.router) @@ -121,7 +145,7 @@ def add_optional_versioned_base_urls(app: FastAPI): ``` """ for version in ("minor", "patch"): - for endpoint in (info, links, references, structures, landing): + for endpoint in (info, links, references, structures, landing, partial_data): app.include_router(endpoint.router, prefix=BASE_URL_PREFIXES[version]) diff --git a/optimade/server/mappers/__init__.py b/optimade/server/mappers/__init__.py index c38e6ccd0..882abe95b 100644 --- a/optimade/server/mappers/__init__.py +++ b/optimade/server/mappers/__init__.py @@ -1,12 +1,14 @@ # pylint: disable=undefined-variable from .entries import * # noqa: F403 from .links import * # noqa: F403 +from .partial_data import * # noqa: F403 from .references import * # noqa: F403 from .structures import * # noqa: F403 __all__ = ( entries.__all__ # type: ignore[name-defined] # noqa: F405 + links.__all__ # type: ignore[name-defined] # noqa: F405 + + partial_data.__all__ # type: ignore[name-defined] # noqa: F405 + references.__all__ # type: ignore[name-defined] # noqa: F405 + structures.__all__ # type: ignore[name-defined] # noqa: F405 ) diff --git a/optimade/server/mappers/partial_data.py b/optimade/server/mappers/partial_data.py new file mode 100644 index 000000000..c959c6eae --- /dev/null +++ b/optimade/server/mappers/partial_data.py @@ -0,0 +1,9 @@ +from optimade.models.partial_data import PartialDataResource +from optimade.server.mappers.entries import BaseResourceMapper + +__all__ = ("PartialDataMapper",) + + +class PartialDataMapper(BaseResourceMapper): + LENGTH_ALIASES = () + ENTRY_RESOURCE_CLASS = PartialDataResource diff --git a/optimade/server/query_params.py b/optimade/server/query_params.py index c348bc5f3..d52d640a5 100644 --- a/optimade/server/query_params.py +++ b/optimade/server/query_params.py @@ -7,7 +7,7 @@ from optimade.exceptions import BadRequest from optimade.server.config import CONFIG -from optimade.server.mappers import BaseResourceMapper +from optimade.server.mappers import BaseResourceMapper # type: ignore[attr-defined] from optimade.warnings import QueryParamNotUsed, UnknownProviderQueryParameter @@ -330,3 +330,79 @@ def __init__( self.response_fields = response_fields self.include = include self.api_hint = api_hint + + +class PartialDataQueryParams(BaseQueryParams): + """ + Common query params for single entry endpoints. + + Attributes: + response_format (str): The output format requested (see section Response Format). + Defaults to the format string 'json', which specifies the standard output format described in this specification. + + **Example**: `http://example.com/v1/structures?response_format=xml` + + email_address (EmailStr): An email address of the user making the request. + The email SHOULD be that of a person and not an automatic system. + + **Example**: `http://example.com/v1/structures?email_address=user@example.com` + + response_fields (str): A comma-delimited set of fields to be provided in the output. + If provided, these fields MUST be returned along with the REQUIRED fields. + Other OPTIONAL fields MUST NOT be returned when this parameter is present. + + **Example**: `http://example.com/v1/structures?response_fields=last_modified,nsites` + + include (str): A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) + by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes). + + All related resource objects MUST be returned as part of an array value for the top-level `included` field, + see the section JSON Response Schema: Common Fields. + + The value of `include` MUST be a comma-separated list of "relationship paths", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes). + If relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made. + + The **default value** for `include` is `references`. This means `references` entries MUST always be included under the top-level field + `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`. + Note, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level + field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields. + + **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`. + + api_hint (str): If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, + where MAJOR is a major version and MINOR is a minor version of the API. + For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0. + + """ + + def __init__( + self, + *, + response_format: str = Query( + "json", + description="The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + ), + email_address: EmailStr = Query( + "", + description="An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + ), + api_hint: str = Query( + "", + description="If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + regex=r"(v[0-9]+(\.[0-9]+)?)?", + ), + response_fields: str = Query( + "", + description="A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + regex=r"([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + ), + filter: str = Query( # pylint: disable=redefined-builtin + "", + description="A filter string, in the format described in section API Filtering Format Specification of the specification.", + ), + ): + self.filter = filter + self.response_format = response_format + self.email_address = email_address + self.response_fields = response_fields + self.api_hint = api_hint diff --git a/optimade/server/routers/partial_data.py b/optimade/server/routers/partial_data.py new file mode 100644 index 000000000..5a9a59436 --- /dev/null +++ b/optimade/server/routers/partial_data.py @@ -0,0 +1,36 @@ +from typing import Any + +from fastapi import APIRouter, Depends, Request + +from optimade.models import PartialDataResource # type: ignore[attr-defined] +from optimade.server.config import CONFIG +from optimade.server.entry_collections import create_collection +from optimade.server.mappers import PartialDataMapper +from optimade.server.query_params import PartialDataQueryParams +from optimade.server.routers.utils import get_partial_entry +from optimade.server.schemas import ERROR_RESPONSES + +router = APIRouter(redirect_slashes=True) + +partial_data_coll = create_collection( + name=CONFIG.partial_data_collection, + resource_cls=PartialDataResource, + resource_mapper=PartialDataMapper, +) + + +@router.get( + "/partial_data/{entry_id:path}", + response_model_exclude_unset=True, + tags=["partial_data"], + responses=ERROR_RESPONSES, +) +def get_partial_data( + request: Request, entry_id: str, params: PartialDataQueryParams = Depends() +) -> Any: + return get_partial_entry( + collection=partial_data_coll, + entry_id=entry_id, + request=request, + params=params, + ) diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index 72e92fcf7..91e556972 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -10,16 +10,20 @@ from optimade import __api_version__ from optimade.exceptions import BadRequest, InternalServerError -from optimade.models import ( - EntryResource, +from optimade.models import ( # type: ignore[attr-defined] + EntryResource, # type: ignore[attr-defined] EntryResponseMany, EntryResponseOne, - ResponseMeta, - ToplevelLinks, + ResponseMeta, # type: ignore[attr-defined] + ToplevelLinks, # type: ignore[attr-defined] ) from optimade.server.config import CONFIG from optimade.server.entry_collections import EntryCollection -from optimade.server.query_params import EntryListingQueryParams, SingleEntryQueryParams +from optimade.server.query_params import ( + EntryListingQueryParams, + PartialDataQueryParams, + SingleEntryQueryParams, +) from optimade.utils import PROVIDER_LIST_URLS, get_providers, mongo_id_for_database __all__ = ( @@ -62,7 +66,7 @@ def meta_values( **kwargs, ) -> ResponseMeta: """Helper to initialize the meta values""" - from optimade.models import ResponseMetaQuery + from optimade.models import ResponseMetaQuery # type: ignore[attr-defined] if isinstance(url, str): url = urllib.parse.urlparse(url) @@ -359,3 +363,55 @@ def get_single_entry( ), included=included, ) + + +def get_partial_entry( + collection: EntryCollection, + entry_id: str, + request: Request, + params: PartialDataQueryParams, +) -> Dict: + # from optimade.server.routers import ENTRY_COLLECTIONS + + params.check_params(request.query_params) + params.filter = f'id="{entry_id}"' # type: ignore[attr-defined] + ( + results, + data_returned, + more_data_available, + fields, + include_fields, + ) = collection.find(params) + + if more_data_available: + raise InternalServerError( + detail=f"more_data_available MUST be False for single entry response, however it is {more_data_available}", + ) + + # include = [] + # if getattr(params, "include", False): + # include.extend(params.include.split(",")) + # + # included = [] + # if results is not None: + # included = get_included_relationships(results, ENTRY_COLLECTIONS, include) + + links = ToplevelLinks(next=None) + + if results is not None and (fields or include_fields): + results = handle_response_fields(results, fields, include_fields)[0] # type: ignore[assignment] + + return dict( + links=links, + data=results if results else None, + meta=meta_values( + url=request.url, + data_returned=data_returned, + data_available=len(collection), + more_data_available=more_data_available, + schema=CONFIG.schema_url + if not CONFIG.is_index + else CONFIG.index_schema_url, + ), + # included=included, + ) diff --git a/tests/models/test_partialdata.py b/tests/models/test_partialdata.py index 3fcf4b194..fba0d4b87 100644 --- a/tests/models/test_partialdata.py +++ b/tests/models/test_partialdata.py @@ -1,4 +1,4 @@ -from optimade.models.partialdata import PartialDataResponse +from optimade.models.partial_data import PartialDataResource def test_object_generation(): @@ -16,6 +16,6 @@ def test_object_generation(): ], } - PartialDataResponse(**test_object) + PartialDataResource(**test_object) pass diff --git a/tests/server/routers/test_partial_data.py b/tests/server/routers/test_partial_data.py new file mode 100644 index 000000000..93a01f66e --- /dev/null +++ b/tests/server/routers/test_partial_data.py @@ -0,0 +1,15 @@ +from optimade.models import PartialDataResponse + +from ..utils import RegularEndpointTests + + +class TestPartialDataEndpoint(RegularEndpointTests): + """Tests for /partial_data/""" + + test_id = "mpf_551" + params = "response_fields=cartesian_site_positions" + request_str = f"/partial_data/{test_id}?{params}" + response_cls = PartialDataResponse + + def test_structures_endpoint_data(self): + pass From e8bbfe10863dbf0de05f550179d902ee5e5c530e Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:04:57 +0200 Subject: [PATCH 55/95] First somewhat working version of partial_data endpoint. --- openapi/openapi.json | 23 +- optimade/models/partial_data.py | 35 ++- optimade/server/config.py | 24 ++- optimade/server/data/__init__.py | 2 +- optimade/server/data/test_structures.json | 2 +- .../entry_collections/entry_collections.py | 102 ++++++--- optimade/server/entry_collections/mongo.py | 200 ++++++++++++++++-- optimade/server/main.py | 18 +- optimade/server/query_params.py | 23 +- optimade/server/routers/structures.py | 25 ++- optimade/server/routers/utils.py | 87 +++++--- tests/models/test_partialdata.py | 25 ++- tests/server/routers/test_partial_data.py | 22 +- tests/server/utils.py | 4 +- 14 files changed, 456 insertions(+), 136 deletions(-) diff --git a/openapi/openapi.json b/openapi/openapi.json index 37974d556..e4abb6de1 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1334,7 +1334,7 @@ "title": "Response Format", "type": "string", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", - "default": "json" + "default": "jsonlines" }, "name": "response_format", "in": "query" @@ -1389,6 +1389,19 @@ }, "name": "filter", "in": "query" + }, + { + "description": "A list of lists which contains a range for each dimension of the property.", + "required": false, + "schema": { + "title": "Property Ranges", + "type": "array", + "items": {}, + "description": "A list of lists which contains a range for each dimension of the property.", + "default": [] + }, + "name": "property_ranges", + "in": "query" } ], "responses": { @@ -3839,8 +3852,8 @@ "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, "x-optimade-support": "should", - "x-optimade-queryable": "optional", - "x-optimade-unit": "\u00c5" + "x-optimade-unit": "\u00c5", + "x-optimade-queryable": "optional" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3856,8 +3869,8 @@ "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, "x-optimade-support": "should", - "x-optimade-queryable": "optional", - "x-optimade-unit": "\u00c5" + "x-optimade-unit": "\u00c5", + "x-optimade-queryable": "optional" }, "nsites": { "title": "Nsites", diff --git a/optimade/models/partial_data.py b/optimade/models/partial_data.py index 610640359..d5d717c54 100644 --- a/optimade/models/partial_data.py +++ b/optimade/models/partial_data.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from optimade.models.entries import EntryResource -from optimade.models.utils import OptimadeField, SupportLevel +from optimade.models.utils import OptimadeField, StrictField, SupportLevel __all__ = ( "PartialDataHeader", @@ -26,7 +26,7 @@ class PartialDataHeader(BaseModel): - **Examples**: - `""optimade-partial-data": {"version": "1.2.0"}"`""", support=SupportLevel.MUST, - ) + ) # Todo add format and link fields layout: Literal["dense", "sparse"] = OptimadeField( ..., description="""A string either equal to "dense" or "sparse" to indicate whether the returned format uses a dense or sparse layout. @@ -123,8 +123,37 @@ class PartialDataHeader(BaseModel): """, support=SupportLevel.OPTIONAL, ) + parent_id: Optional[dict] = OptimadeField( + None, + description="""The id of the entry to which this partial data belongs. +""", + support=SupportLevel.OPTIONAL, + ) -class PartialDataResource(EntryResource): +class PartialDataFormat(BaseModel): header: PartialDataHeader data: list + + +class PartialDataResource(EntryResource): + type: str = StrictField( + "partial_data", + description="""The name of the type of an entry. + - **Type**: string. + + - **Requirements/Conventions**: + - **Support**: MUST be supported by all implementations, MUST NOT be `null`. + - **Query**: MUST be a queryable property with support for all mandatory filter features. + - **Response**: REQUIRED in the response. + - MUST be an existing entry type. + - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL. + + - **Examples**: + - `"structures"`""", + regex="^structures$", + support=SupportLevel.MUST, + queryable=SupportLevel.MUST, + ) + + attributes: PartialDataHeader # Todo make a better model for json response diff --git a/optimade/server/config.py b/optimade/server/config.py index 1346cb3c7..a9f0ae778 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -67,6 +67,20 @@ class SupportedBackend(Enum): MONGOMOCK = "mongomock" +class SupportedResponseFormats(Enum): + """Enumeration of supported response formats. + + - 'JSON': [JSON](https://www.json.org/json-en.html) + - 'HDF5': [HDF5](https://portal.hdfgroup.org/display/HDF5/HDF5) + - `JSONL`: [JSONL](https://jsonlines.org/) + + """ + + HDF5 = "hdf5" + JSON = "json" + JSONL = "jsonlines" + + def config_file_settings(settings: BaseSettings) -> Dict[str, Any]: """Configuration file settings source. @@ -173,7 +187,7 @@ class ServerConfig(BaseSettings): description="Mongo collection name for /structures endpoint resources", ) partial_data_collection: str = Field( - "fs.files", + "fs", description="Mongo Grid FS system containing the data that needs to be returned via the partial data mechanism.", ) page_limit: int = Field(20, description="Default number of resources per page") @@ -301,6 +315,14 @@ class ServerConfig(BaseSettings): description="""If False, data from the database will not undergo validation before being emitted by the API, and only the mapping of aliases will occur.""", ) + enabled_response_formats: List[SupportedResponseFormats] = Field( + ["json", "jsonlines"], + description="""A list of the response formats that are supported by this server. Must include the "json" format.""", + ) + max_response_size: Optional[Dict[SupportedResponseFormats, int]] = Field( + {"json": 10, "jsonlines": 40}, + description="""This dictionary contains the approximate maximum size for a trajectory response in megabytes for the different response_formats. The keys indicate the response_format and the values the maximum size.""", + ) @validator("implementation", pre=True) def set_implementation_version(cls, v): diff --git a/optimade/server/data/__init__.py b/optimade/server/data/__init__.py index 4b0c41087..dd9c628bb 100644 --- a/optimade/server/data/__init__.py +++ b/optimade/server/data/__init__.py @@ -10,7 +10,7 @@ "providers": "providers.json", } -data_files = ["mpf_551_cartesian_site_positions.json"] +data_files = ["mpf_551:cartesian_site_positions"] for var, path in data_paths.items(): try: diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index d9710600f..fe9d22879 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -2131,7 +2131,7 @@ "cartesian_site_positions": [ { "format": "jsonlines", - "link": "https://example.org/optimade/v1.2/extensions/partial_data/structures/mpf_551/a/default_format" + "link": "http://localhost:5000/partial_data/mpf_551?response_fields=cartesian_sitePositions" } ] } diff --git a/optimade/server/entry_collections/entry_collections.py b/optimade/server/entry_collections/entry_collections.py index 02a8dc02f..a5aa8756c 100644 --- a/optimade/server/entry_collections/entry_collections.py +++ b/optimade/server/entry_collections/entry_collections.py @@ -44,6 +44,17 @@ def create_collection( SupportedBackend.MONGODB, SupportedBackend.MONGOMOCK, ): + from optimade.models import PartialDataResource + + if resource_cls is PartialDataResource: + from optimade.server.entry_collections.mongo import GridFSCollection + + return GridFSCollection( + name=name, + resource_cls=resource_cls, + resource_mapper=resource_mapper, + ) + from optimade.server.entry_collections.mongo import MongoCollection return MongoCollection( @@ -140,7 +151,10 @@ def count(self, **kwargs: Any) -> int: """ def find( - self, params: Union[EntryListingQueryParams, SingleEntryQueryParams] + self, + params: Union[ + EntryListingQueryParams, SingleEntryQueryParams, PartialDataQueryParams + ], ) -> Tuple[Union[None, Dict, List[Dict]], int, bool, Set[str], Set[str]]: """ Fetches results and indicates if more data is available. @@ -166,47 +180,52 @@ def find( params, (SingleEntryQueryParams, PartialDataQueryParams) ) response_fields = criteria.pop("fields") - partial_data = isinstance(params, PartialDataQueryParams) raw_results, data_returned, more_data_available = self._run_db_query( - criteria, single_entry, partial_data + criteria, single_entry ) exclude_fields = self.all_fields - response_fields - include_fields = ( - response_fields - self.resource_mapper.TOP_LEVEL_NON_ATTRIBUTES_FIELDS - ) - bad_optimade_fields = set() - bad_provider_fields = set() supported_prefixes = self.resource_mapper.SUPPORTED_PREFIXES all_attributes = self.resource_mapper.ALL_ATTRIBUTES - for field in include_fields: - if field not in all_attributes: - if field.startswith("_"): - if any( - field.startswith(f"_{prefix}_") for prefix in supported_prefixes - ): - bad_provider_fields.add(field) - else: - bad_optimade_fields.add(field) - if bad_provider_fields: - warnings.warn( - message=f"Unrecognised field(s) for this provider requested in `response_fields`: {bad_provider_fields}.", - category=UnknownProviderProperty, + if not isinstance(params, PartialDataQueryParams): + include_fields = ( + response_fields - self.resource_mapper.TOP_LEVEL_NON_ATTRIBUTES_FIELDS ) + bad_optimade_fields = set() + bad_provider_fields = set() + + for field in include_fields: + if field not in all_attributes: + if field.startswith("_"): + if any( + field.startswith(f"_{prefix}_") + for prefix in supported_prefixes + ): + bad_provider_fields.add(field) + else: + bad_optimade_fields.add(field) + + if bad_provider_fields: + warnings.warn( + message=f"Unrecognised field(s) for this provider requested in `response_fields`: {bad_provider_fields}.", + category=UnknownProviderProperty, + ) - if bad_optimade_fields: - raise BadRequest( - detail=f"Unrecognised OPTIMADE field(s) in requested `response_fields`: {bad_optimade_fields}." - ) + if bad_optimade_fields: + raise BadRequest( + detail=f"Unrecognised OPTIMADE field(s) in requested `response_fields`: {bad_optimade_fields}." + ) + else: + include_fields = set() results: Union[None, List[Dict], Dict] = None if raw_results: results = [self.resource_mapper.map_back(doc) for doc in raw_results] - + self.generate_links_partial_data(results) if single_entry: results = results[0] # type: ignore[assignment] @@ -225,12 +244,29 @@ def find( include_fields, ) + def generate_links_partial_data(self, results): + for entry in results: + if entry.get("meta", {}) and entry["meta"].get("partial_data_links", {}): + for property in entry["meta"]["partial_data_links"]: + for response_format in CONFIG.enabled_response_formats: + entry["meta"]["partial_data_links"][property].append( + { + "format": str(response_format.value), + "link": CONFIG.base_url + + "/partial_data/" + + entry["id"] + + "?response_fields=" + + property + + "&response_format=" + + str(response_format.value), + } + ) + @abstractmethod def _run_db_query( self, criteria: Dict[str, Any], single_entry: bool = False, - partial_data: bool = False, ) -> Tuple[List[Dict[str, Any]], int, bool]: """Run the query on the backend and collect the results. @@ -303,7 +339,10 @@ def get_attribute_fields(self) -> Set[str]: return set(attributes["properties"].keys()) def handle_query_params( - self, params: Union[EntryListingQueryParams, SingleEntryQueryParams] + self, + params: Union[ + EntryListingQueryParams, SingleEntryQueryParams, PartialDataQueryParams + ], ) -> Dict[str, Any]: """Parse and interpret the backend-agnostic query parameter models into a dictionary that can be used by the specific backend. @@ -335,12 +374,11 @@ def handle_query_params( cursor_kwargs["filter"] = {} # response_format - if ( - getattr(params, "response_format", False) - and params.response_format != "json" + if getattr(params, "response_format", False) and params.response_format not in ( + x.value for x in CONFIG.enabled_response_formats ): raise BadRequest( - detail=f"Response format {params.response_format} is not supported, please use response_format='json'" + detail=f"Response format {params.response_format} is not supported, please use one of the supported response formats: {', '.join((x.value for x in CONFIG.enabled_response_formats))}" ) # page_limit diff --git a/optimade/server/entry_collections/mongo.py b/optimade/server/entry_collections/mongo.py index dd442c6a6..7c68589c3 100644 --- a/optimade/server/entry_collections/mongo.py +++ b/optimade/server/entry_collections/mongo.py @@ -32,6 +32,186 @@ if CONFIG.database_backend.value in ("mongomock", "mongodb"): CLIENT = MongoClient(CONFIG.mongo_uri) + import gridfs + + +# todo make general mongo class for both mongo and gridfs and move _check_aliases there. +class GridFSCollection(EntryCollection): + """Class for querying gridfs collections (implemented by either pymongo or mongomock).""" + + def __init__( + self, + name: str, + resource_cls: Type[EntryResource], + resource_mapper: Type[BaseResourceMapper], + database: str = CONFIG.mongo_database, + ): + """Initialize the GridFSCollection for the given parameters. + + Parameters: + name: The name of the collection. + resource_cls: The type of entry resource that is stored by the collection. + resource_mapper: A resource mapper object that handles aliases and + format changes between deserialization and response. + database: The name of the underlying MongoDB database to connect to. + + """ + super().__init__( + resource_cls, + resource_mapper, + MongoTransformer(mapper=resource_mapper), + ) + db = MongoClient(CONFIG.mongo_uri)[ + database + ] # Somehow importing the client from optimade.server.entry_collections.mongo gives an error that the type of db is not "Database" even though it is. + + self.collection = gridfs.GridFS(db, name) + + # check aliases do not clash with mongo operators + self._check_aliases(self.resource_mapper.all_aliases()) + self._check_aliases(self.resource_mapper.all_length_aliases()) + + def __len__(self) -> int: + """Returns the total number of entries in the collection.""" + return len(self.collection.list()) + + def count(self, **kwargs: Any) -> int: + """Returns the number of entries matching the query specified + by the keyword arguments. + + Parameters: + **kwargs: Query parameters as keyword arguments. The keys + 'filter', 'skip', 'limit', 'hint' and 'maxTimeMS' will be passed + to the `pymongo.collection.Collection.count_documents` method. + + """ + for k in list(kwargs.keys()): + if k not in ("filter", "skip", "limit", "hint", "maxTimeMS"): + del kwargs[k] + if "filter" not in kwargs: # "filter" is needed for count_documents() + kwargs["filter"] = {} + return len(self.collection.find(**kwargs)) + + def insert(self, content: bytes, filename: str) -> None: + """Add the given entries to the underlying database. + + Warning: + No validation is performed on the incoming data. + + Arguments: + data: The entry resource objects to add to the database. + + """ + self.collection.put(content, filename=filename) + + def handle_query_params( + self, + params: Union[ + EntryListingQueryParams, SingleEntryQueryParams, PartialDataQueryParams + ], + ) -> Dict[str, Any]: + """Parse and interpret the backend-agnostic query parameter models into a dictionary + that can be used by MongoDB. + + This Mongo-specific method calls the base `EntryCollection.handle_query_params` method + and adds additional handling of the MongoDB ObjectID type. + + Parameters: + params: The initialized query parameter model from the server. + + Raises: + Forbidden: If too large of a page limit is provided. + BadRequest: If an invalid request is made, e.g., with incorrect fields + or response format. + + Returns: + A dictionary representation of the query parameters. + + """ + + criteria = super().handle_query_params(params) + # Handle MongoDB ObjectIDs: + # - If they were not requested, then explicitly remove them + # - If they were requested, then cast them to strings in the response + if "_id" not in criteria.get("projection", {}): + criteria["projection"]["_id"] = False + + if "page_above" in criteria: + raise NotImplementedError( + "`page_above` is not implemented for this backend." + ) + + if criteria.get("projection", {}).get("_id"): + criteria["projection"]["_id"] = {"$toString": "$_id"} + + if isinstance(params, PartialDataQueryParams): + entry_id = params.filter.split("=")[1][1:-1] + criteria["filter"] = { + "filename": {"$eq": f"{entry_id}:{params.response_fields}"} + } # Todo make sure response fields has only one value + + return criteria + + # todo test if it is more efficient to use the get method of gridfs + def _run_db_query( + self, + criteria: Dict[str, Any], + single_entry: bool = False, + ) -> Tuple[List[Dict[str, Any]], int, bool]: + """Run the query on the backend and collect the results. + + Arguments: + criteria: A dictionary representation of the query parameters. + single_entry: Whether or not the caller is expecting a single entry response. + + Returns: + The list of entries from the database (without any re-mapping), the total number of + entries matching the query and a boolean for whether or not there is more data available. + + """ + + # TODO handle case where the type does not have a fixed width. For example strings or dictionaries. + + max_return_size = 10000000 + property_dimensions: list[int] = [] # todo read this data from metadata + results = [] + filterdict = criteria.pop("filter", {}) + criteria.pop("requested_range", property_dimensions) + gridcursor = self.collection.find( + filterdict + ) # I have tried to use just **criteria as is mentioned in the documentation but this does not seem to work. + more_data_available = False + nresults = 0 + for file_obj in gridcursor: + nresults = +1 + property_name = file_obj.filename.split(":")[1] + # results.append(grid_out.read()) + if file_obj.length > max_return_size: + header = file_obj.readline() + values = header + file_obj.read() + # TODo handle splitting up file + more_data_available = True + else: # case whole file can be returned. + values = file_obj.read() + + results = [ + { + "type": "partial_data", + "id": str(file_obj._id), + "property_name": property_name, + "data": values, + } + ] + break + + return results, nresults, more_data_available + + def _check_aliases(self, aliases): + """Check that aliases do not clash with mongo keywords.""" + if any( + alias[0].startswith("$") or alias[1].startswith("$") for alias in aliases + ): + raise RuntimeError(f"Cannot define an alias starting with a '$': {aliases}") class MongoCollection(EntryCollection): @@ -138,19 +318,12 @@ def handle_query_params( if criteria.get("projection", {}).get("_id"): criteria["projection"]["_id"] = {"$toString": "$_id"} - if isinstance(params, PartialDataQueryParams): - entry_id = params.filter.split("=")[1][1:-1] - criteria["filter"] = { - "filename": {"$eq": f"{entry_id}_{params.response_fields}"} - } # Todo make sure response fields has only one value - return criteria def _run_db_query( self, criteria: Dict[str, Any], single_entry: bool = False, - partial_data: bool = False, ) -> Tuple[List[Dict[str, Any]], int, bool]: """Run the query on the backend and collect the results. @@ -163,18 +336,7 @@ def _run_db_query( entries matching the query and a boolean for whether or not there is more data available. """ - if partial_data: - import gridfs - - fs = gridfs.GridFS(self.collection.database) - # file = fs.find({"filename": }) - for grid_out in fs.find( - {"filename": "mpf_551_cartesian_site_positions.json"} - ): - grid_out.read() - results = [] - else: - results = list(self.collection.find(**criteria)) + results = list(self.collection.find(**criteria)) if CONFIG.database_backend == SupportedBackend.MONGOMOCK and criteria.get( "projection", {} diff --git a/optimade/server/main.py b/optimade/server/main.py index 09c8a936d..0fe687be1 100644 --- a/optimade/server/main.py +++ b/optimade/server/main.py @@ -71,25 +71,15 @@ # Todo Do we need to check a file is not already stored in gridfs? # Load test data from files into gridfs + if CONFIG.database_backend.value in ("mongomock", "mongodb"): from pathlib import Path - if CONFIG.database_backend.value == "mongodb": - from pymongo import MongoClient - elif CONFIG.database_backend.value == "mongomock": - import mongomock.gridfs - from mongomock import MongoClient - - mongomock.gridfs.enable_gridfs_integration() - import gridfs + from optimade.server.routers.partial_data import partial_data_coll - db = MongoClient(CONFIG.mongo_uri)[ - CONFIG.mongo_database - ] # Somehow importing the client from optimade.server.entry_collections.mongo gives an error that the type of db is not "Database" eventhough it is. - fs = gridfs.GridFS(db) for filename in getattr(data, "data_files", []): with open(Path(__file__).parent / "data" / filename, "rb") as f: - a = fs.put(f, filename=filename) + a = partial_data_coll.insert(f, filename=filename) pass def load_entries(endpoint_name: str, endpoint_collection: EntryCollection): @@ -133,7 +123,7 @@ def load_entries(endpoint_name: str, endpoint_collection: EntryCollection): def add_major_version_base_url(app: FastAPI): """Add mandatory vMajor endpoints, i.e. all except versions.""" - for endpoint in (info, links, references, structures, landing): + for endpoint in (info, links, references, structures, landing, partial_data): app.include_router(endpoint.router, prefix=BASE_URL_PREFIXES["major"]) diff --git a/optimade/server/query_params.py b/optimade/server/query_params.py index d52d640a5..50686321b 100644 --- a/optimade/server/query_params.py +++ b/optimade/server/query_params.py @@ -353,22 +353,6 @@ class PartialDataQueryParams(BaseQueryParams): **Example**: `http://example.com/v1/structures?response_fields=last_modified,nsites` - include (str): A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) - by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes). - - All related resource objects MUST be returned as part of an array value for the top-level `included` field, - see the section JSON Response Schema: Common Fields. - - The value of `include` MUST be a comma-separated list of "relationship paths", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes). - If relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made. - - The **default value** for `include` is `references`. This means `references` entries MUST always be included under the top-level field - `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`. - Note, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level - field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields. - - **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`. - api_hint (str): If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0. @@ -379,7 +363,7 @@ def __init__( self, *, response_format: str = Query( - "json", + "jsonlines", description="The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", ), email_address: EmailStr = Query( @@ -400,9 +384,14 @@ def __init__( "", description="A filter string, in the format described in section API Filtering Format Specification of the specification.", ), + property_ranges: list = Query( + [], + description="A list of lists which contains a range for each dimension of the property.", + ), ): self.filter = filter self.response_format = response_format self.email_address = email_address self.response_fields = response_fields self.api_hint = api_hint + self.property_ranges = property_ranges diff --git a/optimade/server/routers/structures.py b/optimade/server/routers/structures.py index 00980b246..f9881b121 100644 --- a/optimade/server/routers/structures.py +++ b/optimade/server/routers/structures.py @@ -10,8 +10,15 @@ from optimade.server.config import CONFIG from optimade.server.entry_collections import create_collection from optimade.server.mappers import StructureMapper -from optimade.server.query_params import EntryListingQueryParams, SingleEntryQueryParams -from optimade.server.routers.utils import get_entries, get_single_entry +from optimade.server.query_params import ( + EntryListingQueryParams, + SingleEntryQueryParams, +) +from optimade.server.routers.utils import ( + get_entries, + get_partial_entry, + get_single_entry, +) from optimade.server.schemas import ERROR_RESPONSES router = APIRouter(redirect_slashes=True) @@ -49,8 +56,20 @@ def get_structures( responses=ERROR_RESPONSES, ) def get_single_structure( - request: Request, entry_id: str, params: SingleEntryQueryParams = Depends() + request: Request, + entry_id: str, + params: SingleEntryQueryParams = Depends(), ) -> Any: + if "property_ranges" in request.query_params: + from optimade.server.routers.partial_data import partial_data_coll + + return get_partial_entry( + collection=partial_data_coll, + entry_id=entry_id, + request=request, + params=params, # type: ignore[arg-type] + ) + return get_single_entry( collection=structures_coll, entry_id=entry_id, diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index 91e556972..7fa31267f 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -1,15 +1,18 @@ # pylint: disable=import-outside-toplevel,too-many-locals +import io import re import urllib.parse from datetime import datetime from typing import Any, Dict, List, Optional, Set, Type, Union -from fastapi import Request +import numpy as np +from fastapi import Request, Response from fastapi.responses import JSONResponse from starlette.datastructures import URL as StarletteURL from optimade import __api_version__ -from optimade.exceptions import BadRequest, InternalServerError +from optimade.adapters.jsonl import to_jsonl +from optimade.exceptions import BadRequest, InternalServerError, NotFound from optimade.models import ( # type: ignore[attr-defined] EntryResource, # type: ignore[attr-defined] EntryResponseMany, @@ -369,12 +372,12 @@ def get_partial_entry( collection: EntryCollection, entry_id: str, request: Request, - params: PartialDataQueryParams, + params: Union[PartialDataQueryParams], ) -> Dict: # from optimade.server.routers import ENTRY_COLLECTIONS params.check_params(request.query_params) - params.filter = f'id="{entry_id}"' # type: ignore[attr-defined] + params.filter = f'parent_id="{entry_id}"' ( results, data_returned, @@ -383,35 +386,59 @@ def get_partial_entry( include_fields, ) = collection.find(params) - if more_data_available: - raise InternalServerError( - detail=f"more_data_available MUST be False for single entry response, however it is {more_data_available}", - ) - - # include = [] - # if getattr(params, "include", False): - # include.extend(params.include.split(",")) - # - # included = [] - # if results is not None: - # included = get_included_relationships(results, ENTRY_COLLECTIONS, include) - links = ToplevelLinks(next=None) if results is not None and (fields or include_fields): results = handle_response_fields(results, fields, include_fields)[0] # type: ignore[assignment] + if results is None: + raise NotFound( + detail=f"No data available for the combination of entry {entry_id} and property {params.response_fields}", + ) + # todo make the implementation of these formats more universal. i.e. allow them for other endpoint as well, + + array = np.load(io.BytesIO(results["attributes"]["data"])) + sliceobj = [] + for i in array.shape: + sliceobj.append({"start": 1, "stop": i, "step": 1}) + header = { + "optimade-partial-data": {"format": "1.2.0"}, + "layout": "dense", + "property_name": params.response_fields, + "returned_ranges": sliceobj, + # "entry": {"id": entry_id, "type": None}, #Todo add type information to metadata entry + "has_references": False, + } # Todo: add support for non_dense data + + if params.response_format == "json": + for key in header: + results["attributes"][key] = header[key] + results["attributes"]["data"] = array.tolist() + return dict( + links=links, + data=results if results else None, + meta=meta_values( + url=request.url, + data_returned=data_returned, + data_available=len(collection), + more_data_available=more_data_available, + schema=CONFIG.schema_url + if not CONFIG.is_index + else CONFIG.index_schema_url, + ), + # included=included, + ) - return dict( - links=links, - data=results if results else None, - meta=meta_values( - url=request.url, - data_returned=data_returned, - data_available=len(collection), - more_data_available=more_data_available, - schema=CONFIG.schema_url - if not CONFIG.is_index - else CONFIG.index_schema_url, - ), - # included=included, + return Response( + content=to_jsonl([header, array.tolist()]), + media_type="application/jsonlines", + headers={ + "Content-disposition": f"attachment; filename={entry_id + ':' + params.response_fields}.jsonl" + }, ) + + +def convert_data_to_str(results): + values = results["attributes"]["data"] + if isinstance(values, bytes): + results["attributes"]["data"] = np.array2string(np.load(io.BytesIO(values))) + return results diff --git a/tests/models/test_partialdata.py b/tests/models/test_partialdata.py index fba0d4b87..e6f1b3582 100644 --- a/tests/models/test_partialdata.py +++ b/tests/models/test_partialdata.py @@ -1,7 +1,7 @@ -from optimade.models.partial_data import PartialDataResource +from optimade.models.partial_data import PartialDataFormat -def test_object_generation(): +def test_partial_data_object_generation(): test_object = { "header": { "optimade_partial_data": {"version": "1.2.0"}, @@ -16,6 +16,23 @@ def test_object_generation(): ], } - PartialDataResource(**test_object) + PartialDataFormat(**test_object) - pass + +# todo finish test below +# def test_json_object_generation(): +# test_object = { +# "header": { +# "optimade_partial_data": {"version": "1.2.0"}, +# "layout": "dense", +# "returned_ranges": [{"start": 10, "stop": 20, "step": 2}], +# }, +# "data": [ +# 123, +# 345, +# -12.6, +# ["PARTIAL-DATA-NEXT", ["https://example.db.org/value4"]], +# ], +# } +# +# PartialDataResource(**test_object) diff --git a/tests/server/routers/test_partial_data.py b/tests/server/routers/test_partial_data.py index 93a01f66e..7ac1fda7c 100644 --- a/tests/server/routers/test_partial_data.py +++ b/tests/server/routers/test_partial_data.py @@ -1,9 +1,9 @@ from optimade.models import PartialDataResponse -from ..utils import RegularEndpointTests +from ..utils import NoJsonEndpointTests -class TestPartialDataEndpoint(RegularEndpointTests): +class TestPartialDataEndpoint(NoJsonEndpointTests): """Tests for /partial_data/""" test_id = "mpf_551" @@ -11,5 +11,19 @@ class TestPartialDataEndpoint(RegularEndpointTests): request_str = f"/partial_data/{test_id}?{params}" response_cls = PartialDataResponse - def test_structures_endpoint_data(self): - pass + +def test_wrong_id_partial_data(check_error_response, client): + """If a non-supported versioned base URL is passed, `553 Version Not Supported` should be returned + + A specific JSON response should also occur. + """ + test_id = "mpf_486" + params = "response_fields=cartesian_site_positions" + request = f"/partial_data/{test_id}?{params}" + check_error_response( + request, + expected_status=404, + expected_title="Not Found", + expected_detail="No data available for the combination of entry mpf_486 and property cartesian_site_positions", + server=client, + ) diff --git a/tests/server/utils.py b/tests/server/utils.py index 6a046c36b..2eaa6d633 100644 --- a/tests/server/utils.py +++ b/tests/server/utils.py @@ -228,9 +228,9 @@ class NoJsonEndpointTests: response: Optional[httpx.Response] = None @pytest.fixture(autouse=True) - def get_response(self, both_clients): + def get_response(self, client): """Get response from client""" - self.response = both_clients.get(self.request_str) + self.response = client.get(self.request_str) yield self.response = None From f67555ea5874cb6a95fea2c39d901724f55cf807 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 5 Sep 2023 11:53:37 +0200 Subject: [PATCH 56/95] Move _check_aliases to it's own subclass so it can be used for both gridfs and MongoDB. --- optimade/server/entry_collections/mongo.py | 28 +++++++++------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/optimade/server/entry_collections/mongo.py b/optimade/server/entry_collections/mongo.py index 7c68589c3..f46d30a34 100644 --- a/optimade/server/entry_collections/mongo.py +++ b/optimade/server/entry_collections/mongo.py @@ -35,8 +35,16 @@ import gridfs -# todo make general mongo class for both mongo and gridfs and move _check_aliases there. -class GridFSCollection(EntryCollection): +class MongoBaseCollection(EntryCollection): + def _check_aliases(self, aliases): + """Check that aliases do not clash with mongo keywords.""" + if any( + alias[0].startswith("$") or alias[1].startswith("$") for alias in aliases + ): + raise RuntimeError(f"Cannot define an alias starting with a '$': {aliases}") + + +class GridFSCollection(MongoBaseCollection): """Class for querying gridfs collections (implemented by either pymongo or mongomock).""" def __init__( @@ -206,15 +214,8 @@ def _run_db_query( return results, nresults, more_data_available - def _check_aliases(self, aliases): - """Check that aliases do not clash with mongo keywords.""" - if any( - alias[0].startswith("$") or alias[1].startswith("$") for alias in aliases - ): - raise RuntimeError(f"Cannot define an alias starting with a '$': {aliases}") - -class MongoCollection(EntryCollection): +class MongoCollection(MongoBaseCollection): """Class for querying MongoDB collections (implemented by either pymongo or mongomock) containing serialized [`EntryResource`][optimade.models.entries.EntryResource]s objects. @@ -358,10 +359,3 @@ def _run_db_query( more_data_available = False return results, data_returned, more_data_available - - def _check_aliases(self, aliases): - """Check that aliases do not clash with mongo keywords.""" - if any( - alias[0].startswith("$") or alias[1].startswith("$") for alias in aliases - ): - raise RuntimeError(f"Cannot define an alias starting with a '$': {aliases}") From b7907c9c2d95936dc409f2727b227341e409dfc7 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 5 Sep 2023 16:58:57 +0200 Subject: [PATCH 57/95] Merge branch 'master' into optimade_python_tools_trajectory_0.1 # Conflicts: # README.md # docs/getting_started/client.md # docs/static/default_config.json # openapi/openapi.json # optimade/models/__init__.py # optimade/models/jsonapi.py # optimade/models/structures.py # optimade/server/entry_collections/entry_collections.py # optimade/server/mappers/__init__.py # optimade/server/middleware.py # optimade/server/routers/info.py # optimade/server/routers/utils.py # optimade/server/schemas.py # optimade/server/warnings.py # optimade/validator/config.py # requirements-docs.txt # requirements.txt # setup.py # tests/server/conftest.py # tests/server/test_mappers.py # tests/server/utils.py --- .../mpf_551_cartesian_site_positions.json | 372 ------------------ 1 file changed, 372 deletions(-) delete mode 100644 optimade/server/data/mpf_551_cartesian_site_positions.json diff --git a/optimade/server/data/mpf_551_cartesian_site_positions.json b/optimade/server/data/mpf_551_cartesian_site_positions.json deleted file mode 100644 index d41a4b4f8..000000000 --- a/optimade/server/data/mpf_551_cartesian_site_positions.json +++ /dev/null @@ -1,372 +0,0 @@ -[ - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ], - [ - 0.449480176317956, - 0.449480176317956, - 0.449480176317956 - ] -] From 07defa588a9ddef776c6f5285dc31467f74f5e37 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 5 Sep 2023 16:59:10 +0200 Subject: [PATCH 58/95] Extra todo's and comments after trying to add validator for format field. --- optimade/models/entries.py | 9 ++++++++- .../server/data/mpf_551:cartesian_site_positions | Bin 0 -> 1904 bytes optimade/server/data/test_structures.json | 7 +------ optimade/server/routers/structures.py | 2 +- optimade/validator/utils.py | 2 -- 5 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 optimade/server/data/mpf_551:cartesian_site_positions diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 4b0a8d145..a4f6a8333 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -101,6 +101,7 @@ def cast_immutable_id_to_str(cls, value): class PartialDataLink(BaseModel): + # Todo add validator for link field. link: AnyUrl = OptimadeField( ..., description="String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", @@ -108,7 +109,13 @@ class PartialDataLink(BaseModel): format: str = OptimadeField( ..., description='String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value "jsonlines", which refers to the format in OPTIMADE JSON lines partial data format.', - ) # todo add check that the value of format is in a list of supported formats. + ) # todo add check that the value of format is in a list of supported formats. I have already written the validator below but it causes an error I do not understand + + # @validator("format", always=False, check_fields=False) + # def check_if_format_is_supported(cls, value): + # from optimade.server.config import CONFIG + # if value not in [form.value for form in CONFIG.enabled_response_formats]: + # raise ValueError(f"The format {value} is not one of the enabled_formats{CONFIG.enabled_response_formats}.") class EntryMetadata(Meta): diff --git a/optimade/server/data/mpf_551:cartesian_site_positions b/optimade/server/data/mpf_551:cartesian_site_positions new file mode 100644 index 0000000000000000000000000000000000000000..a996c92662e620572703a1f21bf55ff39268ad0a GIT binary patch literal 1904 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I%|COQhnnmP)#3giN=KFRn7k0W>NN9oaU7)=MG`Czmh7%c~eb2$J2AWTcV literal 0 HcmV?d00001 diff --git a/optimade/server/data/test_structures.json b/optimade/server/data/test_structures.json index fe9d22879..7ef98df69 100644 --- a/optimade/server/data/test_structures.json +++ b/optimade/server/data/test_structures.json @@ -2128,12 +2128,7 @@ "cartesian_site_positions": null, "meta": { "partial_data_links": { - "cartesian_site_positions": [ - { - "format": "jsonlines", - "link": "http://localhost:5000/partial_data/mpf_551?response_fields=cartesian_sitePositions" - } - ] + "cartesian_site_positions": [] } }, "dimension_types": [ diff --git a/optimade/server/routers/structures.py b/optimade/server/routers/structures.py index f9881b121..ad77b33eb 100644 --- a/optimade/server/routers/structures.py +++ b/optimade/server/routers/structures.py @@ -60,7 +60,7 @@ def get_single_structure( entry_id: str, params: SingleEntryQueryParams = Depends(), ) -> Any: - if "property_ranges" in request.query_params: + if "property_ranges" in request.query_params: # todo add test for this from optimade.server.routers.partial_data import partial_data_coll return get_partial_entry( diff --git a/optimade/validator/utils.py b/optimade/validator/utils.py index 81e5e11b7..085db335e 100644 --- a/optimade/validator/utils.py +++ b/optimade/validator/utils.py @@ -408,13 +408,11 @@ class ValidatorLinksResponse(Success): class ValidatorEntryResponseOne(Success): - meta: ResponseMeta = Field(...) data: EntryResource = Field(...) included: Optional[List[Dict[str, Any]]] = Field(None) # type: ignore[assignment] class ValidatorEntryResponseMany(Success): - meta: ResponseMeta = Field(...) data: List[EntryResource] = Field(...) included: Optional[List[Dict[str, Any]]] = Field(None) # type: ignore[assignment] From 64b97bdfe24d43caaddc6992cfcfa3786e22246d Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 5 Sep 2023 17:24:26 +0200 Subject: [PATCH 59/95] Fixed validator for format field. --- optimade/models/entries.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index a4f6a8333..7ef355042 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -111,11 +111,15 @@ class PartialDataLink(BaseModel): description='String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value "jsonlines", which refers to the format in OPTIMADE JSON lines partial data format.', ) # todo add check that the value of format is in a list of supported formats. I have already written the validator below but it causes an error I do not understand - # @validator("format", always=False, check_fields=False) - # def check_if_format_is_supported(cls, value): - # from optimade.server.config import CONFIG - # if value not in [form.value for form in CONFIG.enabled_response_formats]: - # raise ValueError(f"The format {value} is not one of the enabled_formats{CONFIG.enabled_response_formats}.") + @validator("format", always=False, check_fields=False) + def check_if_format_is_supported(cls, value): + from optimade.server.config import CONFIG + + if value not in [form.value for form in CONFIG.enabled_response_formats]: + raise ValueError( + f"The format {value} is not one of the enabled_formats{CONFIG.enabled_response_formats}." + ) + return value class EntryMetadata(Meta): From c908d3f448c74f7515098d5e5854284614678841 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:32:48 +0200 Subject: [PATCH 60/95] first minimal version partial data. --- openapi/openapi.json | 43 +++-- optimade/models/entries.py | 9 +- optimade/server/config.py | 5 +- optimade/server/data/__init__.py | 13 +- ...s => mpf_551:cartesian_site_positions.npy} | Bin .../entry_collections/entry_collections.py | 15 +- optimade/server/entry_collections/mongo.py | 154 ++++++++++++++---- optimade/server/main.py | 27 ++- optimade/server/query_params.py | 9 +- optimade/server/routers/structures.py | 2 +- optimade/server/routers/utils.py | 39 ++++- tests/server/routers/test_partial_data.py | 9 + 12 files changed, 251 insertions(+), 74 deletions(-) rename optimade/server/data/{mpf_551:cartesian_site_positions => mpf_551:cartesian_site_positions.npy} (100%) diff --git a/openapi/openapi.json b/openapi/openapi.json index e4abb6de1..1f7fbcf11 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -784,6 +784,17 @@ }, "name": "api_hint", "in": "query" + }, + { + "description": "A list of lists which contains a range for each dimension of the property.", + "required": false, + "schema": { + "title": "Property Ranges", + "type": "string", + "description": "A list of lists which contains a range for each dimension of the property." + }, + "name": "property_ranges", + "in": "query" } ], "responses": { @@ -1202,6 +1213,17 @@ }, "name": "api_hint", "in": "query" + }, + { + "description": "A list of lists which contains a range for each dimension of the property.", + "required": false, + "schema": { + "title": "Property Ranges", + "type": "string", + "description": "A list of lists which contains a range for each dimension of the property." + }, + "name": "property_ranges", + "in": "query" } ], "responses": { @@ -1395,10 +1417,9 @@ "required": false, "schema": { "title": "Property Ranges", - "type": "array", - "items": {}, + "type": "string", "description": "A list of lists which contains a range for each dimension of the property.", - "default": [] + "default": "" }, "name": "property_ranges", "in": "query" @@ -2964,8 +2985,8 @@ "type": "string", "description": "The URL of the reference.", "format": "uri", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "address": { "title": "Address", @@ -3825,8 +3846,8 @@ }, "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "should" }, "nperiodic_dimensions": { "title": "Nperiodic Dimensions", @@ -3851,9 +3872,9 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, - "x-optimade-support": "should", + "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-queryable": "optional" + "x-optimade-support": "should" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3868,9 +3889,9 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, - "x-optimade-support": "should", + "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-queryable": "optional" + "x-optimade-support": "should" }, "nsites": { "title": "Nsites", diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 7ef355042..7719aba6b 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -101,7 +101,6 @@ def cast_immutable_id_to_str(cls, value): class PartialDataLink(BaseModel): - # Todo add validator for link field. link: AnyUrl = OptimadeField( ..., description="String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", @@ -109,15 +108,15 @@ class PartialDataLink(BaseModel): format: str = OptimadeField( ..., description='String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value "jsonlines", which refers to the format in OPTIMADE JSON lines partial data format.', - ) # todo add check that the value of format is in a list of supported formats. I have already written the validator below but it causes an error I do not understand + ) - @validator("format", always=False, check_fields=False) + @validator("format") def check_if_format_is_supported(cls, value): from optimade.server.config import CONFIG - if value not in [form.value for form in CONFIG.enabled_response_formats]: + if value not in [form.value for form in CONFIG.partial_data_formats]: raise ValueError( - f"The format {value} is not one of the enabled_formats{CONFIG.enabled_response_formats}." + f"The format {value} is not one of the enabled_formats{CONFIG.partial_data_formats}." ) return value diff --git a/optimade/server/config.py b/optimade/server/config.py index a9f0ae778..cddc3bdeb 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -76,7 +76,6 @@ class SupportedResponseFormats(Enum): """ - HDF5 = "hdf5" JSON = "json" JSONL = "jsonlines" @@ -315,11 +314,11 @@ class ServerConfig(BaseSettings): description="""If False, data from the database will not undergo validation before being emitted by the API, and only the mapping of aliases will occur.""", ) - enabled_response_formats: List[SupportedResponseFormats] = Field( + partial_data_formats: List[SupportedResponseFormats] = Field( ["json", "jsonlines"], description="""A list of the response formats that are supported by this server. Must include the "json" format.""", ) - max_response_size: Optional[Dict[SupportedResponseFormats, int]] = Field( + max_response_size: Dict[SupportedResponseFormats, int] = Field( {"json": 10, "jsonlines": 40}, description="""This dictionary contains the approximate maximum size for a trajectory response in megabytes for the different response_formats. The keys indicate the response_format and the values the maximum size.""", ) diff --git a/optimade/server/data/__init__.py b/optimade/server/data/__init__.py index dd9c628bb..b4cee3665 100644 --- a/optimade/server/data/__init__.py +++ b/optimade/server/data/__init__.py @@ -10,7 +10,18 @@ "providers": "providers.json", } -data_files = ["mpf_551:cartesian_site_positions"] +data_files = [ + ( + "mpf_551:cartesian_site_positions.npy", + "numpy", + { + "endpoint": "structures", + "parent_id": "mpf_551", + "property_name": "cartesian_site_positions", + "dim_names": ["dim_sites", "dim_cartesian_dimensions"], + }, + ) +] for var, path in data_paths.items(): try: diff --git a/optimade/server/data/mpf_551:cartesian_site_positions b/optimade/server/data/mpf_551:cartesian_site_positions.npy similarity index 100% rename from optimade/server/data/mpf_551:cartesian_site_positions rename to optimade/server/data/mpf_551:cartesian_site_positions.npy diff --git a/optimade/server/entry_collections/entry_collections.py b/optimade/server/entry_collections/entry_collections.py index a5aa8756c..345b9f5f0 100644 --- a/optimade/server/entry_collections/entry_collections.py +++ b/optimade/server/entry_collections/entry_collections.py @@ -9,8 +9,11 @@ from optimade.exceptions import BadRequest, Forbidden, NotFound from optimade.filterparser import LarkParser from optimade.models.entries import EntryResource -from optimade.server.config import CONFIG, SupportedBackend -from optimade.server.mappers import BaseResourceMapper # type: ignore[attr-defined] +from optimade.server.config import CONFIG, SupportedBackend, SupportedResponseFormats +from optimade.server.mappers import ( # type: ignore[attr-defined] + BaseResourceMapper, + PartialDataMapper, +) from optimade.server.query_params import ( EntryListingQueryParams, PartialDataQueryParams, @@ -190,7 +193,7 @@ def find( supported_prefixes = self.resource_mapper.SUPPORTED_PREFIXES all_attributes = self.resource_mapper.ALL_ATTRIBUTES - if not isinstance(params, PartialDataQueryParams): + if not self.resource_mapper == PartialDataMapper: include_fields = ( response_fields - self.resource_mapper.TOP_LEVEL_NON_ATTRIBUTES_FIELDS ) @@ -248,7 +251,7 @@ def generate_links_partial_data(self, results): for entry in results: if entry.get("meta", {}) and entry["meta"].get("partial_data_links", {}): for property in entry["meta"]["partial_data_links"]: - for response_format in CONFIG.enabled_response_formats: + for response_format in CONFIG.partial_data_formats: entry["meta"]["partial_data_links"][property].append( { "format": str(response_format.value), @@ -375,10 +378,10 @@ def handle_query_params( # response_format if getattr(params, "response_format", False) and params.response_format not in ( - x.value for x in CONFIG.enabled_response_formats + x.value for x in SupportedResponseFormats ): raise BadRequest( - detail=f"Response format {params.response_format} is not supported, please use one of the supported response formats: {', '.join((x.value for x in CONFIG.enabled_response_formats))}" + detail=f"Response format {params.response_format} is not supported, please use one of the supported response formats: {', '.join((x.value for x in SupportedResponseFormats))}" ) # page_limit diff --git a/optimade/server/entry_collections/mongo.py b/optimade/server/entry_collections/mongo.py index f46d30a34..3852e148f 100644 --- a/optimade/server/entry_collections/mongo.py +++ b/optimade/server/entry_collections/mongo.py @@ -1,8 +1,9 @@ from typing import Any, Dict, List, Tuple, Type, Union +from optimade.exceptions import BadRequest from optimade.filtertransformers.mongo import MongoTransformer from optimade.models import EntryResource # type: ignore[attr-defined] -from optimade.server.config import CONFIG, SupportedBackend +from optimade.server.config import CONFIG, SupportedBackend, SupportedResponseFormats from optimade.server.entry_collections import EntryCollection from optimade.server.logger import LOGGER from optimade.server.mappers import BaseResourceMapper # type: ignore[attr-defined] @@ -100,23 +101,21 @@ def count(self, **kwargs: Any) -> int: kwargs["filter"] = {} return len(self.collection.find(**kwargs)) - def insert(self, content: bytes, filename: str) -> None: + def insert(self, content: bytes, filename: str, metadata: dict = {}) -> None: """Add the given entries to the underlying database. Warning: No validation is performed on the incoming data. Arguments: - data: The entry resource objects to add to the database. - + content: The file content to add to gridfs. + filename: The filename of the added content. + metadata: extra metadata to add to the gridfs entry. """ - self.collection.put(content, filename=filename) + self.collection.put(content, filename=filename, metadata=metadata) def handle_query_params( - self, - params: Union[ - EntryListingQueryParams, SingleEntryQueryParams, PartialDataQueryParams - ], + self, params: Union[SingleEntryQueryParams, PartialDataQueryParams] ) -> Dict[str, Any]: """Parse and interpret the backend-agnostic query parameter models into a dictionary that can be used by MongoDB. @@ -155,9 +154,21 @@ def handle_query_params( if isinstance(params, PartialDataQueryParams): entry_id = params.filter.split("=")[1][1:-1] criteria["filter"] = { - "filename": {"$eq": f"{entry_id}:{params.response_fields}"} + "filename": { + "$eq": f"{entry_id}:{params.response_fields}.npy" + } # todo Should we add support for other file extensions? } # Todo make sure response fields has only one value + # response_format + if getattr(params, "response_format", False) and params.response_format not in ( + x.value for x in CONFIG.partial_data_formats + ): + raise BadRequest( + detail=f"Response format {params.response_format} is not supported, please use one of the supported response formats: {', '.join((x.value for x in CONFIG.partial_data_formats))}" + ) + criteria["response_format"] = params.response_format + criteria["property_ranges"] = params.property_ranges + return criteria # todo test if it is more efficient to use the get method of gridfs @@ -179,41 +190,112 @@ def _run_db_query( """ # TODO handle case where the type does not have a fixed width. For example strings or dictionaries. - - max_return_size = 10000000 - property_dimensions: list[int] = [] # todo read this data from metadata + response_format = criteria.pop("response_format") + max_return_size = CONFIG.max_response_size[ + SupportedResponseFormats(response_format) + ] # todo adjust for different output formats(take into account that the number of numbers to read is larger for a text based output format than for a binary format. results = [] filterdict = criteria.pop("filter", {}) - criteria.pop("requested_range", property_dimensions) - gridcursor = self.collection.find( - filterdict - ) # I have tried to use just **criteria as is mentioned in the documentation but this does not seem to work. + + # I have tried to use just **criteria as is mentioned in the documentation but this does not seem to work. + gridcursor = self.collection.find(filterdict) more_data_available = False nresults = 0 - for file_obj in gridcursor: - nresults = +1 - property_name = file_obj.filename.split(":")[1] - # results.append(grid_out.read()) - if file_obj.length > max_return_size: - header = file_obj.readline() - values = header + file_obj.read() - # TODo handle splitting up file + # todo add code that can handle very sparse requests where reading individual sections of files is more efficient. + for ( + file_obj + ) in ( + gridcursor + ): # Next throws an error when there are zero files returned, so I use a for loop instead to get one result. + nresults += 1 + metadata = file_obj.metadata + property_ranges = self.parse_property_ranges( + criteria.pop("property_ranges", None), + metadata["sliceobj"], + metadata["dim_names"], + ) + item_size = metadata["dtype"]["itemsize"] + dim_sizes = [ + (i["stop"] - i["start"] + 1) // i["step"] for i in metadata["sliceobj"] + ] + top_stepsize = 1 + for i in dim_sizes[1:]: + top_stepsize *= i + offset = (property_ranges[0]["start"] - 1) * item_size * top_stepsize + file_obj.seek( + offset + ) # set the correct starting point fo the read from the gridfs file system. + if (max_return_size / item_size) < ( + 1 + property_ranges[0]["stop"] - property_ranges[0]["start"] + ) * top_stepsize: # case more data requested then fits in the response more_data_available = True - else: # case whole file can be returned. - values = file_obj.read() - - results = [ - { - "type": "partial_data", - "id": str(file_obj._id), - "property_name": property_name, - "data": values, - } - ] + n_val_return = max_return_size / item_size + n_outer = max( + int(n_val_return / top_stepsize), 1 + ) # always read at least one line for now. + read_size = n_outer * top_stepsize * item_size + shape = [n_outer] + dim_sizes[1:] + else: + read_size = ( + 1 + property_ranges[0]["stop"] - property_ranges[0]["start"] + ) * top_stepsize + shape = ( + 1 + property_ranges[0]["stop"] - property_ranges[0]["start"] + ) + dim_sizes[1:] + + values = file_obj.read(read_size) + entry = { + "id": metadata.get("parent_id", None), + "type": metadata.get("endpoint", None), + } + results = [ + { + "type": "partial_data", + "id": str(file_obj._id), + "property_name": metadata.get("property_name", None), + "entry": entry, + "data": values, + "dtype": metadata["dtype"], + "shape": shape, + "property_ranges": property_ranges, + } + ] + if more_data_available: + property_ranges_str = f"property_ranges={metadata['dim_names'][0]}:{property_ranges[0]['start']+n_outer}:{property_ranges[0]['stop']}:{property_ranges[0]['step']}" + for i, name in enumerate(metadata["dim_names"][1:]): + property_ranges_str += f",{name}:{property_ranges[i+1]['start']}:{property_ranges[i+1]['stop']}:{property_ranges[i+1]['step']}" + results[0][ + "next" + ] = f"{CONFIG.base_url}/partial_data/{metadata['parent_id']}?response_fields={metadata['property_name']}&response_format={response_format}&{property_ranges_str}" break return results, nresults, more_data_available + def parse_property_ranges( + self, property_range_str: str, attribute_sliceobj: list, dim_names: list + ) -> list[dict]: + property_range_dict = {} + if property_range_str: + ranges = [dimrange.split(":") for dimrange in property_range_str.split(",")] + + for subrange in ranges: + property_range_dict[subrange[0]] = { + "start": int(subrange[1]) + if subrange[1] + else attribute_sliceobj[dim_names.index(subrange[0])]["start"], + "stop": int(subrange[2]) + if subrange[2] + else attribute_sliceobj[dim_names.index(subrange[0])]["stop"], + "step": int(subrange[3]) + if subrange[3] + else attribute_sliceobj[dim_names.index(subrange[0])]["step"], + } + for i, dim in enumerate(dim_names): + if dim not in property_range_dict: + property_range_dict[dim] = attribute_sliceobj[i] + + return [property_range_dict[dim] for dim in dim_names] + class MongoCollection(MongoBaseCollection): """Class for querying MongoDB collections (implemented by either pymongo or mongomock) diff --git a/optimade/server/main.py b/optimade/server/main.py index 0fe687be1..56efd4c16 100644 --- a/optimade/server/main.py +++ b/optimade/server/main.py @@ -75,12 +75,33 @@ if CONFIG.database_backend.value in ("mongomock", "mongodb"): from pathlib import Path + import numpy + from optimade.server.routers.partial_data import partial_data_coll - for filename in getattr(data, "data_files", []): + # todo create seperate function for storing data files in gridfs + # read_array_header function originally from https://stackoverflow.com/a/64226659 by https://stackoverflow.com/users/982257/iguananaut + def read_array_header(fobj): + version = numpy.lib.format.read_magic(fobj) + func_name = "read_array_header_" + "_".join(str(v) for v in version) + func = getattr(numpy.lib.format, func_name) + return func(fobj) + + for filename, filetype, metadata in getattr(data, "data_files", []): with open(Path(__file__).parent / "data" / filename, "rb") as f: - a = partial_data_coll.insert(f, filename=filename) - pass + if filetype == "numpy": + numpy_meta = read_array_header(f) + if "slice_obj" not in metadata: + slice_obj = [ + {"start": 1, "stop": i, "step": 1} for i in numpy_meta[0] + ] + metadata["sliceobj"] = slice_obj + if "dtype" not in metadata: + metadata["dtype"] = { + "name": numpy_meta[2].name, + "itemsize": numpy_meta[2].itemsize, + } + partial_data_coll.insert(f, filename=filename, metadata=metadata) def load_entries(endpoint_name: str, endpoint_collection: EntryCollection): LOGGER.debug("Loading test %s...", endpoint_name) diff --git a/optimade/server/query_params.py b/optimade/server/query_params.py index 50686321b..30561c0cd 100644 --- a/optimade/server/query_params.py +++ b/optimade/server/query_params.py @@ -324,12 +324,17 @@ def __init__( description="If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", regex=r"(v[0-9]+(\.[0-9]+)?)?", ), + property_ranges: str = Query( + None, + description="A list of lists which contains a range for each dimension of the property.", + ), ): self.response_format = response_format self.email_address = email_address self.response_fields = response_fields self.include = include self.api_hint = api_hint + self.property_ranges = property_ranges class PartialDataQueryParams(BaseQueryParams): @@ -384,8 +389,8 @@ def __init__( "", description="A filter string, in the format described in section API Filtering Format Specification of the specification.", ), - property_ranges: list = Query( - [], + property_ranges: str = Query( + "", description="A list of lists which contains a range for each dimension of the property.", ), ): diff --git a/optimade/server/routers/structures.py b/optimade/server/routers/structures.py index ad77b33eb..21cbe9a9c 100644 --- a/optimade/server/routers/structures.py +++ b/optimade/server/routers/structures.py @@ -60,7 +60,7 @@ def get_single_structure( entry_id: str, params: SingleEntryQueryParams = Depends(), ) -> Any: - if "property_ranges" in request.query_params: # todo add test for this + if params.property_ranges is not None: # todo add test for this from optimade.server.routers.partial_data import partial_data_coll return get_partial_entry( diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index 7fa31267f..7cbb2257c 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -388,15 +388,35 @@ def get_partial_entry( links = ToplevelLinks(next=None) - if results is not None and (fields or include_fields): - results = handle_response_fields(results, fields, include_fields)[0] # type: ignore[assignment] if results is None: raise NotFound( detail=f"No data available for the combination of entry {entry_id} and property {params.response_fields}", ) + + array = np.frombuffer( + results["attributes"]["data"], + dtype=getattr(np, results["attributes"]["dtype"]["name"]), + ).reshape(results["attributes"]["shape"]) + # slice array + property_ranges = results["attributes"]["property_ranges"] + slice_ind = [ + slice( + 0, + 1 + property_ranges[0]["stop"] - property_ranges[0]["start"], + property_ranges[0]["step"], + ) + ] + for dim_range in property_ranges[1:]: + slice_ind.append( + slice(dim_range["start"] - 1, dim_range["stop"], dim_range["step"]) + ) + array = array[tuple(slice_ind)] + + if fields or include_fields: + results = handle_response_fields(results, fields, include_fields)[0] # type: ignore[assignment] + # todo make the implementation of these formats more universal. i.e. allow them for other endpoint as well, - array = np.load(io.BytesIO(results["attributes"]["data"])) sliceobj = [] for i in array.shape: sliceobj.append({"start": 1, "stop": i, "step": 1}) @@ -408,14 +428,18 @@ def get_partial_entry( # "entry": {"id": entry_id, "type": None}, #Todo add type information to metadata entry "has_references": False, } # Todo: add support for non_dense data + if more_data_available: + next_link = ["PARTIAL-DATA-NEXT", [results["attributes"].pop("next")]] if params.response_format == "json": for key in header: results["attributes"][key] = header[key] - results["attributes"]["data"] = array.tolist() + results["attributes"]["data"] = array.tolist() + if more_data_available: + results["attributes"]["next"] = next_link return dict( links=links, - data=results if results else None, + data=[results] if results else None, meta=meta_values( url=request.url, data_returned=data_returned, @@ -428,8 +452,11 @@ def get_partial_entry( # included=included, ) + jsonl_content = [header, array.tolist()] + if more_data_available: + jsonl_content.append(next_link) return Response( - content=to_jsonl([header, array.tolist()]), + content=to_jsonl(jsonl_content), media_type="application/jsonlines", headers={ "Content-disposition": f"attachment; filename={entry_id + ':' + params.response_fields}.jsonl" diff --git a/tests/server/routers/test_partial_data.py b/tests/server/routers/test_partial_data.py index 7ac1fda7c..5f0773d85 100644 --- a/tests/server/routers/test_partial_data.py +++ b/tests/server/routers/test_partial_data.py @@ -12,6 +12,15 @@ class TestPartialDataEndpoint(NoJsonEndpointTests): response_cls = PartialDataResponse +def test_property_ranges_link(get_good_response, client): + test_id = "mpf_551" + params = "response_fields=cartesian_site_positions&property_ranges=dim_sites:2:74:1,dim_cartesian_dimensions:1:3:1&response_format=json" + request = f"/partial_data/{test_id}?{params}" + get_good_response( + request, server=client + ) # todo expand test to check content better. + + def test_wrong_id_partial_data(check_error_response, client): """If a non-supported versioned base URL is passed, `553 Version Not Supported` should be returned From 04e9ff606610dc335c18b2a2e567770f9af23432 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:21:52 +0200 Subject: [PATCH 61/95] update openapijson --- openapi/openapi.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openapi/openapi.json b/openapi/openapi.json index e0bba9fa4..65c829df1 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -3359,9 +3359,9 @@ "type": "number" }, "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", - "x-optimade-unit": "a.m.u.", "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-unit": "a.m.u." }, "original_name": { "title": "Original Name", @@ -3640,8 +3640,8 @@ "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, "x-optimade-support": "should", - "x-optimade-unit": "\u00c5", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-unit": "\u00c5" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3657,8 +3657,8 @@ "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, "x-optimade-support": "should", - "x-optimade-unit": "\u00c5", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-unit": "\u00c5" }, "nsites": { "title": "Nsites", From 536893481d79d40b159e8db1dedc61f8afe070ee Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:29:52 +0200 Subject: [PATCH 62/95] update openapijson --- openapi/openapi.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openapi/openapi.json b/openapi/openapi.json index 65c829df1..d1d5491e8 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -3639,9 +3639,9 @@ }, "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", "nullable": true, + "x-optimade-unit": "\u00c5", "x-optimade-support": "should", - "x-optimade-queryable": "optional", - "x-optimade-unit": "\u00c5" + "x-optimade-queryable": "optional" }, "cartesian_site_positions": { "title": "Cartesian Site Positions", @@ -3656,9 +3656,9 @@ }, "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", "nullable": true, + "x-optimade-unit": "\u00c5", "x-optimade-support": "should", - "x-optimade-queryable": "optional", - "x-optimade-unit": "\u00c5" + "x-optimade-queryable": "optional" }, "nsites": { "title": "Nsites", From bccbe7314662a5b249fd62169d6dd8972b01fea0 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Wed, 13 Sep 2023 15:26:24 +0200 Subject: [PATCH 63/95] update openapijson --- openapi/index_openapi.json | 810 +++++++++---------- openapi/openapi.json | 1534 ++++++++++++++++++------------------ 2 files changed, 1172 insertions(+), 1172 deletions(-) diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index 5b61b1288..2c2c3165f 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.2", + "openapi": "3.1.0", "info": { "title": "OPTIMADE API - Index meta-database", "description": "The [Open Databases Integration for Materials Design (OPTIMADE) consortium](https://www.optimade.org/) aims to make materials databases interoperational by developing a common REST API.\nThis is the \"special\" index meta-database.\n\nThis specification is generated using [`optimade-python-tools`](https://github.com/Materials-Consortia/optimade-python-tools/tree/v0.25.2) v0.25.2.", @@ -109,8 +109,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -121,8 +121,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -133,10 +133,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -146,9 +146,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -159,9 +159,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -172,9 +172,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -185,9 +185,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -198,8 +198,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -209,9 +209,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -222,8 +222,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -233,8 +233,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -244,8 +244,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -256,9 +256,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -376,42 +376,36 @@ "components": { "schemas": { "Aggregate": { - "title": "Aggregate", "enum": [ "ok", "test", "staging", "no" ], + "title": "Aggregate", "description": "Enumeration of aggregate values" }, "Attributes": { - "title": "Attributes", - "type": "object", "properties": {}, + "type": "object", + "title": "Attributes", "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.\nThe keys for Attributes MUST NOT be:\n relationships\n links\n id\n type" }, "AvailableApiVersion": { - "title": "AvailableApiVersion", - "required": [ - "url", - "version" - ], - "type": "object", "properties": { "url": { - "title": "Url", + "type": "string", "maxLength": 65536, "minLength": 1, "pattern": ".+/v[0-1](\\.[0-9]+)*/?$", - "type": "string", - "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL", - "format": "uri" + "format": "uri", + "title": "Url", + "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL" }, "version": { - "title": "Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Version", "description": "A string containing the full version number of the API served at that versioned base URL.\nThe version number string MUST NOT be prefixed by, e.g., 'v'.\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -420,448 +414,446 @@ ] } }, + "type": "object", + "required": [ + "url", + "version" + ], + "title": "AvailableApiVersion", "description": "A JSON object containing information about an available API version" }, "BaseRelationshipMeta": { - "title": "BaseRelationshipMeta", - "required": [ - "description" - ], - "type": "object", "properties": { "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "OPTIONAL human-readable description of the relationship." } }, + "type": "object", + "required": [ + "description" + ], + "title": "BaseRelationshipMeta", "description": "Specific meta field for base relationship resource" }, "BaseRelationshipResource": { - "title": "BaseRelationshipResource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/BaseRelationshipMeta" } ], + "title": "Meta", "description": "Relationship meta field. MUST contain 'description' if supplied." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "BaseRelationshipResource", "description": "Minimum requirements to represent a relationship resource" }, "EntryMetadata": { - "title": "EntryMetadata", - "type": "object", "properties": { "property_metadata": { - "title": "Property Metadata", "type": "object", + "title": "Property Metadata", "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." } }, + "type": "object", + "title": "EntryMetadata", "description": "Contains the metadata for the attributes of an entry" }, "EntryRelationships": { - "title": "EntryRelationships", - "type": "object", "properties": { "references": { - "title": "References", "allOf": [ { "$ref": "#/components/schemas/ReferenceRelationship" } ], + "title": "References", "description": "Object containing links to relationships with entries of the `references` type." }, "structures": { - "title": "Structures", "allOf": [ { "$ref": "#/components/schemas/StructureRelationship" } ], + "title": "Structures", "description": "Object containing links to relationships with entries of the `structures` type." } }, + "type": "object", + "title": "EntryRelationships", "description": "This model wraps the JSON API Relationships to include type-specific top level keys." }, "EntryResource": { - "title": "EntryResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/EntryResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary, containing key-value pairs representing the entry's properties, except for `type` and `id`.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "EntryResource", "description": "The base model for an entry resource." }, "EntryResourceAttributes": { - "title": "EntryResourceAttributes", - "required": [ - "last_modified" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", "x-optimade-queryable": "must" } }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "EntryResourceAttributes", "description": "Contains key-value pairs representing the entry's properties." }, "Error": { - "title": "Error", - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "title": "Error", "description": "An error response" }, "ErrorLinks": { - "title": "ErrorLinks", - "type": "object", "properties": { "about": { - "title": "About", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "About", "description": "A link that leads to further details about this particular occurrence of the problem." } }, + "type": "object", + "title": "ErrorLinks", "description": "A Links object specific to Error objects" }, "ErrorResponse": { - "title": "ErrorResponse", - "required": [ - "meta", - "errors" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/Resource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/Resource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Outputted Data" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information." }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/OptimadeError" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of OPTIMADE-specific JSON API error objects, where the field detail MUST be present." }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "meta", + "errors" + ], + "title": "ErrorResponse", "description": "errors MUST be present and data MUST be skipped" }, "ErrorSource": { - "title": "ErrorSource", - "type": "object", "properties": { "pointer": { - "title": "Pointer", "type": "string", + "title": "Pointer", "description": "a JSON Pointer [RFC6901] to the associated entity in the request document [e.g. \"/data\" for a primary data object, or \"/data/attributes/title\" for a specific attribute]." }, "parameter": { - "title": "Parameter", "type": "string", + "title": "Parameter", "description": "a string indicating which URI query parameter caused the error." } }, + "type": "object", + "title": "ErrorSource", "description": "an object containing references to the source of the error" }, "Implementation": { - "title": "Implementation", - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "name of the implementation" }, "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "version string of the current implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the homepage of the implementation." }, "source_url": { - "title": "Source Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Source Url", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation source, either downloadable archive or version control system." }, "maintainer": { - "title": "Maintainer", "allOf": [ { "$ref": "#/components/schemas/ImplementationMaintainer" } ], + "title": "Maintainer", "description": "A dictionary providing details about the maintainer of the implementation." }, "issue_tracker": { - "title": "Issue Tracker", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Issue Tracker", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation's issue tracker." } }, + "type": "object", + "title": "Implementation", "description": "Information on the server implementation" }, "ImplementationMaintainer": { - "title": "ImplementationMaintainer", - "required": [ - "email" - ], - "type": "object", "properties": { "email": { - "title": "Email", "type": "string", - "description": "the maintainer's email address", - "format": "email" + "format": "email", + "title": "Email", + "description": "the maintainer's email address" } }, - "description": "Details about the maintainer of the implementation" - }, - "IndexInfoAttributes": { - "title": "IndexInfoAttributes", + "type": "object", "required": [ - "api_version", - "available_api_versions", - "available_endpoints", - "entry_types_by_format" + "email" ], - "type": "object", + "title": "ImplementationMaintainer", + "description": "Details about the maintainer of the implementation" + }, + "IndexInfoAttributes": { "properties": { "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -870,791 +862,792 @@ ] }, "available_api_versions": { - "title": "Available Api Versions", - "type": "array", "items": { "$ref": "#/components/schemas/AvailableApiVersion" }, + "type": "array", + "title": "Available Api Versions", "description": "A list of dictionaries of available API versions at other base URLs" }, "formats": { - "title": "Formats", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Formats", "description": "List of available output formats.", "default": [ "json" ] }, "available_endpoints": { - "title": "Available Endpoints", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Available Endpoints", "description": "List of available endpoints (i.e., the string to be appended to the versioned base URL)." }, "entry_types_by_format": { - "title": "Entry Types By Format", - "type": "object", "additionalProperties": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, + "type": "object", + "title": "Entry Types By Format", "description": "Available entry endpoints as a function of output formats." }, "is_index": { - "title": "Is Index", "type": "boolean", + "title": "Is Index", "description": "This must be `true` since this is an index meta-database (see section Index Meta-Database).", "default": true } }, + "type": "object", + "required": [ + "api_version", + "available_api_versions", + "available_endpoints", + "entry_types_by_format" + ], + "title": "IndexInfoAttributes", "description": "Attributes for Base URL Info endpoint for an Index Meta-Database" }, "IndexInfoResource": { - "title": "IndexInfoResource", - "required": [ - "id", - "type", - "attributes", - "relationships" - ], - "type": "object", "properties": { "id": { - "title": "Id", - "pattern": "^/$", "type": "string", + "pattern": "^/$", + "title": "Id", "default": "/" }, "type": { - "title": "Type", - "pattern": "^info$", "type": "string", + "pattern": "^info$", + "title": "Type", "default": "info" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { "$ref": "#/components/schemas/IndexInfoAttributes" }, "relationships": { - "title": "Relationships", - "type": "object", "additionalProperties": { "$ref": "#/components/schemas/IndexRelationship" }, + "type": "object", + "title": "Relationships", "description": "Reference to the Links identifier object under the `links` endpoint that the provider has chosen as their 'default' OPTIMADE API database.\nA client SHOULD present this database as the first choice when an end-user chooses this provider." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes", + "relationships" + ], + "title": "IndexInfoResource", "description": "Index Meta-Database Base URL Info endpoint resource" }, "IndexInfoResponse": { - "title": "IndexInfoResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/IndexInfoResource" } ], + "title": "Data", "description": "Index meta-database /info data." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "IndexInfoResponse", "description": "errors are not allowed" }, "IndexRelationship": { - "title": "IndexRelationship", - "required": [ - "data" - ], - "type": "object", "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/RelatedLinksResource" } ], + "title": "Data", "description": "[JSON API resource linkage](http://jsonapi.org/format/1.0/#document-links).\nIt MUST be either `null` or contain a single Links identifier object with the fields `id` and `type`" } }, + "type": "object", + "required": [ + "data" + ], + "title": "IndexRelationship", "description": "Index Meta-Database relationship" }, "JsonApi": { - "title": "JsonApi", - "type": "object", "properties": { "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "Version of the json API used", "default": "1.0" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "Non-standard meta information" } }, + "type": "object", + "title": "JsonApi", "description": "An object describing the server's implementation" }, "Link": { - "title": "Link", - "required": [ - "href" - ], - "type": "object", "properties": { "href": { - "title": "Href", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "a string containing the link\u2019s URL.", - "format": "uri" + "format": "uri", + "title": "Href", + "description": "a string containing the link\u2019s URL." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the link." } }, + "type": "object", + "required": [ + "href" + ], + "title": "Link", "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object." }, "LinkType": { - "title": "LinkType", "enum": [ "child", "root", "external", "providers" ], + "title": "LinkType", "description": "Enumeration of link_type values" }, "LinksResource": { - "title": "LinksResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^links$", "type": "string", + "pattern": "^links$", + "title": "Type", "description": "These objects are described in detail in the section Links Endpoint", "default": "links" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/LinksResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary containing key-value pairs representing the Links resource's properties." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "LinksResource", "description": "A Links endpoint resource object" }, "LinksResourceAttributes": { - "title": "LinksResourceAttributes", - "required": [ - "name", - "description", - "base_url", - "homepage", - "link_type" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Human-readable name for the OPTIMADE API implementation, e.g., for use in clients to show the name to the end-user." }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "Human-readable description for the OPTIMADE API implementation, e.g., for use in clients to show a description to the end-user." }, "base_url": { - "title": "Base Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Base Url", "description": "JSON API links object, pointing to the base URL for this implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "JSON API links object, pointing to a homepage URL for this implementation" }, "link_type": { - "title": "Link Type", "allOf": [ { "$ref": "#/components/schemas/LinkType" } ], + "title": "Link Type", "description": "The type of the linked relation.\nMUST be one of these values: 'child', 'root', 'external', 'providers'." }, "aggregate": { - "title": "Aggregate", "allOf": [ { "$ref": "#/components/schemas/Aggregate" } ], + "title": "Aggregate", "description": "A string indicating whether a client that is following links to aggregate results from different OPTIMADE implementations should follow this link or not.\nThis flag SHOULD NOT be indicated for links where `link_type` is not `child`.\n\nIf not specified, clients MAY assume that the value is `ok`.\nIf specified, and the value is anything different than `ok`, the client MUST assume that the server is suggesting not to follow the link during aggregation by default (also if the value is not among the known ones, in case a future specification adds new accepted values).\n\nSpecific values indicate the reason why the server is providing the suggestion.\nA client MAY follow the link anyway if it has reason to do so (e.g., if the client is looking for all test databases, it MAY follow the links marked with `aggregate`=`test`).\n\nIf specified, it MUST be one of the values listed in section Link Aggregate Options.", "default": "ok" }, "no_aggregate_reason": { - "title": "No Aggregate Reason", "type": "string", + "title": "No Aggregate Reason", "description": "An OPTIONAL human-readable string indicating the reason for suggesting not to aggregate results following the link.\nIt SHOULD NOT be present if `aggregate`=`ok`." } }, + "type": "object", + "required": [ + "name", + "description", + "base_url", + "homepage", + "link_type" + ], + "title": "LinksResourceAttributes", "description": "Links endpoint resource object attributes" }, "LinksResponse": { - "title": "LinksResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/LinksResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE links resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "LinksResponse", "description": "errors are not allowed" }, "Meta": { - "title": "Meta", - "type": "object", "properties": {}, + "type": "object", + "title": "Meta", "description": "Non-standard meta-information that can not be represented as an attribute or relationship." }, "OptimadeError": { - "title": "OptimadeError", - "required": [ - "detail" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "required": [ + "detail" + ], + "title": "OptimadeError", "description": "detail MUST be present" }, "Provider": { - "title": "Provider", - "required": [ - "name", - "description", - "prefix" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "a short name for the database provider" }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "a longer description of the database provider" }, "prefix": { - "title": "Prefix", - "pattern": "^[a-z]([a-z]|[0-9]|_)*$", "type": "string", + "pattern": "^[a-z]([a-z]|[0-9]|_)*$", + "title": "Prefix", "description": "database-provider-specific prefix as found in section Database-Provider-Specific Namespace Prefixes." }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object." } }, + "type": "object", + "required": [ + "name", + "description", + "prefix" + ], + "title": "Provider", "description": "Information on the database provider of the implementation." }, "ReferenceRelationship": { - "title": "ReferenceRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "ReferenceRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "RelatedLinksResource": { - "title": "RelatedLinksResource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", - "pattern": "^links$", "type": "string", + "pattern": "^links$", + "title": "Type", "default": "links" } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "RelatedLinksResource", "description": "A related Links resource object" }, "RelationshipLinks": { - "title": "RelationshipLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link for the relationship itself (a 'relationship link').\nThis link allows the client to directly manipulate the relationship.\nWhen fetched successfully, this link returns the [linkage](https://jsonapi.org/format/1.0/#document-resource-object-linkage) for the related resources as its primary data.\n(See [Fetching Relationships](https://jsonapi.org/format/1.0/#fetching-relationships).)" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A [related resource link](https://jsonapi.org/format/1.0/#document-resource-object-related-resource-links)." } }, + "type": "object", + "title": "RelationshipLinks", "description": "A resource object **MAY** contain references to other resource objects (\"relationships\").\nRelationships may be to-one or to-many.\nRelationships can be specified by including a member in a resource's links object." }, "Relationships": { - "title": "Relationships", - "type": "object", "properties": {}, + "type": "object", + "title": "Relationships", "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.\nKeys MUST NOT be:\n type\n id" }, "Resource": { - "title": "Resource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/Attributes" } ], + "title": "Attributes", "description": "an attributes object representing some of the resource\u2019s data." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/Relationships" } ], + "title": "Relationships", "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "Resource", "description": "Resource objects appear in a JSON API document to represent resources." }, "ResourceLinks": { - "title": "ResourceLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link that identifies the resource represented by the resource object." } }, + "type": "object", + "title": "ResourceLinks", "description": "A Resource Links object" }, "ResponseMeta": { - "title": "ResponseMeta", - "required": [ - "query", - "api_version", - "more_data_available" - ], - "type": "object", "properties": { "query": { - "title": "Query", "allOf": [ { "$ref": "#/components/schemas/ResponseMetaQuery" } ], + "title": "Query", "description": "Information on the Query that was requested" }, "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -1663,298 +1656,305 @@ ] }, "more_data_available": { - "title": "More Data Available", "type": "boolean", + "title": "More Data Available", "description": "`false` if the response contains all data for the request (e.g., a request issued to a single entry endpoint, or a `filter` query at the last page of a paginated response) and `true` if the response is incomplete in the sense that multiple objects match the request, and not all of them have been included in the response (e.g., a query with multiple pages that is not at the last page)." }, "schema": { - "title": "Schema", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Schema", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) that points to a schema for the response.\nIf it is a string, or a dictionary containing no `meta` field, the provided URL MUST point at an [OpenAPI](https://swagger.io/specification/) schema.\nIt is possible that future versions of this specification allows for alternative schema types.\nHence, if the `meta` field of the JSON API links object is provided and contains a field `schema_type` that is not equal to the string `OpenAPI` the client MUST not handle failures to parse the schema or to validate the response against the schema as errors." }, "time_stamp": { - "title": "Time Stamp", "type": "string", - "description": "A timestamp containing the date and time at which the query was executed.", - "format": "date-time" + "format": "date-time", + "title": "Time Stamp", + "description": "A timestamp containing the date and time at which the query was executed." }, "data_returned": { - "title": "Data Returned", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Data Returned", "description": "An integer containing the total number of data resource objects returned for the current `filter` query, independent of pagination." }, "provider": { - "title": "Provider", "allOf": [ { "$ref": "#/components/schemas/Provider" } ], + "title": "Provider", "description": "information on the database provider of the implementation." }, "data_available": { - "title": "Data Available", "type": "integer", + "title": "Data Available", "description": "An integer containing the total number of data resource objects available in the database for the endpoint." }, "last_id": { - "title": "Last Id", "type": "string", + "title": "Last Id", "description": "a string containing the last ID returned" }, "response_message": { - "title": "Response Message", "type": "string", + "title": "Response Message", "description": "response string from the server" }, "implementation": { - "title": "Implementation", "allOf": [ { "$ref": "#/components/schemas/Implementation" } ], + "title": "Implementation", "description": "a dictionary describing the server implementation" }, "warnings": { - "title": "Warnings", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Warnings" }, + "type": "array", + "uniqueItems": true, + "title": "Warnings", "description": "A list of warning resource objects representing non-critical errors or warnings.\nA warning resource object is defined similarly to a [JSON API error object](http://jsonapi.org/format/1.0/#error-objects), but MUST also include the field `type`, which MUST have the value `\"warning\"`.\nThe field `detail` MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\nThe field `status`, representing a HTTP response status code, MUST NOT be present for a warning resource object.\nThis is an exclusive field for error resource objects." } }, + "type": "object", + "required": [ + "query", + "api_version", + "more_data_available" + ], + "title": "ResponseMeta", "description": "A [JSON API meta member](https://jsonapi.org/format/1.0#document-meta)\nthat contains JSON API meta objects of non-standard\nmeta-information.\n\nOPTIONAL additional information global to the query that is not\nspecified in this document, MUST start with a\ndatabase-provider-specific prefix." }, "ResponseMetaQuery": { - "title": "ResponseMetaQuery", - "required": [ - "representation" - ], - "type": "object", "properties": { "representation": { - "title": "Representation", "type": "string", + "title": "Representation", "description": "A string with the part of the URL following the versioned or unversioned base URL that serves the API.\nQuery parameters that have not been used in processing the request MAY be omitted.\nIn particular, if no query parameters have been involved in processing the request, the query part of the URL MAY be excluded.\nExample: `/structures?filter=nelements=2`" } }, + "type": "object", + "required": [ + "representation" + ], + "title": "ResponseMetaQuery", "description": "Information on the query that was requested." }, "StructureRelationship": { - "title": "StructureRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "StructureRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "ToplevelLinks": { - "title": "ToplevelLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link to itself" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A related resource link" }, "first": { - "title": "First", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "First", "description": "The first page of data" }, "last": { - "title": "Last", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Last", "description": "The last page of data" }, "prev": { - "title": "Prev", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Prev", "description": "The previous page of data" }, "next": { - "title": "Next", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Next", "description": "The next page of data" } }, + "type": "object", + "title": "ToplevelLinks", "description": "A set of Links objects, possibly including pagination" }, "Warnings": { - "title": "Warnings", - "required": [ - "detail", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." }, "type": { - "title": "Type", - "pattern": "^warning$", "type": "string", + "pattern": "^warning$", + "title": "Type", "description": "Warnings must be of type \"warning\"", "default": "warning" } }, + "type": "object", + "required": [ + "detail", + "type" + ], + "title": "Warnings", "description": "OPTIMADE-specific warning class based on OPTIMADE-specific JSON API Error.\n\nFrom the specification:\n\nA warning resource object is defined similarly to a JSON API error object, but MUST also include the field type, which MUST have the value \"warning\".\nThe field detail MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\n\nNote: Must be named \"Warnings\", since \"Warning\" is a built-in Python class." } } diff --git a/openapi/openapi.json b/openapi/openapi.json index d1d5491e8..3e2a2f51a 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.2", + "openapi": "3.1.0", "info": { "title": "OPTIMADE API", "description": "The [Open Databases Integration for Materials Design (OPTIMADE) consortium](https://www.optimade.org/) aims to make materials databases interoperational by developing a common REST API.\n\nThis specification is generated using [`optimade-python-tools`](https://github.com/Materials-Consortia/optimade-python-tools/tree/v0.25.2) v0.25.2.", @@ -108,8 +108,8 @@ { "required": true, "schema": { - "title": "Entry", - "type": "string" + "type": "string", + "title": "Entry" }, "name": "entry", "in": "path" @@ -211,8 +211,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -223,8 +223,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -235,10 +235,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -248,9 +248,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -261,9 +261,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -274,9 +274,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -287,9 +287,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -300,8 +300,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -311,9 +311,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -324,8 +324,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -335,8 +335,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -346,8 +346,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -358,9 +358,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -464,8 +464,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -476,8 +476,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -488,10 +488,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -501,9 +501,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -514,9 +514,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -527,9 +527,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -540,9 +540,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -553,8 +553,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -564,9 +564,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -577,8 +577,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -588,8 +588,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -599,8 +599,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -611,9 +611,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -716,8 +716,8 @@ { "required": true, "schema": { - "title": "Entry Id", - "type": "string" + "type": "string", + "title": "Entry Id" }, "name": "entry_id", "in": "path" @@ -726,8 +726,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -738,10 +738,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -751,9 +751,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -764,8 +764,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -776,9 +776,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -882,8 +882,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -894,8 +894,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -906,10 +906,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -919,9 +919,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -932,9 +932,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -945,9 +945,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -958,9 +958,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -971,8 +971,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -982,9 +982,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -995,8 +995,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -1006,8 +1006,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -1017,8 +1017,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -1029,9 +1029,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -1134,8 +1134,8 @@ { "required": true, "schema": { - "title": "Entry Id", - "type": "string" + "type": "string", + "title": "Entry Id" }, "name": "entry_id", "in": "path" @@ -1144,8 +1144,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -1156,10 +1156,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -1169,9 +1169,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -1182,8 +1182,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -1194,9 +1194,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -1314,76 +1314,70 @@ "components": { "schemas": { "Aggregate": { - "title": "Aggregate", "enum": [ "ok", "test", "staging", "no" ], + "title": "Aggregate", "description": "Enumeration of aggregate values" }, "Assembly": { - "title": "Assembly", - "required": [ - "sites_in_groups", - "group_probabilities" - ], - "type": "object", "properties": { "sites_in_groups": { - "title": "Sites In Groups", - "type": "array", "items": { - "type": "array", "items": { "type": "integer" - } + }, + "type": "array" }, + "type": "array", + "title": "Sites In Groups", "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "group_probabilities": { - "title": "Group Probabilities", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Group Probabilities", "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", "x-optimade-support": "must", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "sites_in_groups", + "group_probabilities" + ], + "title": "Assembly", "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." }, "Attributes": { - "title": "Attributes", - "type": "object", "properties": {}, + "type": "object", + "title": "Attributes", "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.\nThe keys for Attributes MUST NOT be:\n relationships\n links\n id\n type" }, "AvailableApiVersion": { - "title": "AvailableApiVersion", - "required": [ - "url", - "version" - ], - "type": "object", "properties": { "url": { - "title": "Url", + "type": "string", "maxLength": 65536, "minLength": 1, "pattern": ".+/v[0-1](\\.[0-9]+)*/?$", - "type": "string", - "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL", - "format": "uri" + "format": "uri", + "title": "Url", + "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL" }, "version": { - "title": "Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Version", "description": "A string containing the full version number of the API served at that versioned base URL.\nThe version number string MUST NOT be prefixed by, e.g., 'v'.\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -1392,22 +1386,20 @@ ] } }, + "type": "object", + "required": [ + "url", + "version" + ], + "title": "AvailableApiVersion", "description": "A JSON object containing information about an available API version" }, "BaseInfoAttributes": { - "title": "BaseInfoAttributes", - "required": [ - "api_version", - "available_api_versions", - "available_endpoints", - "entry_types_by_format" - ], - "type": "object", "properties": { "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -1416,153 +1408,160 @@ ] }, "available_api_versions": { - "title": "Available Api Versions", - "type": "array", "items": { "$ref": "#/components/schemas/AvailableApiVersion" }, + "type": "array", + "title": "Available Api Versions", "description": "A list of dictionaries of available API versions at other base URLs" }, "formats": { - "title": "Formats", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Formats", "description": "List of available output formats.", "default": [ "json" ] }, "available_endpoints": { - "title": "Available Endpoints", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Available Endpoints", "description": "List of available endpoints (i.e., the string to be appended to the versioned base URL)." }, "entry_types_by_format": { - "title": "Entry Types By Format", - "type": "object", "additionalProperties": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, + "type": "object", + "title": "Entry Types By Format", "description": "Available entry endpoints as a function of output formats." }, "is_index": { - "title": "Is Index", "type": "boolean", + "title": "Is Index", "description": "If true, this is an index meta-database base URL (see section Index Meta-Database). If this member is not provided, the client MUST assume this is not an index meta-database base URL (i.e., the default is for `is_index` to be `false`).", "default": false } }, + "type": "object", + "required": [ + "api_version", + "available_api_versions", + "available_endpoints", + "entry_types_by_format" + ], + "title": "BaseInfoAttributes", "description": "Attributes for Base URL Info endpoint" }, "BaseInfoResource": { - "title": "BaseInfoResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", - "pattern": "^/$", "type": "string", + "pattern": "^/$", + "title": "Id", "default": "/" }, "type": { - "title": "Type", - "pattern": "^info$", "type": "string", + "pattern": "^info$", + "title": "Type", "default": "info" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { "$ref": "#/components/schemas/BaseInfoAttributes" }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/Relationships" } ], + "title": "Relationships", "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "BaseInfoResource", "description": "Resource objects appear in a JSON API document to represent resources." }, "BaseRelationshipMeta": { - "title": "BaseRelationshipMeta", - "required": [ - "description" - ], - "type": "object", "properties": { "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "OPTIONAL human-readable description of the relationship." } }, + "type": "object", + "required": [ + "description" + ], + "title": "BaseRelationshipMeta", "description": "Specific meta field for base relationship resource" }, "BaseRelationshipResource": { - "title": "BaseRelationshipResource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/BaseRelationshipMeta" } ], + "title": "Meta", "description": "Relationship meta field. MUST contain 'description' if supplied." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "BaseRelationshipResource", "description": "Minimum requirements to represent a relationship resource" }, "DataType": { - "title": "DataType", "enum": [ "string", "integer", @@ -1573,1439 +1572,1433 @@ "dictionary", "unknown" ], + "title": "DataType", "description": "Optimade Data Types\n\nSee the section \"Data types\" in the OPTIMADE API specification for more information." }, "EntryInfoProperty": { - "title": "EntryInfoProperty", - "required": [ - "description" - ], - "type": "object", "properties": { "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "A human-readable description of the entry property" }, "unit": { - "title": "Unit", "type": "string", + "title": "Unit", "description": "The physical unit of the entry property.\nThis MUST be a valid representation of units according to version 2.1 of [The Unified Code for Units of Measure](https://unitsofmeasure.org/ucum.html).\nIt is RECOMMENDED that non-standard (non-SI) units are described in the description for the property." }, "sortable": { - "title": "Sortable", "type": "boolean", + "title": "Sortable", "description": "Defines whether the entry property can be used for sorting with the \"sort\" parameter.\nIf the entry listing endpoint supports sorting, this key MUST be present for sortable properties with value `true`." }, "type": { - "title": "Type", "allOf": [ { "$ref": "#/components/schemas/DataType" } ], + "title": "Type", "description": "The type of the property's value.\nThis MUST be any of the types defined in the Data types section.\nFor the purpose of compatibility with future versions of this specification, a client MUST accept values that are not `string` values specifying any of the OPTIMADE Data types, but MUST then also disregard the `type` field.\nNote, if the value is a nested type, only the outermost type should be reported.\nE.g., for the entry resource `structures`, the `species` property is defined as a list of dictionaries, hence its `type` value would be `list`." } - } - }, - "EntryInfoResource": { - "title": "EntryInfoResource", + }, + "type": "object", "required": [ - "formats", - "description", - "properties", - "output_fields_by_format" + "description" ], - "type": "object", + "title": "EntryInfoProperty" + }, + "EntryInfoResource": { "properties": { "formats": { - "title": "Formats", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Formats", "description": "List of output formats available for this type of entry." }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "Description of the entry." }, "properties": { - "title": "Properties", - "type": "object", "additionalProperties": { "$ref": "#/components/schemas/EntryInfoProperty" }, + "type": "object", + "title": "Properties", "description": "A dictionary describing queryable properties for this entry type, where each key is a property name." }, "output_fields_by_format": { - "title": "Output Fields By Format", - "type": "object", "additionalProperties": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, + "type": "object", + "title": "Output Fields By Format", "description": "Dictionary of available output fields for this entry type, where the keys are the values of the `formats` list and the values are the keys of the `properties` dictionary." } - } - }, - "EntryInfoResponse": { - "title": "EntryInfoResponse", + }, + "type": "object", "required": [ - "data", - "meta" + "formats", + "description", + "properties", + "output_fields_by_format" ], - "type": "object", + "title": "EntryInfoResource" + }, + "EntryInfoResponse": { "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/EntryInfoResource" } ], + "title": "Data", "description": "OPTIMADE information for an entry endpoint." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "EntryInfoResponse", "description": "errors are not allowed" }, "EntryMetadata": { - "title": "EntryMetadata", - "type": "object", "properties": { "property_metadata": { - "title": "Property Metadata", "type": "object", + "title": "Property Metadata", "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." } }, + "type": "object", + "title": "EntryMetadata", "description": "Contains the metadata for the attributes of an entry" }, "EntryRelationships": { - "title": "EntryRelationships", - "type": "object", "properties": { "references": { - "title": "References", "allOf": [ { "$ref": "#/components/schemas/ReferenceRelationship" } ], + "title": "References", "description": "Object containing links to relationships with entries of the `references` type." }, "structures": { - "title": "Structures", "allOf": [ { "$ref": "#/components/schemas/StructureRelationship" } ], + "title": "Structures", "description": "Object containing links to relationships with entries of the `structures` type." } }, + "type": "object", + "title": "EntryRelationships", "description": "This model wraps the JSON API Relationships to include type-specific top level keys." }, "EntryResource": { - "title": "EntryResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/EntryResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary, containing key-value pairs representing the entry's properties, except for `type` and `id`.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "EntryResource", "description": "The base model for an entry resource." }, "EntryResourceAttributes": { - "title": "EntryResourceAttributes", - "required": [ - "last_modified" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", "x-optimade-queryable": "must" } }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "EntryResourceAttributes", "description": "Contains key-value pairs representing the entry's properties." }, "Error": { - "title": "Error", - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "title": "Error", "description": "An error response" }, "ErrorLinks": { - "title": "ErrorLinks", - "type": "object", "properties": { "about": { - "title": "About", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "About", "description": "A link that leads to further details about this particular occurrence of the problem." } }, + "type": "object", + "title": "ErrorLinks", "description": "A Links object specific to Error objects" }, "ErrorResponse": { - "title": "ErrorResponse", - "required": [ - "meta", - "errors" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/Resource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/Resource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Outputted Data" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information." }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/OptimadeError" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of OPTIMADE-specific JSON API error objects, where the field detail MUST be present." }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "meta", + "errors" + ], + "title": "ErrorResponse", "description": "errors MUST be present and data MUST be skipped" }, "ErrorSource": { - "title": "ErrorSource", - "type": "object", "properties": { "pointer": { - "title": "Pointer", "type": "string", + "title": "Pointer", "description": "a JSON Pointer [RFC6901] to the associated entity in the request document [e.g. \"/data\" for a primary data object, or \"/data/attributes/title\" for a specific attribute]." }, "parameter": { - "title": "Parameter", "type": "string", + "title": "Parameter", "description": "a string indicating which URI query parameter caused the error." } }, + "type": "object", + "title": "ErrorSource", "description": "an object containing references to the source of the error" }, "Implementation": { - "title": "Implementation", - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "name of the implementation" }, "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "version string of the current implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the homepage of the implementation." }, "source_url": { - "title": "Source Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Source Url", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation source, either downloadable archive or version control system." }, "maintainer": { - "title": "Maintainer", "allOf": [ { "$ref": "#/components/schemas/ImplementationMaintainer" } ], + "title": "Maintainer", "description": "A dictionary providing details about the maintainer of the implementation." }, "issue_tracker": { - "title": "Issue Tracker", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Issue Tracker", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation's issue tracker." } }, + "type": "object", + "title": "Implementation", "description": "Information on the server implementation" }, "ImplementationMaintainer": { - "title": "ImplementationMaintainer", - "required": [ - "email" - ], - "type": "object", "properties": { "email": { - "title": "Email", "type": "string", - "description": "the maintainer's email address", - "format": "email" + "format": "email", + "title": "Email", + "description": "the maintainer's email address" } }, + "type": "object", + "required": [ + "email" + ], + "title": "ImplementationMaintainer", "description": "Details about the maintainer of the implementation" }, "InfoResponse": { - "title": "InfoResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/BaseInfoResource" } ], + "title": "Data", "description": "The implementations /info data." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "InfoResponse", "description": "errors are not allowed" }, "JsonApi": { - "title": "JsonApi", - "type": "object", "properties": { "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "Version of the json API used", "default": "1.0" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "Non-standard meta information" } }, + "type": "object", + "title": "JsonApi", "description": "An object describing the server's implementation" }, "Link": { - "title": "Link", - "required": [ - "href" - ], - "type": "object", "properties": { "href": { - "title": "Href", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "a string containing the link\u2019s URL.", - "format": "uri" + "format": "uri", + "title": "Href", + "description": "a string containing the link\u2019s URL." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the link." } }, + "type": "object", + "required": [ + "href" + ], + "title": "Link", "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object." }, "LinkType": { - "title": "LinkType", "enum": [ "child", "root", "external", "providers" ], + "title": "LinkType", "description": "Enumeration of link_type values" }, "LinksResource": { - "title": "LinksResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^links$", "type": "string", + "pattern": "^links$", + "title": "Type", "description": "These objects are described in detail in the section Links Endpoint", "default": "links" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/LinksResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary containing key-value pairs representing the Links resource's properties." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "LinksResource", "description": "A Links endpoint resource object" }, "LinksResourceAttributes": { - "title": "LinksResourceAttributes", - "required": [ - "name", - "description", - "base_url", - "homepage", - "link_type" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Human-readable name for the OPTIMADE API implementation, e.g., for use in clients to show the name to the end-user." }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "Human-readable description for the OPTIMADE API implementation, e.g., for use in clients to show a description to the end-user." }, "base_url": { - "title": "Base Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Base Url", "description": "JSON API links object, pointing to the base URL for this implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "JSON API links object, pointing to a homepage URL for this implementation" }, "link_type": { - "title": "Link Type", "allOf": [ { "$ref": "#/components/schemas/LinkType" } ], + "title": "Link Type", "description": "The type of the linked relation.\nMUST be one of these values: 'child', 'root', 'external', 'providers'." }, "aggregate": { - "title": "Aggregate", "allOf": [ { "$ref": "#/components/schemas/Aggregate" } ], + "title": "Aggregate", "description": "A string indicating whether a client that is following links to aggregate results from different OPTIMADE implementations should follow this link or not.\nThis flag SHOULD NOT be indicated for links where `link_type` is not `child`.\n\nIf not specified, clients MAY assume that the value is `ok`.\nIf specified, and the value is anything different than `ok`, the client MUST assume that the server is suggesting not to follow the link during aggregation by default (also if the value is not among the known ones, in case a future specification adds new accepted values).\n\nSpecific values indicate the reason why the server is providing the suggestion.\nA client MAY follow the link anyway if it has reason to do so (e.g., if the client is looking for all test databases, it MAY follow the links marked with `aggregate`=`test`).\n\nIf specified, it MUST be one of the values listed in section Link Aggregate Options.", "default": "ok" }, "no_aggregate_reason": { - "title": "No Aggregate Reason", "type": "string", + "title": "No Aggregate Reason", "description": "An OPTIONAL human-readable string indicating the reason for suggesting not to aggregate results following the link.\nIt SHOULD NOT be present if `aggregate`=`ok`." } }, + "type": "object", + "required": [ + "name", + "description", + "base_url", + "homepage", + "link_type" + ], + "title": "LinksResourceAttributes", "description": "Links endpoint resource object attributes" }, "LinksResponse": { - "title": "LinksResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/LinksResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE links resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "LinksResponse", "description": "errors are not allowed" }, "Meta": { - "title": "Meta", - "type": "object", "properties": {}, + "type": "object", + "title": "Meta", "description": "Non-standard meta-information that can not be represented as an attribute or relationship." }, "OptimadeError": { - "title": "OptimadeError", - "required": [ - "detail" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "required": [ + "detail" + ], + "title": "OptimadeError", "description": "detail MUST be present" }, "Periodicity": { - "title": "Periodicity", + "type": "integer", "enum": [ 0, 1 ], - "type": "integer", + "title": "Periodicity", "description": "Integer enumeration of dimension_types values" }, "Person": { - "title": "Person", - "required": [ - "name" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Full name of the person, REQUIRED.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "firstname": { - "title": "Firstname", "type": "string", + "title": "Firstname", "description": "First name of the person.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "lastname": { - "title": "Lastname", "type": "string", + "title": "Lastname", "description": "Last name of the person.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "name" + ], + "title": "Person", "description": "A person, i.e., an author, editor or other." }, "Provider": { - "title": "Provider", - "required": [ - "name", - "description", - "prefix" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "a short name for the database provider" }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "a longer description of the database provider" }, "prefix": { - "title": "Prefix", - "pattern": "^[a-z]([a-z]|[0-9]|_)*$", "type": "string", + "pattern": "^[a-z]([a-z]|[0-9]|_)*$", + "title": "Prefix", "description": "database-provider-specific prefix as found in section Database-Provider-Specific Namespace Prefixes." }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object." } }, + "type": "object", + "required": [ + "name", + "description", + "prefix" + ], + "title": "Provider", "description": "Information on the database provider of the implementation." }, "ReferenceRelationship": { - "title": "ReferenceRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "ReferenceRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "ReferenceResource": { - "title": "ReferenceResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^references$", "type": "string", + "pattern": "^references$", + "title": "Type", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "$ref": "#/components/schemas/ReferenceResourceAttributes" }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "ReferenceResource", "description": "The `references` entries describe bibliographic references.\n\nThe following properties are used to provide the bibliographic details:\n\n- **address**, **annote**, **booktitle**, **chapter**, **crossref**, **edition**, **howpublished**, **institution**, **journal**, **key**, **month**, **note**, **number**, **organization**, **pages**, **publisher**, **school**, **series**, **title**, **volume**, **year**: meanings of these properties match the [BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf), values are strings;\n- **bib_type**: type of the reference, corresponding to **type** property in the BibTeX specification, value is string;\n- **authors** and **editors**: lists of *person objects* which are dictionaries with the following keys:\n - **name**: Full name of the person, REQUIRED.\n - **firstname**, **lastname**: Parts of the person's name, OPTIONAL.\n- **doi** and **url**: values are strings.\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., any of the properties MAY be `null`.\n - **Query**: Support for queries on any of these properties is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Every references entry MUST contain at least one of the properties." }, "ReferenceResourceAttributes": { - "title": "ReferenceResourceAttributes", - "required": [ - "last_modified" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", "x-optimade-queryable": "must" }, "authors": { - "title": "Authors", - "type": "array", "items": { "$ref": "#/components/schemas/Person" }, + "type": "array", + "title": "Authors", "description": "List of person objects containing the authors of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "editors": { - "title": "Editors", - "type": "array", "items": { "$ref": "#/components/schemas/Person" }, + "type": "array", + "title": "Editors", "description": "List of person objects containing the editors of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "doi": { - "title": "Doi", "type": "string", + "title": "Doi", "description": "The digital object identifier of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "url": { - "title": "Url", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "The URL of the reference.", "format": "uri", + "title": "Url", + "description": "The URL of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "address": { - "title": "Address", "type": "string", + "title": "Address", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "annote": { - "title": "Annote", "type": "string", + "title": "Annote", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "booktitle": { - "title": "Booktitle", "type": "string", + "title": "Booktitle", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "chapter": { - "title": "Chapter", "type": "string", + "title": "Chapter", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "crossref": { - "title": "Crossref", "type": "string", + "title": "Crossref", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "edition": { - "title": "Edition", "type": "string", + "title": "Edition", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "howpublished": { - "title": "Howpublished", "type": "string", + "title": "Howpublished", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "institution": { - "title": "Institution", "type": "string", + "title": "Institution", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "journal": { - "title": "Journal", "type": "string", + "title": "Journal", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "key": { - "title": "Key", "type": "string", + "title": "Key", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "month": { - "title": "Month", "type": "string", + "title": "Month", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "note": { - "title": "Note", "type": "string", + "title": "Note", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "number": { - "title": "Number", "type": "string", + "title": "Number", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "organization": { - "title": "Organization", "type": "string", + "title": "Organization", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "pages": { - "title": "Pages", "type": "string", + "title": "Pages", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "publisher": { - "title": "Publisher", "type": "string", + "title": "Publisher", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "school": { - "title": "School", "type": "string", + "title": "School", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "series": { - "title": "Series", "type": "string", + "title": "Series", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "bib_type": { - "title": "Bib Type", "type": "string", + "title": "Bib Type", "description": "Type of the reference, corresponding to the **type** property in the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "volume": { - "title": "Volume", "type": "string", + "title": "Volume", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "year": { - "title": "Year", "type": "string", + "title": "Year", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "ReferenceResourceAttributes", "description": "Model that stores the attributes of a reference.\n\nMany properties match the meaning described in the\n[BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf)." }, "ReferenceResponseMany": { - "title": "ReferenceResponseMany", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/ReferenceResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE references entry resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, - "description": "errors are not allowed" - }, - "ReferenceResponseOne": { - "title": "ReferenceResponseOne", + "type": "object", "required": [ "data", "meta" ], - "type": "object", + "title": "ReferenceResponseMany", + "description": "errors are not allowed" + }, + "ReferenceResponseOne": { "properties": { "data": { - "title": "Data", "anyOf": [ { "$ref": "#/components/schemas/ReferenceResource" @@ -3014,209 +3007,209 @@ "type": "object" } ], + "title": "Data", "description": "A single references entry resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "ReferenceResponseOne", "description": "errors are not allowed" }, "RelationshipLinks": { - "title": "RelationshipLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link for the relationship itself (a 'relationship link').\nThis link allows the client to directly manipulate the relationship.\nWhen fetched successfully, this link returns the [linkage](https://jsonapi.org/format/1.0/#document-resource-object-linkage) for the related resources as its primary data.\n(See [Fetching Relationships](https://jsonapi.org/format/1.0/#fetching-relationships).)" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A [related resource link](https://jsonapi.org/format/1.0/#document-resource-object-related-resource-links)." } }, + "type": "object", + "title": "RelationshipLinks", "description": "A resource object **MAY** contain references to other resource objects (\"relationships\").\nRelationships may be to-one or to-many.\nRelationships can be specified by including a member in a resource's links object." }, "Relationships": { - "title": "Relationships", - "type": "object", "properties": {}, + "type": "object", + "title": "Relationships", "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.\nKeys MUST NOT be:\n type\n id" }, "Resource": { - "title": "Resource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/Attributes" } ], + "title": "Attributes", "description": "an attributes object representing some of the resource\u2019s data." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/Relationships" } ], + "title": "Relationships", "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "Resource", "description": "Resource objects appear in a JSON API document to represent resources." }, "ResourceLinks": { - "title": "ResourceLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link that identifies the resource represented by the resource object." } }, + "type": "object", + "title": "ResourceLinks", "description": "A Resource Links object" }, "ResponseMeta": { - "title": "ResponseMeta", - "required": [ - "query", - "api_version", - "more_data_available" - ], - "type": "object", "properties": { "query": { - "title": "Query", "allOf": [ { "$ref": "#/components/schemas/ResponseMetaQuery" } ], + "title": "Query", "description": "Information on the Query that was requested" }, "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -3225,588 +3218,588 @@ ] }, "more_data_available": { - "title": "More Data Available", "type": "boolean", + "title": "More Data Available", "description": "`false` if the response contains all data for the request (e.g., a request issued to a single entry endpoint, or a `filter` query at the last page of a paginated response) and `true` if the response is incomplete in the sense that multiple objects match the request, and not all of them have been included in the response (e.g., a query with multiple pages that is not at the last page)." }, "schema": { - "title": "Schema", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Schema", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) that points to a schema for the response.\nIf it is a string, or a dictionary containing no `meta` field, the provided URL MUST point at an [OpenAPI](https://swagger.io/specification/) schema.\nIt is possible that future versions of this specification allows for alternative schema types.\nHence, if the `meta` field of the JSON API links object is provided and contains a field `schema_type` that is not equal to the string `OpenAPI` the client MUST not handle failures to parse the schema or to validate the response against the schema as errors." }, "time_stamp": { - "title": "Time Stamp", "type": "string", - "description": "A timestamp containing the date and time at which the query was executed.", - "format": "date-time" + "format": "date-time", + "title": "Time Stamp", + "description": "A timestamp containing the date and time at which the query was executed." }, "data_returned": { - "title": "Data Returned", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Data Returned", "description": "An integer containing the total number of data resource objects returned for the current `filter` query, independent of pagination." }, "provider": { - "title": "Provider", "allOf": [ { "$ref": "#/components/schemas/Provider" } ], + "title": "Provider", "description": "information on the database provider of the implementation." }, "data_available": { - "title": "Data Available", "type": "integer", + "title": "Data Available", "description": "An integer containing the total number of data resource objects available in the database for the endpoint." }, "last_id": { - "title": "Last Id", "type": "string", + "title": "Last Id", "description": "a string containing the last ID returned" }, "response_message": { - "title": "Response Message", "type": "string", + "title": "Response Message", "description": "response string from the server" }, "implementation": { - "title": "Implementation", "allOf": [ { "$ref": "#/components/schemas/Implementation" } ], + "title": "Implementation", "description": "a dictionary describing the server implementation" }, "warnings": { - "title": "Warnings", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Warnings" }, + "type": "array", + "uniqueItems": true, + "title": "Warnings", "description": "A list of warning resource objects representing non-critical errors or warnings.\nA warning resource object is defined similarly to a [JSON API error object](http://jsonapi.org/format/1.0/#error-objects), but MUST also include the field `type`, which MUST have the value `\"warning\"`.\nThe field `detail` MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\nThe field `status`, representing a HTTP response status code, MUST NOT be present for a warning resource object.\nThis is an exclusive field for error resource objects." } }, + "type": "object", + "required": [ + "query", + "api_version", + "more_data_available" + ], + "title": "ResponseMeta", "description": "A [JSON API meta member](https://jsonapi.org/format/1.0#document-meta)\nthat contains JSON API meta objects of non-standard\nmeta-information.\n\nOPTIONAL additional information global to the query that is not\nspecified in this document, MUST start with a\ndatabase-provider-specific prefix." }, "ResponseMetaQuery": { - "title": "ResponseMetaQuery", - "required": [ - "representation" - ], - "type": "object", "properties": { "representation": { - "title": "Representation", "type": "string", + "title": "Representation", "description": "A string with the part of the URL following the versioned or unversioned base URL that serves the API.\nQuery parameters that have not been used in processing the request MAY be omitted.\nIn particular, if no query parameters have been involved in processing the request, the query part of the URL MAY be excluded.\nExample: `/structures?filter=nelements=2`" } }, + "type": "object", + "required": [ + "representation" + ], + "title": "ResponseMetaQuery", "description": "Information on the query that was requested." }, "Species": { - "title": "Species", - "required": [ - "name", - "chemical_symbols", - "concentration" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Gives the name of the species; the **name** value MUST be unique in the `species` list.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "chemical_symbols": { - "title": "Chemical Symbols", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Chemical Symbols", "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "concentration": { - "title": "Concentration", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Concentration", "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "mass": { - "title": "Mass", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Mass", "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", + "x-optimade-unit": "a.m.u.", "x-optimade-support": "optional", - "x-optimade-queryable": "optional", - "x-optimade-unit": "a.m.u." + "x-optimade-queryable": "optional" }, "original_name": { - "title": "Original Name", "type": "string", + "title": "Original Name", "description": "Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\nNote: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "attached": { - "title": "Attached", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Attached", "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "nattached": { - "title": "Nattached", - "type": "array", "items": { "type": "integer" }, + "type": "array", + "title": "Nattached", "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "name", + "chemical_symbols", + "concentration" + ], + "title": "Species", "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." }, "StructureFeatures": { - "title": "StructureFeatures", "enum": [ "disorder", "implicit_atoms", "site_attachments", "assemblies" ], + "title": "StructureFeatures", "description": "Enumeration of structure_features values" }, "StructureRelationship": { - "title": "StructureRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "StructureRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "StructureResource": { - "title": "StructureResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^structures$", "type": "string", + "pattern": "^structures$", + "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "$ref": "#/components/schemas/StructureResourceAttributes" }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "StructureResource", "description": "Representing a structure." }, "StructureResourceAttributes": { - "title": "StructureResourceAttributes", - "required": [ - "last_modified", - "elements", - "nelements", - "elements_ratios", - "chemical_formula_descriptive", - "chemical_formula_reduced", - "chemical_formula_anonymous", - "dimension_types", - "nperiodic_dimensions", - "lattice_vectors", - "cartesian_site_positions", - "nsites", - "species", - "species_at_sites", - "structure_features" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", - "nullable": true, + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "elements": { - "title": "Elements", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Elements", "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "nelements": { - "title": "Nelements", "type": "integer", + "title": "Nelements", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "elements_ratios": { - "title": "Elements Ratios", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Elements Ratios", "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "chemical_formula_descriptive": { - "title": "Chemical Formula Descriptive", "type": "string", + "title": "Chemical Formula Descriptive", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "chemical_formula_reduced": { - "title": "Chemical Formula Reduced", - "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Reduced", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "chemical_formula_hill": { - "title": "Chemical Formula Hill", - "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Hill", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "chemical_formula_anonymous": { - "title": "Chemical Formula Anonymous", - "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Anonymous", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "dimension_types": { - "title": "Dimension Types", - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { "$ref": "#/components/schemas/Periodicity" }, + "type": "array", + "maxItems": 3, + "minItems": 3, + "title": "Dimension Types", "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "optional" }, "nperiodic_dimensions": { - "title": "Nperiodic Dimensions", "type": "integer", + "title": "Nperiodic Dimensions", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "lattice_vectors": { - "title": "Lattice Vectors", - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { "type": "number" - } + }, + "type": "array", + "maxItems": 3, + "minItems": 3 }, + "type": "array", + "maxItems": 3, + "minItems": 3, + "title": "Lattice Vectors", "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", - "nullable": true, "x-optimade-unit": "\u00c5", "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "optional" }, "cartesian_site_positions": { - "title": "Cartesian Site Positions", - "type": "array", "items": { - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { "type": "number" - } + }, + "type": "array", + "maxItems": 3, + "minItems": 3 }, + "type": "array", + "title": "Cartesian Site Positions", "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", - "nullable": true, "x-optimade-unit": "\u00c5", "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "nullable": true }, "nsites": { - "title": "Nsites", "type": "integer", + "title": "Nsites", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "species": { - "title": "Species", - "type": "array", "items": { "$ref": "#/components/schemas/Species" }, + "type": "array", + "title": "Species", "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "optional" }, "species_at_sites": { - "title": "Species At Sites", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Species At Sites", "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "optional" }, "assemblies": { - "title": "Assemblies", - "type": "array", "items": { "$ref": "#/components/schemas/Assembly" }, + "type": "array", + "title": "Assemblies", "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "structure_features": { - "title": "Structure Features", - "type": "array", "items": { "$ref": "#/components/schemas/StructureFeatures" }, + "type": "array", + "title": "Structure Features", "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", "x-optimade-support": "must", "x-optimade-queryable": "must" } }, + "type": "object", + "required": [ + "last_modified", + "elements", + "nelements", + "elements_ratios", + "chemical_formula_descriptive", + "chemical_formula_reduced", + "chemical_formula_anonymous", + "dimension_types", + "nperiodic_dimensions", + "lattice_vectors", + "cartesian_site_positions", + "nsites", + "species", + "species_at_sites", + "structure_features" + ], + "title": "StructureResourceAttributes", "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." }, "StructureResponseMany": { - "title": "StructureResponseMany", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/StructureResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE structures entry resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, - "description": "errors are not allowed" - }, - "StructureResponseOne": { - "title": "StructureResponseOne", + "type": "object", "required": [ "data", "meta" ], - "type": "object", + "title": "StructureResponseMany", + "description": "errors are not allowed" + }, + "StructureResponseOne": { "properties": { "data": { - "title": "Data", "anyOf": [ { "$ref": "#/components/schemas/StructureResource" @@ -3815,225 +3808,232 @@ "type": "object" } ], + "title": "Data", "description": "A single structures entry resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "StructureResponseOne", "description": "errors are not allowed" }, "ToplevelLinks": { - "title": "ToplevelLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link to itself" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A related resource link" }, "first": { - "title": "First", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "First", "description": "The first page of data" }, "last": { - "title": "Last", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Last", "description": "The last page of data" }, "prev": { - "title": "Prev", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Prev", "description": "The previous page of data" }, "next": { - "title": "Next", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Next", "description": "The next page of data" } }, + "type": "object", + "title": "ToplevelLinks", "description": "A set of Links objects, possibly including pagination" }, "Warnings": { - "title": "Warnings", - "required": [ - "detail", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." }, "type": { - "title": "Type", - "pattern": "^warning$", "type": "string", + "pattern": "^warning$", + "title": "Type", "description": "Warnings must be of type \"warning\"", "default": "warning" } }, + "type": "object", + "required": [ + "detail", + "type" + ], + "title": "Warnings", "description": "OPTIMADE-specific warning class based on OPTIMADE-specific JSON API Error.\n\nFrom the specification:\n\nA warning resource object is defined similarly to a JSON API error object, but MUST also include the field type, which MUST have the value \"warning\".\nThe field detail MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\n\nNote: Must be named \"Warnings\", since \"Warning\" is a built-in Python class." } } From 7a75366befacb06356c7f9cab16368765969b84f Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:56:22 +0200 Subject: [PATCH 64/95] changed 'regex' to 'pattern'. --- openapi/index_openapi.json | 840 ++++++++-------- openapi/openapi.json | 1592 +++++++++++++++---------------- optimade/server/query_params.py | 4 +- 3 files changed, 1218 insertions(+), 1218 deletions(-) diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index 4c7dea0af..45b32228c 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.2", + "openapi": "3.1.0", "info": { "title": "OPTIMADE API - Index meta-database", "description": "The [Open Databases Integration for Materials Design (OPTIMADE) consortium](https://www.optimade.org/) aims to make materials databases interoperational by developing a common REST API.\nThis is the \"special\" index meta-database.\n\nThis specification is generated using [`optimade-python-tools`](https://github.com/Materials-Consortia/optimade-python-tools/tree/v0.25.2) v0.25.2.", @@ -109,8 +109,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -121,8 +121,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -133,10 +133,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -146,9 +146,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -159,9 +159,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -172,9 +172,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -185,9 +185,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -198,8 +198,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -209,9 +209,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -222,8 +222,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -233,8 +233,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -244,8 +244,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -256,9 +256,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -376,42 +376,36 @@ "components": { "schemas": { "Aggregate": { - "title": "Aggregate", "enum": [ "ok", "test", "staging", "no" ], + "title": "Aggregate", "description": "Enumeration of aggregate values" }, "Attributes": { - "title": "Attributes", - "type": "object", "properties": {}, + "type": "object", + "title": "Attributes", "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.\nThe keys for Attributes MUST NOT be:\n relationships\n links\n id\n type" }, "AvailableApiVersion": { - "title": "AvailableApiVersion", - "required": [ - "url", - "version" - ], - "type": "object", "properties": { "url": { - "title": "Url", + "type": "string", "maxLength": 65536, "minLength": 1, "pattern": ".+/v[0-1](\\.[0-9]+)*/?$", - "type": "string", - "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL", - "format": "uri" + "format": "uri", + "title": "Url", + "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL" }, "version": { - "title": "Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Version", "description": "A string containing the full version number of the API served at that versioned base URL.\nThe version number string MUST NOT be prefixed by, e.g., 'v'.\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -420,459 +414,457 @@ ] } }, + "type": "object", + "required": [ + "url", + "version" + ], + "title": "AvailableApiVersion", "description": "A JSON object containing information about an available API version" }, "BaseRelationshipMeta": { - "title": "BaseRelationshipMeta", - "required": [ - "description" - ], - "type": "object", "properties": { "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "OPTIONAL human-readable description of the relationship." } }, + "type": "object", + "required": [ + "description" + ], + "title": "BaseRelationshipMeta", "description": "Specific meta field for base relationship resource" }, "BaseRelationshipResource": { - "title": "BaseRelationshipResource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/BaseRelationshipMeta" } ], + "title": "Meta", "description": "Relationship meta field. MUST contain 'description' if supplied." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "BaseRelationshipResource", "description": "Minimum requirements to represent a relationship resource" }, "EntryMetadata": { - "title": "EntryMetadata", - "type": "object", "properties": { "property_metadata": { - "title": "Property Metadata", "type": "object", + "title": "Property Metadata", "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." }, "partial_data_links": { - "title": "Partial Data Links", - "type": "object", "additionalProperties": { - "type": "array", "items": { "$ref": "#/components/schemas/PartialDataLink" - } + }, + "type": "array" }, + "type": "object", + "title": "Partial Data Links", "description": "A dictionary, where the keys are the names of the properties in the attributes field for which the value is too large to be shared by default.\n For each property one or more links are provided from which the value of the attribute can be retrieved." } }, + "type": "object", + "title": "EntryMetadata", "description": "Contains the metadata for the attributes of an entry" }, "EntryRelationships": { - "title": "EntryRelationships", - "type": "object", "properties": { "references": { - "title": "References", "allOf": [ { "$ref": "#/components/schemas/ReferenceRelationship" } ], + "title": "References", "description": "Object containing links to relationships with entries of the `references` type." }, "structures": { - "title": "Structures", "allOf": [ { "$ref": "#/components/schemas/StructureRelationship" } ], + "title": "Structures", "description": "Object containing links to relationships with entries of the `structures` type." } }, + "type": "object", + "title": "EntryRelationships", "description": "This model wraps the JSON API Relationships to include type-specific top level keys." }, "EntryResource": { - "title": "EntryResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/EntryResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary, containing key-value pairs representing the entry's properties, except for `type` and `id`.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "EntryResource", "description": "The base model for an entry resource." }, "EntryResourceAttributes": { - "title": "EntryResourceAttributes", - "required": [ - "last_modified" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", "x-optimade-queryable": "must" } }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "EntryResourceAttributes", "description": "Contains key-value pairs representing the entry's properties." }, "Error": { - "title": "Error", - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "title": "Error", "description": "An error response" }, "ErrorLinks": { - "title": "ErrorLinks", - "type": "object", "properties": { "about": { - "title": "About", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "About", "description": "A link that leads to further details about this particular occurrence of the problem." } }, + "type": "object", + "title": "ErrorLinks", "description": "A Links object specific to Error objects" }, "ErrorResponse": { - "title": "ErrorResponse", - "required": [ - "meta", - "errors" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/Resource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/Resource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Outputted Data" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information." }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/OptimadeError" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of OPTIMADE-specific JSON API error objects, where the field detail MUST be present." }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "meta", + "errors" + ], + "title": "ErrorResponse", "description": "errors MUST be present and data MUST be skipped" }, "ErrorSource": { - "title": "ErrorSource", - "type": "object", "properties": { "pointer": { - "title": "Pointer", "type": "string", + "title": "Pointer", "description": "a JSON Pointer [RFC6901] to the associated entity in the request document [e.g. \"/data\" for a primary data object, or \"/data/attributes/title\" for a specific attribute]." }, "parameter": { - "title": "Parameter", "type": "string", + "title": "Parameter", "description": "a string indicating which URI query parameter caused the error." } }, + "type": "object", + "title": "ErrorSource", "description": "an object containing references to the source of the error" }, "Implementation": { - "title": "Implementation", - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "name of the implementation" }, "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "version string of the current implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the homepage of the implementation." }, "source_url": { - "title": "Source Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Source Url", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation source, either downloadable archive or version control system." }, "maintainer": { - "title": "Maintainer", "allOf": [ { "$ref": "#/components/schemas/ImplementationMaintainer" } ], + "title": "Maintainer", "description": "A dictionary providing details about the maintainer of the implementation." }, "issue_tracker": { - "title": "Issue Tracker", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Issue Tracker", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation's issue tracker." } }, + "type": "object", + "title": "Implementation", "description": "Information on the server implementation" }, "ImplementationMaintainer": { - "title": "ImplementationMaintainer", - "required": [ - "email" - ], - "type": "object", "properties": { "email": { - "title": "Email", "type": "string", - "description": "the maintainer's email address", - "format": "email" + "format": "email", + "title": "Email", + "description": "the maintainer's email address" } }, + "type": "object", + "required": [ + "email" + ], + "title": "ImplementationMaintainer", "description": "Details about the maintainer of the implementation" }, "IndexInfoAttributes": { - "title": "IndexInfoAttributes", - "required": [ - "api_version", - "available_api_versions", - "available_endpoints", - "entry_types_by_format" - ], - "type": "object", "properties": { "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -881,814 +873,815 @@ ] }, "available_api_versions": { - "title": "Available Api Versions", - "type": "array", "items": { "$ref": "#/components/schemas/AvailableApiVersion" }, + "type": "array", + "title": "Available Api Versions", "description": "A list of dictionaries of available API versions at other base URLs" }, "formats": { - "title": "Formats", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Formats", "description": "List of available output formats.", "default": [ "json" ] }, "available_endpoints": { - "title": "Available Endpoints", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Available Endpoints", "description": "List of available endpoints (i.e., the string to be appended to the versioned base URL)." }, "entry_types_by_format": { - "title": "Entry Types By Format", - "type": "object", "additionalProperties": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, + "type": "object", + "title": "Entry Types By Format", "description": "Available entry endpoints as a function of output formats." }, "is_index": { - "title": "Is Index", "type": "boolean", + "title": "Is Index", "description": "This must be `true` since this is an index meta-database (see section Index Meta-Database).", "default": true } }, + "type": "object", + "required": [ + "api_version", + "available_api_versions", + "available_endpoints", + "entry_types_by_format" + ], + "title": "IndexInfoAttributes", "description": "Attributes for Base URL Info endpoint for an Index Meta-Database" }, "IndexInfoResource": { - "title": "IndexInfoResource", - "required": [ - "id", - "type", - "attributes", - "relationships" - ], - "type": "object", "properties": { "id": { - "title": "Id", - "pattern": "^/$", "type": "string", + "pattern": "^/$", + "title": "Id", "default": "/" }, "type": { - "title": "Type", - "pattern": "^info$", "type": "string", + "pattern": "^info$", + "title": "Type", "default": "info" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { "$ref": "#/components/schemas/IndexInfoAttributes" }, "relationships": { - "title": "Relationships", - "type": "object", "additionalProperties": { "$ref": "#/components/schemas/IndexRelationship" }, + "type": "object", + "title": "Relationships", "description": "Reference to the Links identifier object under the `links` endpoint that the provider has chosen as their 'default' OPTIMADE API database.\nA client SHOULD present this database as the first choice when an end-user chooses this provider." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes", + "relationships" + ], + "title": "IndexInfoResource", "description": "Index Meta-Database Base URL Info endpoint resource" }, "IndexInfoResponse": { - "title": "IndexInfoResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/IndexInfoResource" } ], + "title": "Data", "description": "Index meta-database /info data." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "IndexInfoResponse", "description": "errors are not allowed" }, "IndexRelationship": { - "title": "IndexRelationship", - "required": [ - "data" - ], - "type": "object", "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/RelatedLinksResource" } ], + "title": "Data", "description": "[JSON API resource linkage](http://jsonapi.org/format/1.0/#document-links).\nIt MUST be either `null` or contain a single Links identifier object with the fields `id` and `type`" } }, + "type": "object", + "required": [ + "data" + ], + "title": "IndexRelationship", "description": "Index Meta-Database relationship" }, "JsonApi": { - "title": "JsonApi", - "type": "object", "properties": { "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "Version of the json API used", "default": "1.0" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "Non-standard meta information" } }, + "type": "object", + "title": "JsonApi", "description": "An object describing the server's implementation" }, "Link": { - "title": "Link", - "required": [ - "href" - ], - "type": "object", "properties": { "href": { - "title": "Href", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "a string containing the link\u2019s URL.", - "format": "uri" + "format": "uri", + "title": "Href", + "description": "a string containing the link\u2019s URL." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the link." } }, + "type": "object", + "required": [ + "href" + ], + "title": "Link", "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object." }, "LinkType": { - "title": "LinkType", "enum": [ "child", "root", "external", "providers" ], + "title": "LinkType", "description": "Enumeration of link_type values" }, "LinksResource": { - "title": "LinksResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^links$", "type": "string", + "pattern": "^links$", + "title": "Type", "description": "These objects are described in detail in the section Links Endpoint", "default": "links" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/LinksResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary containing key-value pairs representing the Links resource's properties." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "LinksResource", "description": "A Links endpoint resource object" }, "LinksResourceAttributes": { - "title": "LinksResourceAttributes", - "required": [ - "name", - "description", - "base_url", - "homepage", - "link_type" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Human-readable name for the OPTIMADE API implementation, e.g., for use in clients to show the name to the end-user." }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "Human-readable description for the OPTIMADE API implementation, e.g., for use in clients to show a description to the end-user." }, "base_url": { - "title": "Base Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Base Url", "description": "JSON API links object, pointing to the base URL for this implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "JSON API links object, pointing to a homepage URL for this implementation" }, "link_type": { - "title": "Link Type", "allOf": [ { "$ref": "#/components/schemas/LinkType" } ], + "title": "Link Type", "description": "The type of the linked relation.\nMUST be one of these values: 'child', 'root', 'external', 'providers'." }, "aggregate": { - "title": "Aggregate", "allOf": [ { "$ref": "#/components/schemas/Aggregate" } ], + "title": "Aggregate", "description": "A string indicating whether a client that is following links to aggregate results from different OPTIMADE implementations should follow this link or not.\nThis flag SHOULD NOT be indicated for links where `link_type` is not `child`.\n\nIf not specified, clients MAY assume that the value is `ok`.\nIf specified, and the value is anything different than `ok`, the client MUST assume that the server is suggesting not to follow the link during aggregation by default (also if the value is not among the known ones, in case a future specification adds new accepted values).\n\nSpecific values indicate the reason why the server is providing the suggestion.\nA client MAY follow the link anyway if it has reason to do so (e.g., if the client is looking for all test databases, it MAY follow the links marked with `aggregate`=`test`).\n\nIf specified, it MUST be one of the values listed in section Link Aggregate Options.", "default": "ok" }, "no_aggregate_reason": { - "title": "No Aggregate Reason", "type": "string", + "title": "No Aggregate Reason", "description": "An OPTIONAL human-readable string indicating the reason for suggesting not to aggregate results following the link.\nIt SHOULD NOT be present if `aggregate`=`ok`." } }, + "type": "object", + "required": [ + "name", + "description", + "base_url", + "homepage", + "link_type" + ], + "title": "LinksResourceAttributes", "description": "Links endpoint resource object attributes" }, "LinksResponse": { - "title": "LinksResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/LinksResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE links resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "LinksResponse", "description": "errors are not allowed" }, "Meta": { - "title": "Meta", - "type": "object", "properties": {}, + "type": "object", + "title": "Meta", "description": "Non-standard meta-information that can not be represented as an attribute or relationship." }, "OptimadeError": { - "title": "OptimadeError", - "required": [ - "detail" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "required": [ + "detail" + ], + "title": "OptimadeError", "description": "detail MUST be present" }, "PartialDataLink": { - "title": "PartialDataLink", - "required": [ - "link", - "format" - ], - "type": "object", "properties": { "link": { - "title": "Link", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", - "format": "uri" + "format": "uri", + "title": "Link", + "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL." }, "format": { - "title": "Format", "type": "string", + "title": "Format", "description": "String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value \"jsonlines\", which refers to the format in OPTIMADE JSON lines partial data format." } - } - }, - "Provider": { - "title": "Provider", + }, + "type": "object", "required": [ - "name", - "description", - "prefix" + "link", + "format" ], - "type": "object", + "title": "PartialDataLink" + }, + "Provider": { "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "a short name for the database provider" }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "a longer description of the database provider" }, "prefix": { - "title": "Prefix", - "pattern": "^[a-z]([a-z]|[0-9]|_)*$", "type": "string", + "pattern": "^[a-z]([a-z]|[0-9]|_)*$", + "title": "Prefix", "description": "database-provider-specific prefix as found in section Database-Provider-Specific Namespace Prefixes." }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object." } }, + "type": "object", + "required": [ + "name", + "description", + "prefix" + ], + "title": "Provider", "description": "Information on the database provider of the implementation." }, "ReferenceRelationship": { - "title": "ReferenceRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "ReferenceRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "RelatedLinksResource": { - "title": "RelatedLinksResource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", - "pattern": "^links$", "type": "string", + "pattern": "^links$", + "title": "Type", "default": "links" } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "RelatedLinksResource", "description": "A related Links resource object" }, "RelationshipLinks": { - "title": "RelationshipLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link for the relationship itself (a 'relationship link').\nThis link allows the client to directly manipulate the relationship.\nWhen fetched successfully, this link returns the [linkage](https://jsonapi.org/format/1.0/#document-resource-object-linkage) for the related resources as its primary data.\n(See [Fetching Relationships](https://jsonapi.org/format/1.0/#fetching-relationships).)" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A [related resource link](https://jsonapi.org/format/1.0/#document-resource-object-related-resource-links)." } }, + "type": "object", + "title": "RelationshipLinks", "description": "A resource object **MAY** contain references to other resource objects (\"relationships\").\nRelationships may be to-one or to-many.\nRelationships can be specified by including a member in a resource's links object." }, "Relationships": { - "title": "Relationships", - "type": "object", "properties": {}, + "type": "object", + "title": "Relationships", "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.\nKeys MUST NOT be:\n type\n id" }, "Resource": { - "title": "Resource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/Attributes" } ], + "title": "Attributes", "description": "an attributes object representing some of the resource\u2019s data." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/Relationships" } ], + "title": "Relationships", "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "Resource", "description": "Resource objects appear in a JSON API document to represent resources." }, "ResourceLinks": { - "title": "ResourceLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link that identifies the resource represented by the resource object." } }, + "type": "object", + "title": "ResourceLinks", "description": "A Resource Links object" }, "ResponseMeta": { - "title": "ResponseMeta", - "required": [ - "query", - "api_version", - "more_data_available" - ], - "type": "object", "properties": { "query": { - "title": "Query", "allOf": [ { "$ref": "#/components/schemas/ResponseMetaQuery" } ], + "title": "Query", "description": "Information on the Query that was requested" }, "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -1697,298 +1690,305 @@ ] }, "more_data_available": { - "title": "More Data Available", "type": "boolean", + "title": "More Data Available", "description": "`false` if the response contains all data for the request (e.g., a request issued to a single entry endpoint, or a `filter` query at the last page of a paginated response) and `true` if the response is incomplete in the sense that multiple objects match the request, and not all of them have been included in the response (e.g., a query with multiple pages that is not at the last page)." }, "schema": { - "title": "Schema", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Schema", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) that points to a schema for the response.\nIf it is a string, or a dictionary containing no `meta` field, the provided URL MUST point at an [OpenAPI](https://swagger.io/specification/) schema.\nIt is possible that future versions of this specification allows for alternative schema types.\nHence, if the `meta` field of the JSON API links object is provided and contains a field `schema_type` that is not equal to the string `OpenAPI` the client MUST not handle failures to parse the schema or to validate the response against the schema as errors." }, "time_stamp": { - "title": "Time Stamp", "type": "string", - "description": "A timestamp containing the date and time at which the query was executed.", - "format": "date-time" + "format": "date-time", + "title": "Time Stamp", + "description": "A timestamp containing the date and time at which the query was executed." }, "data_returned": { - "title": "Data Returned", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Data Returned", "description": "An integer containing the total number of data resource objects returned for the current `filter` query, independent of pagination." }, "provider": { - "title": "Provider", "allOf": [ { "$ref": "#/components/schemas/Provider" } ], + "title": "Provider", "description": "information on the database provider of the implementation." }, "data_available": { - "title": "Data Available", "type": "integer", + "title": "Data Available", "description": "An integer containing the total number of data resource objects available in the database for the endpoint." }, "last_id": { - "title": "Last Id", "type": "string", + "title": "Last Id", "description": "a string containing the last ID returned" }, "response_message": { - "title": "Response Message", "type": "string", + "title": "Response Message", "description": "response string from the server" }, "implementation": { - "title": "Implementation", "allOf": [ { "$ref": "#/components/schemas/Implementation" } ], + "title": "Implementation", "description": "a dictionary describing the server implementation" }, "warnings": { - "title": "Warnings", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Warnings" }, + "type": "array", + "uniqueItems": true, + "title": "Warnings", "description": "A list of warning resource objects representing non-critical errors or warnings.\nA warning resource object is defined similarly to a [JSON API error object](http://jsonapi.org/format/1.0/#error-objects), but MUST also include the field `type`, which MUST have the value `\"warning\"`.\nThe field `detail` MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\nThe field `status`, representing a HTTP response status code, MUST NOT be present for a warning resource object.\nThis is an exclusive field for error resource objects." } }, + "type": "object", + "required": [ + "query", + "api_version", + "more_data_available" + ], + "title": "ResponseMeta", "description": "A [JSON API meta member](https://jsonapi.org/format/1.0#document-meta)\nthat contains JSON API meta objects of non-standard\nmeta-information.\n\nOPTIONAL additional information global to the query that is not\nspecified in this document, MUST start with a\ndatabase-provider-specific prefix." }, "ResponseMetaQuery": { - "title": "ResponseMetaQuery", - "required": [ - "representation" - ], - "type": "object", "properties": { "representation": { - "title": "Representation", "type": "string", + "title": "Representation", "description": "A string with the part of the URL following the versioned or unversioned base URL that serves the API.\nQuery parameters that have not been used in processing the request MAY be omitted.\nIn particular, if no query parameters have been involved in processing the request, the query part of the URL MAY be excluded.\nExample: `/structures?filter=nelements=2`" } }, + "type": "object", + "required": [ + "representation" + ], + "title": "ResponseMetaQuery", "description": "Information on the query that was requested." }, "StructureRelationship": { - "title": "StructureRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "StructureRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "ToplevelLinks": { - "title": "ToplevelLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link to itself" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A related resource link" }, "first": { - "title": "First", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "First", "description": "The first page of data" }, "last": { - "title": "Last", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Last", "description": "The last page of data" }, "prev": { - "title": "Prev", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Prev", "description": "The previous page of data" }, "next": { - "title": "Next", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Next", "description": "The next page of data" } }, + "type": "object", + "title": "ToplevelLinks", "description": "A set of Links objects, possibly including pagination" }, "Warnings": { - "title": "Warnings", - "required": [ - "detail", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." }, "type": { - "title": "Type", - "pattern": "^warning$", "type": "string", + "pattern": "^warning$", + "title": "Type", "description": "Warnings must be of type \"warning\"", "default": "warning" } }, + "type": "object", + "required": [ + "detail", + "type" + ], + "title": "Warnings", "description": "OPTIMADE-specific warning class based on OPTIMADE-specific JSON API Error.\n\nFrom the specification:\n\nA warning resource object is defined similarly to a JSON API error object, but MUST also include the field type, which MUST have the value \"warning\".\nThe field detail MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\n\nNote: Must be named \"Warnings\", since \"Warning\" is a built-in Python class." } } diff --git a/openapi/openapi.json b/openapi/openapi.json index a78f70ca8..0f61f4d90 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.2", + "openapi": "3.1.0", "info": { "title": "OPTIMADE API", "description": "The [Open Databases Integration for Materials Design (OPTIMADE) consortium](https://www.optimade.org/) aims to make materials databases interoperational by developing a common REST API.\n\nThis specification is generated using [`optimade-python-tools`](https://github.com/Materials-Consortia/optimade-python-tools/tree/v0.25.2) v0.25.2.", @@ -108,8 +108,8 @@ { "required": true, "schema": { - "title": "Entry", - "type": "string" + "type": "string", + "title": "Entry" }, "name": "entry", "in": "path" @@ -211,8 +211,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -223,8 +223,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -235,10 +235,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -248,9 +248,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -261,9 +261,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -274,9 +274,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -287,9 +287,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -300,8 +300,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -311,9 +311,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -324,8 +324,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -335,8 +335,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -346,8 +346,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -358,9 +358,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -464,8 +464,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -476,8 +476,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -488,10 +488,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -501,9 +501,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -514,9 +514,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -527,9 +527,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -540,9 +540,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -553,8 +553,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -564,9 +564,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -577,8 +577,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -588,8 +588,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -599,8 +599,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -611,9 +611,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -716,8 +716,8 @@ { "required": true, "schema": { - "title": "Entry Id", - "type": "string" + "type": "string", + "title": "Entry Id" }, "name": "entry_id", "in": "path" @@ -726,8 +726,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -738,10 +738,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -751,9 +751,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -764,8 +764,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -776,9 +776,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -789,8 +789,8 @@ "description": "A list of lists which contains a range for each dimension of the property.", "required": false, "schema": { - "title": "Property Ranges", "type": "string", + "title": "Property Ranges", "description": "A list of lists which contains a range for each dimension of the property." }, "name": "property_ranges", @@ -893,8 +893,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -905,8 +905,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -917,10 +917,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -930,9 +930,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -943,9 +943,9 @@ "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { - "title": "Sort", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Sort", "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, @@ -956,9 +956,9 @@ "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "required": false, "schema": { - "title": "Page Limit", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Limit", "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", "default": 20 }, @@ -969,9 +969,9 @@ "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "required": false, "schema": { - "title": "Page Offset", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Offset", "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", "default": 0 }, @@ -982,8 +982,8 @@ "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", "required": false, "schema": { - "title": "Page Number", "type": "integer", + "title": "Page Number", "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." }, "name": "page_number", @@ -993,9 +993,9 @@ "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Cursor", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", "default": 0 }, @@ -1006,8 +1006,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { - "title": "Page Above", "type": "string", + "title": "Page Above", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, "name": "page_above", @@ -1017,8 +1017,8 @@ "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { - "title": "Page Below", "type": "string", + "title": "Page Below", "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." }, "name": "page_below", @@ -1028,8 +1028,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -1040,9 +1040,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -1145,8 +1145,8 @@ { "required": true, "schema": { - "title": "Entry Id", - "type": "string" + "type": "string", + "title": "Entry Id" }, "name": "entry_id", "in": "path" @@ -1155,8 +1155,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "json" }, @@ -1167,10 +1167,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -1180,9 +1180,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -1193,8 +1193,8 @@ "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "required": false, "schema": { - "title": "Include", "type": "string", + "title": "Include", "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", "default": "references" }, @@ -1205,9 +1205,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -1218,8 +1218,8 @@ "description": "A list of lists which contains a range for each dimension of the property.", "required": false, "schema": { - "title": "Property Ranges", "type": "string", + "title": "Property Ranges", "description": "A list of lists which contains a range for each dimension of the property." }, "name": "property_ranges", @@ -1343,8 +1343,8 @@ { "required": true, "schema": { - "title": "Entry Id", - "type": "string" + "type": "string", + "title": "Entry Id" }, "name": "entry_id", "in": "path" @@ -1353,8 +1353,8 @@ "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "required": false, "schema": { - "title": "Response Format", "type": "string", + "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", "default": "jsonlines" }, @@ -1365,10 +1365,10 @@ "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "required": false, "schema": { - "title": "Email Address", "type": "string", - "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", "default": "" }, "name": "email_address", @@ -1378,9 +1378,9 @@ "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "required": false, "schema": { - "title": "Api Hint", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, @@ -1391,9 +1391,9 @@ "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { - "title": "Response Fields", - "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, @@ -1404,8 +1404,8 @@ "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "required": false, "schema": { - "title": "Filter", "type": "string", + "title": "Filter", "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", "default": "" }, @@ -1416,8 +1416,8 @@ "description": "A list of lists which contains a range for each dimension of the property.", "required": false, "schema": { - "title": "Property Ranges", "type": "string", + "title": "Property Ranges", "description": "A list of lists which contains a range for each dimension of the property.", "default": "" }, @@ -1513,76 +1513,70 @@ "components": { "schemas": { "Aggregate": { - "title": "Aggregate", "enum": [ "ok", "test", "staging", "no" ], + "title": "Aggregate", "description": "Enumeration of aggregate values" }, "Assembly": { - "title": "Assembly", - "required": [ - "sites_in_groups", - "group_probabilities" - ], - "type": "object", "properties": { "sites_in_groups": { - "title": "Sites In Groups", - "type": "array", "items": { - "type": "array", "items": { "type": "integer" - } + }, + "type": "array" }, + "type": "array", + "title": "Sites In Groups", "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "group_probabilities": { - "title": "Group Probabilities", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Group Probabilities", "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", "x-optimade-support": "must", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "sites_in_groups", + "group_probabilities" + ], + "title": "Assembly", "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." }, "Attributes": { - "title": "Attributes", - "type": "object", "properties": {}, + "type": "object", + "title": "Attributes", "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.\nThe keys for Attributes MUST NOT be:\n relationships\n links\n id\n type" }, "AvailableApiVersion": { - "title": "AvailableApiVersion", - "required": [ - "url", - "version" - ], - "type": "object", "properties": { "url": { - "title": "Url", + "type": "string", "maxLength": 65536, "minLength": 1, "pattern": ".+/v[0-1](\\.[0-9]+)*/?$", - "type": "string", - "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL", - "format": "uri" + "format": "uri", + "title": "Url", + "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL" }, "version": { - "title": "Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Version", "description": "A string containing the full version number of the API served at that versioned base URL.\nThe version number string MUST NOT be prefixed by, e.g., 'v'.\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -1591,22 +1585,20 @@ ] } }, + "type": "object", + "required": [ + "url", + "version" + ], + "title": "AvailableApiVersion", "description": "A JSON object containing information about an available API version" }, "BaseInfoAttributes": { - "title": "BaseInfoAttributes", - "required": [ - "api_version", - "available_api_versions", - "available_endpoints", - "entry_types_by_format" - ], - "type": "object", "properties": { "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -1615,153 +1607,160 @@ ] }, "available_api_versions": { - "title": "Available Api Versions", - "type": "array", "items": { "$ref": "#/components/schemas/AvailableApiVersion" }, + "type": "array", + "title": "Available Api Versions", "description": "A list of dictionaries of available API versions at other base URLs" }, "formats": { - "title": "Formats", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Formats", "description": "List of available output formats.", "default": [ "json" ] }, "available_endpoints": { - "title": "Available Endpoints", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Available Endpoints", "description": "List of available endpoints (i.e., the string to be appended to the versioned base URL)." }, "entry_types_by_format": { - "title": "Entry Types By Format", - "type": "object", "additionalProperties": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, + "type": "object", + "title": "Entry Types By Format", "description": "Available entry endpoints as a function of output formats." }, "is_index": { - "title": "Is Index", "type": "boolean", + "title": "Is Index", "description": "If true, this is an index meta-database base URL (see section Index Meta-Database). If this member is not provided, the client MUST assume this is not an index meta-database base URL (i.e., the default is for `is_index` to be `false`).", "default": false } }, + "type": "object", + "required": [ + "api_version", + "available_api_versions", + "available_endpoints", + "entry_types_by_format" + ], + "title": "BaseInfoAttributes", "description": "Attributes for Base URL Info endpoint" }, "BaseInfoResource": { - "title": "BaseInfoResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", - "pattern": "^/$", "type": "string", + "pattern": "^/$", + "title": "Id", "default": "/" }, "type": { - "title": "Type", - "pattern": "^info$", "type": "string", + "pattern": "^info$", + "title": "Type", "default": "info" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { "$ref": "#/components/schemas/BaseInfoAttributes" }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/Relationships" } ], + "title": "Relationships", "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "BaseInfoResource", "description": "Resource objects appear in a JSON API document to represent resources." }, "BaseRelationshipMeta": { - "title": "BaseRelationshipMeta", - "required": [ - "description" - ], - "type": "object", "properties": { "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "OPTIONAL human-readable description of the relationship." } }, + "type": "object", + "required": [ + "description" + ], + "title": "BaseRelationshipMeta", "description": "Specific meta field for base relationship resource" }, "BaseRelationshipResource": { - "title": "BaseRelationshipResource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/BaseRelationshipMeta" } ], + "title": "Meta", "description": "Relationship meta field. MUST contain 'description' if supplied." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "BaseRelationshipResource", "description": "Minimum requirements to represent a relationship resource" }, "DataType": { - "title": "DataType", "enum": [ "string", "integer", @@ -1772,1473 +1771,1467 @@ "dictionary", "unknown" ], + "title": "DataType", "description": "Optimade Data Types\n\nSee the section \"Data types\" in the OPTIMADE API specification for more information." }, "EntryInfoProperty": { - "title": "EntryInfoProperty", - "required": [ - "description" - ], - "type": "object", "properties": { "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "A human-readable description of the entry property" }, "unit": { - "title": "Unit", "type": "string", + "title": "Unit", "description": "The physical unit of the entry property.\nThis MUST be a valid representation of units according to version 2.1 of [The Unified Code for Units of Measure](https://unitsofmeasure.org/ucum.html).\nIt is RECOMMENDED that non-standard (non-SI) units are described in the description for the property." }, "sortable": { - "title": "Sortable", "type": "boolean", + "title": "Sortable", "description": "Defines whether the entry property can be used for sorting with the \"sort\" parameter.\nIf the entry listing endpoint supports sorting, this key MUST be present for sortable properties with value `true`." }, "type": { - "title": "Type", "allOf": [ { "$ref": "#/components/schemas/DataType" } ], + "title": "Type", "description": "The type of the property's value.\nThis MUST be any of the types defined in the Data types section.\nFor the purpose of compatibility with future versions of this specification, a client MUST accept values that are not `string` values specifying any of the OPTIMADE Data types, but MUST then also disregard the `type` field.\nNote, if the value is a nested type, only the outermost type should be reported.\nE.g., for the entry resource `structures`, the `species` property is defined as a list of dictionaries, hence its `type` value would be `list`." } - } - }, - "EntryInfoResource": { - "title": "EntryInfoResource", + }, + "type": "object", "required": [ - "formats", - "description", - "properties", - "output_fields_by_format" + "description" ], - "type": "object", + "title": "EntryInfoProperty" + }, + "EntryInfoResource": { "properties": { "formats": { - "title": "Formats", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Formats", "description": "List of output formats available for this type of entry." }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "Description of the entry." }, "properties": { - "title": "Properties", - "type": "object", "additionalProperties": { "$ref": "#/components/schemas/EntryInfoProperty" }, + "type": "object", + "title": "Properties", "description": "A dictionary describing queryable properties for this entry type, where each key is a property name." }, "output_fields_by_format": { - "title": "Output Fields By Format", - "type": "object", "additionalProperties": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, + "type": "object", + "title": "Output Fields By Format", "description": "Dictionary of available output fields for this entry type, where the keys are the values of the `formats` list and the values are the keys of the `properties` dictionary." } - } - }, - "EntryInfoResponse": { - "title": "EntryInfoResponse", + }, + "type": "object", "required": [ - "data", - "meta" + "formats", + "description", + "properties", + "output_fields_by_format" ], - "type": "object", + "title": "EntryInfoResource" + }, + "EntryInfoResponse": { "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/EntryInfoResource" } ], + "title": "Data", "description": "OPTIMADE information for an entry endpoint." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "EntryInfoResponse", "description": "errors are not allowed" }, "EntryMetadata": { - "title": "EntryMetadata", - "type": "object", "properties": { "property_metadata": { - "title": "Property Metadata", "type": "object", + "title": "Property Metadata", "description": "A dictionary, where the keys are the names of the properties in the attributes field and the value is a dictionary containing the metadata for that property.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." }, "partial_data_links": { - "title": "Partial Data Links", - "type": "object", "additionalProperties": { - "type": "array", "items": { "$ref": "#/components/schemas/PartialDataLink" - } + }, + "type": "array" }, + "type": "object", + "title": "Partial Data Links", "description": "A dictionary, where the keys are the names of the properties in the attributes field for which the value is too large to be shared by default.\n For each property one or more links are provided from which the value of the attribute can be retrieved." } }, + "type": "object", + "title": "EntryMetadata", "description": "Contains the metadata for the attributes of an entry" }, "EntryRelationships": { - "title": "EntryRelationships", - "type": "object", "properties": { "references": { - "title": "References", "allOf": [ { "$ref": "#/components/schemas/ReferenceRelationship" } ], + "title": "References", "description": "Object containing links to relationships with entries of the `references` type." }, "structures": { - "title": "Structures", "allOf": [ { "$ref": "#/components/schemas/StructureRelationship" } ], + "title": "Structures", "description": "Object containing links to relationships with entries of the `structures` type." } }, + "type": "object", + "title": "EntryRelationships", "description": "This model wraps the JSON API Relationships to include type-specific top level keys." }, "EntryResource": { - "title": "EntryResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/EntryResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary, containing key-value pairs representing the entry's properties, except for `type` and `id`.\nDatabase-provider-specific properties need to include the database-provider-specific prefix (see section on Database-Provider-Specific Namespace Prefixes)." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "EntryResource", "description": "The base model for an entry resource." }, "EntryResourceAttributes": { - "title": "EntryResourceAttributes", - "required": [ - "last_modified" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", "x-optimade-queryable": "must" } }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "EntryResourceAttributes", "description": "Contains key-value pairs representing the entry's properties." }, "Error": { - "title": "Error", - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "title": "Error", "description": "An error response" }, "ErrorLinks": { - "title": "ErrorLinks", - "type": "object", "properties": { "about": { - "title": "About", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "About", "description": "A link that leads to further details about this particular occurrence of the problem." } }, + "type": "object", + "title": "ErrorLinks", "description": "A Links object specific to Error objects" }, "ErrorResponse": { - "title": "ErrorResponse", - "required": [ - "meta", - "errors" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/Resource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/Resource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Outputted Data" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information." }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/OptimadeError" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of OPTIMADE-specific JSON API error objects, where the field detail MUST be present." }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "meta", + "errors" + ], + "title": "ErrorResponse", "description": "errors MUST be present and data MUST be skipped" }, "ErrorSource": { - "title": "ErrorSource", - "type": "object", "properties": { "pointer": { - "title": "Pointer", "type": "string", + "title": "Pointer", "description": "a JSON Pointer [RFC6901] to the associated entity in the request document [e.g. \"/data\" for a primary data object, or \"/data/attributes/title\" for a specific attribute]." }, "parameter": { - "title": "Parameter", "type": "string", + "title": "Parameter", "description": "a string indicating which URI query parameter caused the error." } }, + "type": "object", + "title": "ErrorSource", "description": "an object containing references to the source of the error" }, "Implementation": { - "title": "Implementation", - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "name of the implementation" }, "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "version string of the current implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the homepage of the implementation." }, "source_url": { - "title": "Source Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Source Url", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation source, either downloadable archive or version control system." }, "maintainer": { - "title": "Maintainer", "allOf": [ { "$ref": "#/components/schemas/ImplementationMaintainer" } ], + "title": "Maintainer", "description": "A dictionary providing details about the maintainer of the implementation." }, "issue_tracker": { - "title": "Issue Tracker", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Issue Tracker", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) pointing to the implementation's issue tracker." } }, + "type": "object", + "title": "Implementation", "description": "Information on the server implementation" }, "ImplementationMaintainer": { - "title": "ImplementationMaintainer", - "required": [ - "email" - ], - "type": "object", "properties": { "email": { - "title": "Email", "type": "string", - "description": "the maintainer's email address", - "format": "email" + "format": "email", + "title": "Email", + "description": "the maintainer's email address" } }, + "type": "object", + "required": [ + "email" + ], + "title": "ImplementationMaintainer", "description": "Details about the maintainer of the implementation" }, "InfoResponse": { - "title": "InfoResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", "allOf": [ { "$ref": "#/components/schemas/BaseInfoResource" } ], + "title": "Data", "description": "The implementations /info data." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Resource" }, + "type": "array", + "uniqueItems": true, + "title": "Included", "description": "A list of unique included resources" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "InfoResponse", "description": "errors are not allowed" }, "JsonApi": { - "title": "JsonApi", - "type": "object", "properties": { "version": { - "title": "Version", "type": "string", + "title": "Version", "description": "Version of the json API used", "default": "1.0" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "Non-standard meta information" } }, + "type": "object", + "title": "JsonApi", "description": "An object describing the server's implementation" }, "Link": { - "title": "Link", - "required": [ - "href" - ], - "type": "object", "properties": { "href": { - "title": "Href", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "a string containing the link\u2019s URL.", - "format": "uri" + "format": "uri", + "title": "Href", + "description": "a string containing the link\u2019s URL." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the link." } }, + "type": "object", + "required": [ + "href" + ], + "title": "Link", "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object." }, "LinkType": { - "title": "LinkType", "enum": [ "child", "root", "external", "providers" ], + "title": "LinkType", "description": "Enumeration of link_type values" }, "LinksResource": { - "title": "LinksResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^links$", "type": "string", + "pattern": "^links$", + "title": "Type", "description": "These objects are described in detail in the section Links Endpoint", "default": "links" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/LinksResourceAttributes" } ], + "title": "Attributes", "description": "A dictionary containing key-value pairs representing the Links resource's properties." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "LinksResource", "description": "A Links endpoint resource object" }, "LinksResourceAttributes": { - "title": "LinksResourceAttributes", - "required": [ - "name", - "description", - "base_url", - "homepage", - "link_type" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Human-readable name for the OPTIMADE API implementation, e.g., for use in clients to show the name to the end-user." }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "Human-readable description for the OPTIMADE API implementation, e.g., for use in clients to show a description to the end-user." }, "base_url": { - "title": "Base Url", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Base Url", "description": "JSON API links object, pointing to the base URL for this implementation" }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "JSON API links object, pointing to a homepage URL for this implementation" }, "link_type": { - "title": "Link Type", "allOf": [ { "$ref": "#/components/schemas/LinkType" } ], + "title": "Link Type", "description": "The type of the linked relation.\nMUST be one of these values: 'child', 'root', 'external', 'providers'." }, "aggregate": { - "title": "Aggregate", "allOf": [ { "$ref": "#/components/schemas/Aggregate" } ], + "title": "Aggregate", "description": "A string indicating whether a client that is following links to aggregate results from different OPTIMADE implementations should follow this link or not.\nThis flag SHOULD NOT be indicated for links where `link_type` is not `child`.\n\nIf not specified, clients MAY assume that the value is `ok`.\nIf specified, and the value is anything different than `ok`, the client MUST assume that the server is suggesting not to follow the link during aggregation by default (also if the value is not among the known ones, in case a future specification adds new accepted values).\n\nSpecific values indicate the reason why the server is providing the suggestion.\nA client MAY follow the link anyway if it has reason to do so (e.g., if the client is looking for all test databases, it MAY follow the links marked with `aggregate`=`test`).\n\nIf specified, it MUST be one of the values listed in section Link Aggregate Options.", "default": "ok" }, "no_aggregate_reason": { - "title": "No Aggregate Reason", "type": "string", + "title": "No Aggregate Reason", "description": "An OPTIONAL human-readable string indicating the reason for suggesting not to aggregate results following the link.\nIt SHOULD NOT be present if `aggregate`=`ok`." } }, + "type": "object", + "required": [ + "name", + "description", + "base_url", + "homepage", + "link_type" + ], + "title": "LinksResourceAttributes", "description": "Links endpoint resource object attributes" }, "LinksResponse": { - "title": "LinksResponse", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/LinksResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE links resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "LinksResponse", "description": "errors are not allowed" }, "Meta": { - "title": "Meta", - "type": "object", "properties": {}, + "type": "object", + "title": "Meta", "description": "Non-standard meta-information that can not be represented as an attribute or relationship." }, "OptimadeError": { - "title": "OptimadeError", - "required": [ - "detail" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "status": { - "title": "Status", "type": "string", + "title": "Status", "description": "the HTTP status code applicable to this problem, expressed as a string value." }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." } }, + "type": "object", + "required": [ + "detail" + ], + "title": "OptimadeError", "description": "detail MUST be present" }, "PartialDataLink": { - "title": "PartialDataLink", - "required": [ - "link", - "format" - ], - "type": "object", "properties": { "link": { - "title": "Link", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL.", - "format": "uri" + "format": "uri", + "title": "Link", + "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL." }, "format": { - "title": "Format", "type": "string", + "title": "Format", "description": "String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value \"jsonlines\", which refers to the format in OPTIMADE JSON lines partial data format." } - } + }, + "type": "object", + "required": [ + "link", + "format" + ], + "title": "PartialDataLink" }, "Periodicity": { - "title": "Periodicity", + "type": "integer", "enum": [ 0, 1 ], - "type": "integer", + "title": "Periodicity", "description": "Integer enumeration of dimension_types values" }, "Person": { - "title": "Person", - "required": [ - "name" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Full name of the person, REQUIRED.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "firstname": { - "title": "Firstname", "type": "string", + "title": "Firstname", "description": "First name of the person.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "lastname": { - "title": "Lastname", "type": "string", + "title": "Lastname", "description": "Last name of the person.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "name" + ], + "title": "Person", "description": "A person, i.e., an author, editor or other." }, "Provider": { - "title": "Provider", - "required": [ - "name", - "description", - "prefix" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "a short name for the database provider" }, "description": { - "title": "Description", "type": "string", + "title": "Description", "description": "a longer description of the database provider" }, "prefix": { - "title": "Prefix", - "pattern": "^[a-z]([a-z]|[0-9]|_)*$", "type": "string", + "pattern": "^[a-z]([a-z]|[0-9]|_)*$", + "title": "Prefix", "description": "database-provider-specific prefix as found in section Database-Provider-Specific Namespace Prefixes." }, "homepage": { - "title": "Homepage", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Homepage", "description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object." } }, + "type": "object", + "required": [ + "name", + "description", + "prefix" + ], + "title": "Provider", "description": "Information on the database provider of the implementation." }, "ReferenceRelationship": { - "title": "ReferenceRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "ReferenceRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "ReferenceResource": { - "title": "ReferenceResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^references$", "type": "string", + "pattern": "^references$", + "title": "Type", "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", "default": "references", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "$ref": "#/components/schemas/ReferenceResourceAttributes" }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], + "title": "Relationships", "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." } }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "ReferenceResource", "description": "The `references` entries describe bibliographic references.\n\nThe following properties are used to provide the bibliographic details:\n\n- **address**, **annote**, **booktitle**, **chapter**, **crossref**, **edition**, **howpublished**, **institution**, **journal**, **key**, **month**, **note**, **number**, **organization**, **pages**, **publisher**, **school**, **series**, **title**, **volume**, **year**: meanings of these properties match the [BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf), values are strings;\n- **bib_type**: type of the reference, corresponding to **type** property in the BibTeX specification, value is string;\n- **authors** and **editors**: lists of *person objects* which are dictionaries with the following keys:\n - **name**: Full name of the person, REQUIRED.\n - **firstname**, **lastname**: Parts of the person's name, OPTIONAL.\n- **doi** and **url**: values are strings.\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., any of the properties MAY be `null`.\n - **Query**: Support for queries on any of these properties is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Every references entry MUST contain at least one of the properties." }, "ReferenceResourceAttributes": { - "title": "ReferenceResourceAttributes", - "required": [ - "last_modified" - ], - "type": "object", "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "x-optimade-support": "should", "x-optimade-queryable": "must" }, "authors": { - "title": "Authors", - "type": "array", "items": { "$ref": "#/components/schemas/Person" }, + "type": "array", + "title": "Authors", "description": "List of person objects containing the authors of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "editors": { - "title": "Editors", - "type": "array", "items": { "$ref": "#/components/schemas/Person" }, + "type": "array", + "title": "Editors", "description": "List of person objects containing the editors of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "doi": { - "title": "Doi", "type": "string", + "title": "Doi", "description": "The digital object identifier of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "url": { - "title": "Url", + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", - "description": "The URL of the reference.", "format": "uri", + "title": "Url", + "description": "The URL of the reference.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "address": { - "title": "Address", "type": "string", + "title": "Address", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "annote": { - "title": "Annote", "type": "string", + "title": "Annote", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "booktitle": { - "title": "Booktitle", "type": "string", + "title": "Booktitle", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "chapter": { - "title": "Chapter", "type": "string", + "title": "Chapter", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "crossref": { - "title": "Crossref", "type": "string", + "title": "Crossref", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "edition": { - "title": "Edition", "type": "string", + "title": "Edition", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "howpublished": { - "title": "Howpublished", "type": "string", + "title": "Howpublished", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "institution": { - "title": "Institution", "type": "string", + "title": "Institution", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "journal": { - "title": "Journal", "type": "string", + "title": "Journal", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "key": { - "title": "Key", "type": "string", + "title": "Key", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "month": { - "title": "Month", "type": "string", + "title": "Month", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "note": { - "title": "Note", "type": "string", + "title": "Note", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "number": { - "title": "Number", "type": "string", + "title": "Number", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "organization": { - "title": "Organization", "type": "string", + "title": "Organization", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "pages": { - "title": "Pages", "type": "string", + "title": "Pages", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "publisher": { - "title": "Publisher", "type": "string", + "title": "Publisher", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "school": { - "title": "School", "type": "string", + "title": "School", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "series": { - "title": "Series", "type": "string", + "title": "Series", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "bib_type": { - "title": "Bib Type", "type": "string", + "title": "Bib Type", "description": "Type of the reference, corresponding to the **type** property in the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "volume": { - "title": "Volume", "type": "string", + "title": "Volume", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "year": { - "title": "Year", "type": "string", + "title": "Year", "description": "Meaning of property matches the BiBTeX specification.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "ReferenceResourceAttributes", "description": "Model that stores the attributes of a reference.\n\nMany properties match the meaning described in the\n[BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf)." }, "ReferenceResponseMany": { - "title": "ReferenceResponseMany", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/ReferenceResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE references entry resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, - "description": "errors are not allowed" - }, - "ReferenceResponseOne": { - "title": "ReferenceResponseOne", + "type": "object", "required": [ "data", "meta" ], - "type": "object", + "title": "ReferenceResponseMany", + "description": "errors are not allowed" + }, + "ReferenceResponseOne": { "properties": { "data": { - "title": "Data", "anyOf": [ { "$ref": "#/components/schemas/ReferenceResource" @@ -3247,209 +3240,209 @@ "type": "object" } ], + "title": "Data", "description": "A single references entry resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "ReferenceResponseOne", "description": "errors are not allowed" }, "RelationshipLinks": { - "title": "RelationshipLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link for the relationship itself (a 'relationship link').\nThis link allows the client to directly manipulate the relationship.\nWhen fetched successfully, this link returns the [linkage](https://jsonapi.org/format/1.0/#document-resource-object-linkage) for the related resources as its primary data.\n(See [Fetching Relationships](https://jsonapi.org/format/1.0/#fetching-relationships).)" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A [related resource link](https://jsonapi.org/format/1.0/#document-resource-object-related-resource-links)." } }, + "type": "object", + "title": "RelationshipLinks", "description": "A resource object **MAY** contain references to other resource objects (\"relationships\").\nRelationships may be to-one or to-many.\nRelationships can be specified by including a member in a resource's links object." }, "Relationships": { - "title": "Relationships", - "type": "object", "properties": {}, + "type": "object", + "title": "Relationships", "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.\nKeys MUST NOT be:\n type\n id" }, "Resource": { - "title": "Resource", - "required": [ - "id", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "Resource ID" }, "type": { - "title": "Type", "type": "string", + "title": "Type", "description": "Resource type" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." }, "attributes": { - "title": "Attributes", "allOf": [ { "$ref": "#/components/schemas/Attributes" } ], + "title": "Attributes", "description": "an attributes object representing some of the resource\u2019s data." }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/Relationships" } ], + "title": "Relationships", "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." } }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "Resource", "description": "Resource objects appear in a JSON API document to represent resources." }, "ResourceLinks": { - "title": "ResourceLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link that identifies the resource represented by the resource object." } }, + "type": "object", + "title": "ResourceLinks", "description": "A Resource Links object" }, "ResponseMeta": { - "title": "ResponseMeta", - "required": [ - "query", - "api_version", - "more_data_available" - ], - "type": "object", "properties": { "query": { - "title": "Query", "allOf": [ { "$ref": "#/components/schemas/ResponseMetaQuery" } ], + "title": "Query", "description": "Information on the Query that was requested" }, "api_version": { - "title": "Api Version", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", "example": [ "0.10.1", @@ -3458,588 +3451,588 @@ ] }, "more_data_available": { - "title": "More Data Available", "type": "boolean", + "title": "More Data Available", "description": "`false` if the response contains all data for the request (e.g., a request issued to a single entry endpoint, or a `filter` query at the last page of a paginated response) and `true` if the response is incomplete in the sense that multiple objects match the request, and not all of them have been included in the response (e.g., a query with multiple pages that is not at the last page)." }, "schema": { - "title": "Schema", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Schema", "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) that points to a schema for the response.\nIf it is a string, or a dictionary containing no `meta` field, the provided URL MUST point at an [OpenAPI](https://swagger.io/specification/) schema.\nIt is possible that future versions of this specification allows for alternative schema types.\nHence, if the `meta` field of the JSON API links object is provided and contains a field `schema_type` that is not equal to the string `OpenAPI` the client MUST not handle failures to parse the schema or to validate the response against the schema as errors." }, "time_stamp": { - "title": "Time Stamp", "type": "string", - "description": "A timestamp containing the date and time at which the query was executed.", - "format": "date-time" + "format": "date-time", + "title": "Time Stamp", + "description": "A timestamp containing the date and time at which the query was executed." }, "data_returned": { - "title": "Data Returned", - "minimum": 0.0, "type": "integer", + "minimum": 0.0, + "title": "Data Returned", "description": "An integer containing the total number of data resource objects returned for the current `filter` query, independent of pagination." }, "provider": { - "title": "Provider", "allOf": [ { "$ref": "#/components/schemas/Provider" } ], + "title": "Provider", "description": "information on the database provider of the implementation." }, "data_available": { - "title": "Data Available", "type": "integer", + "title": "Data Available", "description": "An integer containing the total number of data resource objects available in the database for the endpoint." }, "last_id": { - "title": "Last Id", "type": "string", + "title": "Last Id", "description": "a string containing the last ID returned" }, "response_message": { - "title": "Response Message", "type": "string", + "title": "Response Message", "description": "response string from the server" }, "implementation": { - "title": "Implementation", "allOf": [ { "$ref": "#/components/schemas/Implementation" } ], + "title": "Implementation", "description": "a dictionary describing the server implementation" }, "warnings": { - "title": "Warnings", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Warnings" }, + "type": "array", + "uniqueItems": true, + "title": "Warnings", "description": "A list of warning resource objects representing non-critical errors or warnings.\nA warning resource object is defined similarly to a [JSON API error object](http://jsonapi.org/format/1.0/#error-objects), but MUST also include the field `type`, which MUST have the value `\"warning\"`.\nThe field `detail` MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\nThe field `status`, representing a HTTP response status code, MUST NOT be present for a warning resource object.\nThis is an exclusive field for error resource objects." } }, + "type": "object", + "required": [ + "query", + "api_version", + "more_data_available" + ], + "title": "ResponseMeta", "description": "A [JSON API meta member](https://jsonapi.org/format/1.0#document-meta)\nthat contains JSON API meta objects of non-standard\nmeta-information.\n\nOPTIONAL additional information global to the query that is not\nspecified in this document, MUST start with a\ndatabase-provider-specific prefix." }, "ResponseMetaQuery": { - "title": "ResponseMetaQuery", - "required": [ - "representation" - ], - "type": "object", "properties": { "representation": { - "title": "Representation", "type": "string", + "title": "Representation", "description": "A string with the part of the URL following the versioned or unversioned base URL that serves the API.\nQuery parameters that have not been used in processing the request MAY be omitted.\nIn particular, if no query parameters have been involved in processing the request, the query part of the URL MAY be excluded.\nExample: `/structures?filter=nelements=2`" } }, + "type": "object", + "required": [ + "representation" + ], + "title": "ResponseMetaQuery", "description": "Information on the query that was requested." }, "Species": { - "title": "Species", - "required": [ - "name", - "chemical_symbols", - "concentration" - ], - "type": "object", "properties": { "name": { - "title": "Name", "type": "string", + "title": "Name", "description": "Gives the name of the species; the **name** value MUST be unique in the `species` list.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "chemical_symbols": { - "title": "Chemical Symbols", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Chemical Symbols", "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "concentration": { - "title": "Concentration", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Concentration", "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", "x-optimade-support": "must", "x-optimade-queryable": "optional" }, "mass": { - "title": "Mass", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Mass", "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", + "x-optimade-unit": "a.m.u.", "x-optimade-support": "optional", - "x-optimade-queryable": "optional", - "x-optimade-unit": "a.m.u." + "x-optimade-queryable": "optional" }, "original_name": { - "title": "Original Name", "type": "string", + "title": "Original Name", "description": "Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\nNote: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "attached": { - "title": "Attached", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Attached", "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "nattached": { - "title": "Nattached", - "type": "array", "items": { "type": "integer" }, + "type": "array", + "title": "Nattached", "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" } }, + "type": "object", + "required": [ + "name", + "chemical_symbols", + "concentration" + ], + "title": "Species", "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." }, "StructureFeatures": { - "title": "StructureFeatures", "enum": [ "disorder", "implicit_atoms", "site_attachments", "assemblies" ], + "title": "StructureFeatures", "description": "Enumeration of structure_features values" }, "StructureRelationship": { - "title": "StructureRelationship", - "type": "object", "properties": { "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/RelationshipLinks" } ], + "title": "Links", "description": "a links object containing at least one of the following: self, related" }, "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { "$ref": "#/components/schemas/BaseRelationshipResource" }, { - "type": "array", "items": { "$ref": "#/components/schemas/BaseRelationshipResource" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "Resource linkage" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object that contains non-standard meta-information about the relationship." } }, + "type": "object", + "title": "StructureRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, "StructureResource": { - "title": "StructureResource", - "required": [ - "id", - "type", - "attributes" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "type": { - "title": "Type", - "pattern": "^structures$", "type": "string", + "pattern": "^structures$", + "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", "default": "structures", "x-optimade-support": "must", "x-optimade-queryable": "must" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ResourceLinks" } ], + "title": "Links", "description": "a links object containing links related to the resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/EntryMetadata" } ], + "title": "Meta", "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { "$ref": "#/components/schemas/StructureResourceAttributes" }, "relationships": { - "title": "Relationships", "allOf": [ { "$ref": "#/components/schemas/EntryRelationships" } ], - "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." - } - }, - "description": "Representing a structure." - }, - "StructureResourceAttributes": { - "title": "StructureResourceAttributes", - "required": [ - "last_modified", - "elements", - "nelements", - "elements_ratios", - "chemical_formula_descriptive", - "chemical_formula_reduced", - "chemical_formula_anonymous", - "dimension_types", - "nperiodic_dimensions", - "lattice_vectors", - "cartesian_site_positions", - "nsites", - "species", - "species_at_sites", - "structure_features" - ], + "title": "Relationships", + "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." + } + }, "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "StructureResource", + "description": "Representing a structure." + }, + "StructureResourceAttributes": { "properties": { "immutable_id": { - "title": "Immutable Id", "type": "string", + "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", "x-optimade-support": "optional", "x-optimade-queryable": "must" }, "last_modified": { - "title": "Last Modified", "type": "string", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "must" }, "elements": { - "title": "Elements", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Elements", "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "must" }, "nelements": { - "title": "Nelements", "type": "integer", + "title": "Nelements", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "elements_ratios": { - "title": "Elements Ratios", - "type": "array", "items": { "type": "number" }, + "type": "array", + "title": "Elements Ratios", "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "must" }, "chemical_formula_descriptive": { - "title": "Chemical Formula Descriptive", "type": "string", + "title": "Chemical Formula Descriptive", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "chemical_formula_reduced": { - "title": "Chemical Formula Reduced", - "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Reduced", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "must" }, "chemical_formula_hill": { - "title": "Chemical Formula Hill", - "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Hill", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "chemical_formula_anonymous": { - "title": "Chemical Formula Anonymous", - "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "type": "string", + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Anonymous", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "must" }, "dimension_types": { - "title": "Dimension Types", - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { "$ref": "#/components/schemas/Periodicity" }, + "type": "array", + "maxItems": 3, + "minItems": 3, + "title": "Dimension Types", "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", - "nullable": true, "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "nullable": true }, "nperiodic_dimensions": { - "title": "Nperiodic Dimensions", "type": "integer", + "title": "Nperiodic Dimensions", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "lattice_vectors": { - "title": "Lattice Vectors", - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { "type": "number" - } + }, + "type": "array", + "maxItems": 3, + "minItems": 3 }, + "type": "array", + "maxItems": 3, + "minItems": 3, + "title": "Lattice Vectors", "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", - "nullable": true, "x-optimade-support": "should", + "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-queryable": "optional" + "nullable": true }, "cartesian_site_positions": { - "title": "Cartesian Site Positions", - "type": "array", "items": { - "maxItems": 3, - "minItems": 3, - "type": "array", "items": { "type": "number" - } + }, + "type": "array", + "maxItems": 3, + "minItems": 3 }, + "type": "array", + "title": "Cartesian Site Positions", "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", - "nullable": true, "x-optimade-support": "should", + "x-optimade-queryable": "optional", "x-optimade-unit": "\u00c5", - "x-optimade-queryable": "optional" + "nullable": true }, "nsites": { - "title": "Nsites", "type": "integer", + "title": "Nsites", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", - "nullable": true, "x-optimade-support": "should", + "nullable": true, "x-optimade-queryable": "must" }, "species": { - "title": "Species", - "type": "array", "items": { "$ref": "#/components/schemas/Species" }, + "type": "array", + "title": "Species", "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "optional" }, "species_at_sites": { - "title": "Species At Sites", - "type": "array", "items": { "type": "string" }, + "type": "array", + "title": "Species At Sites", "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", "nullable": true, "x-optimade-support": "should", "x-optimade-queryable": "optional" }, "assemblies": { - "title": "Assemblies", - "type": "array", "items": { "$ref": "#/components/schemas/Assembly" }, + "type": "array", + "title": "Assemblies", "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", "x-optimade-support": "optional", "x-optimade-queryable": "optional" }, "structure_features": { - "title": "Structure Features", - "type": "array", "items": { "$ref": "#/components/schemas/StructureFeatures" }, + "type": "array", + "title": "Structure Features", "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", "x-optimade-support": "must", "x-optimade-queryable": "must" } }, + "type": "object", + "required": [ + "last_modified", + "elements", + "nelements", + "elements_ratios", + "chemical_formula_descriptive", + "chemical_formula_reduced", + "chemical_formula_anonymous", + "dimension_types", + "nperiodic_dimensions", + "lattice_vectors", + "cartesian_site_positions", + "nsites", + "species", + "species_at_sites", + "structure_features" + ], + "title": "StructureResourceAttributes", "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." }, "StructureResponseMany": { - "title": "StructureResponseMany", - "required": [ - "data", - "meta" - ], - "type": "object", "properties": { "data": { - "title": "Data", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/StructureResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } ], + "uniqueItems": true, + "title": "Data", "description": "List of unique OPTIMADE structures entry resource objects." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, - "description": "errors are not allowed" - }, - "StructureResponseOne": { - "title": "StructureResponseOne", + "type": "object", "required": [ "data", "meta" ], - "type": "object", + "title": "StructureResponseMany", + "description": "errors are not allowed" + }, + "StructureResponseOne": { "properties": { "data": { - "title": "Data", "anyOf": [ { "$ref": "#/components/schemas/StructureResource" @@ -4048,225 +4041,232 @@ "type": "object" } ], + "title": "Data", "description": "A single structures entry resource." }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/ResponseMeta" } ], + "title": "Meta", "description": "A meta object containing non-standard information" }, "errors": { - "title": "Errors", - "uniqueItems": true, - "type": "array", "items": { "$ref": "#/components/schemas/Error" }, + "type": "array", + "uniqueItems": true, + "title": "Errors", "description": "A list of unique errors" }, "included": { - "title": "Included", - "uniqueItems": true, "anyOf": [ { - "type": "array", "items": { "$ref": "#/components/schemas/EntryResource" - } + }, + "type": "array" }, { - "type": "array", "items": { "type": "object" - } + }, + "type": "array" } - ] + ], + "uniqueItems": true, + "title": "Included" }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ToplevelLinks" } ], + "title": "Links", "description": "Links associated with the primary data or errors" }, "jsonapi": { - "title": "Jsonapi", "allOf": [ { "$ref": "#/components/schemas/JsonApi" } ], + "title": "Jsonapi", "description": "Information about the JSON API used" } }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "StructureResponseOne", "description": "errors are not allowed" }, "ToplevelLinks": { - "title": "ToplevelLinks", - "type": "object", "properties": { "self": { - "title": "Self", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Self", "description": "A link to itself" }, "related": { - "title": "Related", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Related", "description": "A related resource link" }, "first": { - "title": "First", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "First", "description": "The first page of data" }, "last": { - "title": "Last", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Last", "description": "The last page of data" }, "prev": { - "title": "Prev", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Prev", "description": "The previous page of data" }, "next": { - "title": "Next", "anyOf": [ { + "type": "string", "maxLength": 65536, "minLength": 1, - "type": "string", "format": "uri" }, { "$ref": "#/components/schemas/Link" } ], + "title": "Next", "description": "The next page of data" } }, + "type": "object", + "title": "ToplevelLinks", "description": "A set of Links objects, possibly including pagination" }, "Warnings": { - "title": "Warnings", - "required": [ - "detail", - "type" - ], - "type": "object", "properties": { "id": { - "title": "Id", "type": "string", + "title": "Id", "description": "A unique identifier for this particular occurrence of the problem." }, "links": { - "title": "Links", "allOf": [ { "$ref": "#/components/schemas/ErrorLinks" } ], + "title": "Links", "description": "A links object storing about" }, "code": { - "title": "Code", "type": "string", + "title": "Code", "description": "an application-specific error code, expressed as a string value." }, "title": { - "title": "Title", "type": "string", + "title": "Title", "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." }, "detail": { - "title": "Detail", "type": "string", + "title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem." }, "source": { - "title": "Source", "allOf": [ { "$ref": "#/components/schemas/ErrorSource" } ], + "title": "Source", "description": "An object containing references to the source of the error" }, "meta": { - "title": "Meta", "allOf": [ { "$ref": "#/components/schemas/Meta" } ], + "title": "Meta", "description": "a meta object containing non-standard meta-information about the error." }, "type": { - "title": "Type", - "pattern": "^warning$", "type": "string", + "pattern": "^warning$", + "title": "Type", "description": "Warnings must be of type \"warning\"", "default": "warning" } }, + "type": "object", + "required": [ + "detail", + "type" + ], + "title": "Warnings", "description": "OPTIMADE-specific warning class based on OPTIMADE-specific JSON API Error.\n\nFrom the specification:\n\nA warning resource object is defined similarly to a JSON API error object, but MUST also include the field type, which MUST have the value \"warning\".\nThe field detail MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\n\nNote: Must be named \"Warnings\", since \"Warning\" is a built-in Python class." } } diff --git a/optimade/server/query_params.py b/optimade/server/query_params.py index 772232326..473f30046 100644 --- a/optimade/server/query_params.py +++ b/optimade/server/query_params.py @@ -378,12 +378,12 @@ def __init__( api_hint: str = Query( "", description="If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", - regex=r"(v[0-9]+(\.[0-9]+)?)?", + pattern=r"(v[0-9]+(\.[0-9]+)?)?", ), response_fields: str = Query( "", description="A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", - regex=r"([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + pattern=r"([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", ), filter: str = Query( # pylint: disable=redefined-builtin "", From c87d4369f609df2e4aad84abc329696ffa8ab954 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Thu, 14 Sep 2023 17:40:29 +0200 Subject: [PATCH 65/95] Moved generate_links_partial_data function to routers/utils.py and made it use the request url when no base url was defined in the configuration. --- optimade/server/config.py | 1 - .../entry_collections/entry_collections.py | 19 -------------- optimade/server/routers/utils.py | 26 +++++++++++++++++++ 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/optimade/server/config.py b/optimade/server/config.py index cddc3bdeb..a88d0b895 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -71,7 +71,6 @@ class SupportedResponseFormats(Enum): """Enumeration of supported response formats. - 'JSON': [JSON](https://www.json.org/json-en.html) - - 'HDF5': [HDF5](https://portal.hdfgroup.org/display/HDF5/HDF5) - `JSONL`: [JSONL](https://jsonlines.org/) """ diff --git a/optimade/server/entry_collections/entry_collections.py b/optimade/server/entry_collections/entry_collections.py index 345b9f5f0..d148f1dc7 100644 --- a/optimade/server/entry_collections/entry_collections.py +++ b/optimade/server/entry_collections/entry_collections.py @@ -228,7 +228,6 @@ def find( if raw_results: results = [self.resource_mapper.map_back(doc) for doc in raw_results] - self.generate_links_partial_data(results) if single_entry: results = results[0] # type: ignore[assignment] @@ -247,24 +246,6 @@ def find( include_fields, ) - def generate_links_partial_data(self, results): - for entry in results: - if entry.get("meta", {}) and entry["meta"].get("partial_data_links", {}): - for property in entry["meta"]["partial_data_links"]: - for response_format in CONFIG.partial_data_formats: - entry["meta"]["partial_data_links"][property].append( - { - "format": str(response_format.value), - "link": CONFIG.base_url - + "/partial_data/" - + entry["id"] - + "?response_fields=" - + property - + "&response_format=" - + str(response_format.value), - } - ) - @abstractmethod def _run_db_query( self, diff --git a/optimade/server/routers/utils.py b/optimade/server/routers/utils.py index 7cbb2257c..ed384c2d1 100644 --- a/optimade/server/routers/utils.py +++ b/optimade/server/routers/utils.py @@ -258,6 +258,30 @@ def get_base_url( ) +def generate_links_partial_data( + results, + parsed_url_request: Union[ + urllib.parse.ParseResult, urllib.parse.SplitResult, StarletteURL, str + ], +): + for entry in results: + if entry.get("meta", {}) and entry["meta"].get("partial_data_links", {}): + for property in entry["meta"]["partial_data_links"]: + for response_format in CONFIG.partial_data_formats: + entry["meta"]["partial_data_links"][property].append( + { + "format": str(response_format.value), + "link": get_base_url(parsed_url_request) + + "/partial_data/" + + entry["id"] + + "?response_fields=" + + property + + "&response_format=" + + str(response_format.value), + } + ) + + def get_entries( collection: EntryCollection, response: Type[EntryResponseMany], # noqa @@ -282,6 +306,7 @@ def get_entries( included = [] if results is not None: + generate_links_partial_data(results, request.url) included = get_included_relationships(results, ENTRY_COLLECTIONS, include) if more_data_available: @@ -346,6 +371,7 @@ def get_single_entry( included = [] if results is not None: included = get_included_relationships(results, ENTRY_COLLECTIONS, include) + generate_links_partial_data([results], request.url) links = ToplevelLinks(next=None) From 60b102e55a33b5ee1ce708f58d9bf18b79407005 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Fri, 15 Sep 2023 14:39:52 +0200 Subject: [PATCH 66/95] Added relevant code from original trajectory proposal. --- docs/api_reference/models/trajectories.md | 5 + .../server/mappers/trajectories.md | 3 + .../server/routers/trajectories.md | 3 + openapi/index_openapi.json | 70 +- openapi/openapi.json | 3003 +- optimade/filtertransformers/mongo.py | 1 + optimade/models/__init__.py | 2 + optimade/models/entries.py | 9 + optimade/models/responses.py | 17 + optimade/models/structures.py | 8 +- optimade/models/trajectories.py | 109 + optimade/server/config.py | 4 + optimade/server/data/__init__.py | 1 + optimade/server/data/test_references.json | 22 + optimade/server/data/test_trajectories.json | 72845 ++++++++++++++++ optimade/server/main.py | 32 +- optimade/server/mappers/__init__.py | 2 + optimade/server/mappers/entries.py | 4 +- optimade/server/mappers/trajectories.py | 29 + optimade/server/routers/__init__.py | 2 + optimade/server/routers/trajectories.py | 58 + optimade/server/schemas.py | 4 +- optimade/validator/utils.py | 11 +- .../test_entry_collections.py | 2 + tests/server/query_params/conftest.py | 1 + tests/server/routers/test_structures.py | 16 +- tests/server/routers/test_trajectories.py | 23 + 27 files changed, 75228 insertions(+), 1058 deletions(-) create mode 100644 docs/api_reference/models/trajectories.md create mode 100644 docs/api_reference/server/mappers/trajectories.md create mode 100644 docs/api_reference/server/routers/trajectories.md create mode 100644 optimade/models/trajectories.py create mode 100644 optimade/server/data/test_trajectories.json create mode 100644 optimade/server/mappers/trajectories.py create mode 100644 optimade/server/routers/trajectories.py create mode 100644 tests/server/routers/test_trajectories.py diff --git a/docs/api_reference/models/trajectories.md b/docs/api_reference/models/trajectories.md new file mode 100644 index 000000000..dfe8cc693 --- /dev/null +++ b/docs/api_reference/models/trajectories.md @@ -0,0 +1,5 @@ +# trajectories + +::: optimade.models.trajectories + options: + show_if_no_docstring: true diff --git a/docs/api_reference/server/mappers/trajectories.md b/docs/api_reference/server/mappers/trajectories.md new file mode 100644 index 000000000..6f291e801 --- /dev/null +++ b/docs/api_reference/server/mappers/trajectories.md @@ -0,0 +1,3 @@ +# trajectories + +::: optimade.server.mappers.trajectories diff --git a/docs/api_reference/server/routers/trajectories.md b/docs/api_reference/server/routers/trajectories.md new file mode 100644 index 000000000..ec935992f --- /dev/null +++ b/docs/api_reference/server/routers/trajectories.md @@ -0,0 +1,3 @@ +# trajectories + +::: optimade.server.routers.trajectories diff --git a/openapi/index_openapi.json b/openapi/index_openapi.json index 45b32228c..a4115dcf4 100644 --- a/openapi/index_openapi.json +++ b/openapi/index_openapi.json @@ -509,6 +509,15 @@ ], "title": "Structures", "description": "Object containing links to relationships with entries of the `structures` type." + }, + "trajectories": { + "allOf": [ + { + "$ref": "#/components/schemas/TrajectoryRelationship" + } + ], + "title": "Trajectories", + "description": "Object containing links to relationships with entries of the `trajectories` type." } }, "type": "object", @@ -521,15 +530,15 @@ "type": "string", "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "type": "string", "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "allOf": [ @@ -583,16 +592,16 @@ "type": "string", "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, "last_modified": { "type": "string", "format": "date-time", "title": "Last Modified", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "type": "object", @@ -1130,8 +1139,8 @@ "type": "string", "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "type": "string", @@ -1926,6 +1935,47 @@ "title": "ToplevelLinks", "description": "A set of Links objects, possibly including pagination" }, + "TrajectoryRelationship": { + "properties": { + "links": { + "allOf": [ + { + "$ref": "#/components/schemas/RelationshipLinks" + } + ], + "title": "Links", + "description": "a links object containing at least one of the following: self, related" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/BaseRelationshipResource" + }, + { + "items": { + "$ref": "#/components/schemas/BaseRelationshipResource" + }, + "type": "array" + } + ], + "uniqueItems": true, + "title": "Data", + "description": "Resource linkage" + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/Meta" + } + ], + "title": "Meta", + "description": "a meta object that contains non-standard meta-information about the relationship." + } + }, + "type": "object", + "title": "TrajectoryRelationship", + "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." + }, "Warnings": { "properties": { "id": { diff --git a/openapi/openapi.json b/openapi/openapi.json index 0f61f4d90..37513252b 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1310,44 +1310,25 @@ } } }, - "/versions": { - "get": { - "tags": [ - "Versions" - ], - "summary": "Get Versions", - "description": "Respond with the text/csv representation for the served versions.", - "operationId": "get_versions_versions_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/csv; header=present": { - "schema": { - "type": "string" - } - } - } - } - } - } - }, - "/partial_data/{entry_id}": { + "/trajectories": { "get": { "tags": [ - "partial_data" + "Trajectories" ], - "summary": "Get Partial Data", - "operationId": "get_partial_data_partial_data__entry_id__get", + "summary": "Get Trajectories", + "operationId": "get_trajectories_trajectories_get", "parameters": [ { - "required": true, + "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "required": false, "schema": { "type": "string", - "title": "Entry Id" + "title": "Filter", + "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "default": "" }, - "name": "entry_id", - "in": "path" + "name": "filter", + "in": "query" }, { "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", @@ -1356,7 +1337,7 @@ "type": "string", "title": "Response Format", "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", - "default": "jsonlines" + "default": "json" }, "name": "response_format", "in": "query" @@ -1375,53 +1356,126 @@ "in": "query" }, { - "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "required": false, "schema": { "type": "string", - "pattern": "(v[0-9]+(\\.[0-9]+)?)?", - "title": "Api Hint", - "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", "default": "" }, - "name": "api_hint", + "name": "response_fields", "in": "query" }, { - "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "required": false, "schema": { "type": "string", "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", - "title": "Response Fields", - "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "title": "Sort", + "description": "If supporting sortable queries, an implementation MUST use the `sort` query parameter with format as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-sorting).\n\nAn implementation MAY support multiple sort fields for a single query.\nIf it does, it again MUST conform to the JSON API 1.0 specification.\n\nIf an implementation supports sorting for an entry listing endpoint, then the `/info/` endpoint MUST include, for each field name `` in its `data.properties.` response value that can be used for sorting, the key `sortable` with value `true`.\nIf a field name under an entry listing endpoint supporting sorting cannot be used for sorting, the server MUST either leave out the `sortable` key or set it equal to `false` for the specific field name.\nThe set of field names, with `sortable` equal to `true` are allowed to be used in the \"sort fields\" list according to its definition in the JSON API 1.0 specification.\nThe field `sortable` is in addition to each property description and other OPTIONAL fields.\nAn example is shown in the section Entry Listing Info Endpoints.", "default": "" }, - "name": "response_fields", + "name": "sort", "in": "query" }, { - "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", + "required": false, + "schema": { + "type": "integer", + "minimum": 0.0, + "title": "Page Limit", + "description": "Sets a numerical limit on the number of entries returned.\nSee [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-pagination).\nThe API implementation MUST return no more than the number specified.\nIt MAY return fewer.\nThe database MAY have a maximum limit and not accept larger numbers (in which case an error code -- 403 Forbidden -- MUST be returned).\nThe default limit value is up to the API implementation to decide.\nExample: `http://example.com/optimade/v1/structures?page_limit=100`", + "default": 20 + }, + "name": "page_limit", + "in": "query" + }, + { + "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", + "required": false, + "schema": { + "type": "integer", + "minimum": 0.0, + "title": "Page Offset", + "description": "RECOMMENDED for use with _offset-based_ pagination: using `page_offset` and `page_limit` is RECOMMENDED.\nExample: Skip 50 structures and fetch up to 100: `/structures?page_offset=50&page_limit=100`.", + "default": 0 + }, + "name": "page_offset", + "in": "query" + }, + { + "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`.", + "required": false, + "schema": { + "type": "integer", + "title": "Page Number", + "description": "RECOMMENDED for use with _page-based_ pagination: using `page_number` and `page_limit` is RECOMMENDED.\nIt is RECOMMENDED that the first page has number 1, i.e., that `page_number` is 1-based.\nExample: Fetch page 2 of up to 50 structures per page: `/structures?page_number=2&page_limit=50`." + }, + "name": "page_number", + "in": "query" + }, + { + "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", + "required": false, + "schema": { + "type": "integer", + "minimum": 0.0, + "title": "Page Cursor", + "description": "RECOMMENDED for use with _cursor-based_ pagination: using `page_cursor` and `page_limit` is RECOMMENDED.", + "default": 0 + }, + "name": "page_cursor", + "in": "query" + }, + { + "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`.", "required": false, "schema": { "type": "string", - "title": "Filter", - "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", - "default": "" + "title": "Page Above", + "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.\nExample: Fetch up to 100 structures above sort-field value 4000 (in this example, server chooses to fetch results sorted by increasing `id`, so `page_above` value refers to an `id` value): `/structures?page_above=4000&page_limit=100`." }, - "name": "filter", + "name": "page_above", "in": "query" }, { - "description": "A list of lists which contains a range for each dimension of the property.", + "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED.", "required": false, "schema": { "type": "string", - "title": "Property Ranges", - "description": "A list of lists which contains a range for each dimension of the property.", + "title": "Page Below", + "description": "RECOMMENDED for use with _value-based_ pagination: using `page_above`/`page_below` and `page_limit` is RECOMMENDED." + }, + "name": "page_below", + "in": "query" + }, + { + "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", + "required": false, + "schema": { + "type": "string", + "title": "Include", + "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", + "default": "references" + }, + "name": "include", + "in": "query" + }, + { + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "required": false, + "schema": { + "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", "default": "" }, - "name": "property_ranges", + "name": "api_hint", "in": "query" } ], @@ -1431,7 +1485,7 @@ "content": { "application/vnd.api+json": { "schema": { - "title": "Response Get Partial Data Partial Data Entry Id Get" + "$ref": "#/components/schemas/TrajectoryResponseMany" } } } @@ -1508,101 +1562,476 @@ } } } - } - }, - "components": { - "schemas": { - "Aggregate": { - "enum": [ - "ok", - "test", - "staging", - "no" + }, + "/trajectories/{entry_id}": { + "get": { + "tags": [ + "Trajectories" ], - "title": "Aggregate", - "description": "Enumeration of aggregate values" - }, - "Assembly": { - "properties": { - "sites_in_groups": { - "items": { - "items": { - "type": "integer" - }, - "type": "array" + "summary": "Get Single Trajectory", + "operationId": "get_single_trajectory_trajectories__entry_id__get", + "parameters": [ + { + "required": true, + "schema": { + "type": "string", + "title": "Entry Id" }, - "type": "array", - "title": "Sites In Groups", - "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "name": "entry_id", + "in": "path" }, - "group_probabilities": { - "items": { - "type": "number" + { + "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + "required": false, + "schema": { + "type": "string", + "title": "Response Format", + "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + "default": "json" }, - "type": "array", - "title": "Group Probabilities", - "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" - } - }, - "type": "object", - "required": [ - "sites_in_groups", - "group_probabilities" - ], - "title": "Assembly", - "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." - }, - "Attributes": { - "properties": {}, - "type": "object", - "title": "Attributes", - "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.\nThe keys for Attributes MUST NOT be:\n relationships\n links\n id\n type" - }, - "AvailableApiVersion": { - "properties": { - "url": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "pattern": ".+/v[0-1](\\.[0-9]+)*/?$", - "format": "uri", - "title": "Url", - "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL" + "name": "response_format", + "in": "query" }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "Version", - "description": "A string containing the full version number of the API served at that versioned base URL.\nThe version number string MUST NOT be prefixed by, e.g., 'v'.\nExamples: `1.0.0`, `1.0.0-rc.2`.", - "example": [ - "0.10.1", - "1.0.0-rc.2", - "1.2.3-rc.5+develop" - ] - } - }, - "type": "object", - "required": [ - "url", - "version" - ], - "title": "AvailableApiVersion", - "description": "A JSON object containing information about an available API version" - }, - "BaseInfoAttributes": { - "properties": { - "api_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "Api Version", - "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", - "example": [ - "0.10.1", - "1.0.0-rc.2", + { + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + "required": false, + "schema": { + "type": "string", + "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + "default": "" + }, + "name": "email_address", + "in": "query" + }, + { + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "required": false, + "schema": { + "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "default": "" + }, + "name": "response_fields", + "in": "query" + }, + { + "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", + "required": false, + "schema": { + "type": "string", + "title": "Include", + "description": "A server MAY implement the JSON API concept of returning [compound documents](https://jsonapi.org/format/1.0/#document-compound-documents) by utilizing the `include` query parameter as specified by [JSON API 1.0](https://jsonapi.org/format/1.0/#fetching-includes).\n\nAll related resource objects MUST be returned as part of an array value for the top-level `included` field, see the section JSON Response Schema: Common Fields.\n\nThe value of `include` MUST be a comma-separated list of \"relationship paths\", as defined in the [JSON API](https://jsonapi.org/format/1.0/#fetching-includes).\nIf relationship paths are not supported, or a server is unable to identify a relationship path a `400 Bad Request` response MUST be made.\n\nThe **default value** for `include` is `references`.\nThis means `references` entries MUST always be included under the top-level field `included` as default, since a server assumes if `include` is not specified by a client in the request, it is still specified as `include=references`.\nNote, if a client explicitly specifies `include` and leaves out `references`, `references` resource objects MUST NOT be included under the top-level field `included`, as per the definition of `included`, see section JSON Response Schema: Common Fields.\n\n> **Note**: A query with the parameter `include` set to the empty string means no related resource objects are to be returned under the top-level field `included`.", + "default": "references" + }, + "name": "include", + "in": "query" + }, + { + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "required": false, + "schema": { + "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "default": "" + }, + "name": "api_hint", + "in": "query" + }, + { + "description": "A list of lists which contains a range for each dimension of the property.", + "required": false, + "schema": { + "type": "string", + "title": "Property Ranges", + "description": "A list of lists which contains a range for each dimension of the property." + }, + "name": "property_ranges", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/TrajectoryResponseOne" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "422": { + "description": "Unprocessable Entity", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "501": { + "description": "Not Implemented", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "553": { + "description": "Version Not Supported", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/versions": { + "get": { + "tags": [ + "Versions" + ], + "summary": "Get Versions", + "description": "Respond with the text/csv representation for the served versions.", + "operationId": "get_versions_versions_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/csv; header=present": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/partial_data/{entry_id}": { + "get": { + "tags": [ + "partial_data" + ], + "summary": "Get Partial Data", + "operationId": "get_partial_data_partial_data__entry_id__get", + "parameters": [ + { + "required": true, + "schema": { + "type": "string", + "title": "Entry Id" + }, + "name": "entry_id", + "in": "path" + }, + { + "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + "required": false, + "schema": { + "type": "string", + "title": "Response Format", + "description": "The output format requested (see section Response Format).\nDefaults to the format string 'json', which specifies the standard output format described in this specification.\nExample: `http://example.com/v1/structures?response_format=xml`", + "default": "jsonlines" + }, + "name": "response_format", + "in": "query" + }, + { + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + "required": false, + "schema": { + "type": "string", + "format": "email", + "title": "Email Address", + "description": "An email address of the user making the request.\nThe email SHOULD be that of a person and not an automatic system.\nExample: `http://example.com/v1/structures?email_address=user@example.com`", + "default": "" + }, + "name": "email_address", + "in": "query" + }, + { + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "required": false, + "schema": { + "type": "string", + "pattern": "(v[0-9]+(\\.[0-9]+)?)?", + "title": "Api Hint", + "description": "If the client provides the parameter, the value SHOULD have the format `vMAJOR` or `vMAJOR.MINOR`, where MAJOR is a major version and MINOR is a minor version of the API. For example, if a client appends `api_hint=v1.0` to the query string, the hint provided is for major version 1 and minor version 0.", + "default": "" + }, + "name": "api_hint", + "in": "query" + }, + { + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "required": false, + "schema": { + "type": "string", + "pattern": "([a-z_][a-z_0-9]*(,[a-z_][a-z_0-9]*)*)?", + "title": "Response Fields", + "description": "A comma-delimited set of fields to be provided in the output.\nIf provided, these fields MUST be returned along with the REQUIRED fields.\nOther OPTIONAL fields MUST NOT be returned when this parameter is present.\nExample: `http://example.com/v1/structures?response_fields=last_modified,nsites`", + "default": "" + }, + "name": "response_fields", + "in": "query" + }, + { + "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "required": false, + "schema": { + "type": "string", + "title": "Filter", + "description": "A filter string, in the format described in section API Filtering Format Specification of the specification.", + "default": "" + }, + "name": "filter", + "in": "query" + }, + { + "description": "A list of lists which contains a range for each dimension of the property.", + "required": false, + "schema": { + "type": "string", + "title": "Property Ranges", + "description": "A list of lists which contains a range for each dimension of the property.", + "default": "" + }, + "name": "property_ranges", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/vnd.api+json": { + "schema": { + "title": "Response Get Partial Data Partial Data Entry Id Get" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "422": { + "description": "Unprocessable Entity", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "501": { + "description": "Not Implemented", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "553": { + "description": "Version Not Supported", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Aggregate": { + "enum": [ + "ok", + "test", + "staging", + "no" + ], + "title": "Aggregate", + "description": "Enumeration of aggregate values" + }, + "Assembly": { + "properties": { + "sites_in_groups": { + "items": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "type": "array", + "title": "Sites In Groups", + "description": "Index of the sites (0-based) that belong to each group for each assembly.\n\n- **Examples**:\n - `[[1], [2]]`: two groups, one with the second site, one with the third.\n - `[[1,2], [3]]`: one group with the second and third site, one with the fourth.", + "x-optimade-queryable": "optional", + "x-optimade-support": "must" + }, + "group_probabilities": { + "items": { + "type": "number" + }, + "type": "array", + "title": "Group Probabilities", + "description": "Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\nIt SHOULD sum to one.\nSee below for examples of how to specify the probability of the occurrence of a vacancy.\nThe possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.", + "x-optimade-queryable": "optional", + "x-optimade-support": "must" + } + }, + "type": "object", + "required": [ + "sites_in_groups", + "group_probabilities" + ], + "title": "Assembly", + "description": "A description of groups of sites that are statistically correlated.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site. Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent)." + }, + "Attributes": { + "properties": {}, + "type": "object", + "title": "Attributes", + "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.\nThe keys for Attributes MUST NOT be:\n relationships\n links\n id\n type" + }, + "AvailableApiVersion": { + "properties": { + "url": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "pattern": ".+/v[0-1](\\.[0-9]+)*/?$", + "format": "uri", + "title": "Url", + "description": "A string specifying a versioned base URL that MUST adhere to the rules in section Base URL" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Version", + "description": "A string containing the full version number of the API served at that versioned base URL.\nThe version number string MUST NOT be prefixed by, e.g., 'v'.\nExamples: `1.0.0`, `1.0.0-rc.2`.", + "example": [ + "0.10.1", + "1.0.0-rc.2", + "1.2.3-rc.5+develop" + ] + } + }, + "type": "object", + "required": [ + "url", + "version" + ], + "title": "AvailableApiVersion", + "description": "A JSON object containing information about an available API version" + }, + "BaseInfoAttributes": { + "properties": { + "api_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", + "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", + "example": [ + "0.10.1", + "1.0.0-rc.2", "1.2.3-rc.5+develop" ] }, @@ -1958,6 +2387,15 @@ ], "title": "Structures", "description": "Object containing links to relationships with entries of the `structures` type." + }, + "trajectories": { + "allOf": [ + { + "$ref": "#/components/schemas/TrajectoryRelationship" + } + ], + "title": "Trajectories", + "description": "Object containing links to relationships with entries of the `trajectories` type." } }, "type": "object", @@ -1970,15 +2408,15 @@ "type": "string", "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "type": "string", "title": "Type", "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Example**: `\"structures\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "allOf": [ @@ -2032,16 +2470,16 @@ "type": "string", "title": "Immutable Id", "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, "last_modified": { "type": "string", "format": "date-time", "title": "Last Modified", "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", - "x-optimade-support": "should", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "should" } }, "type": "object", @@ -2296,28 +2734,302 @@ "properties": { "email": { "type": "string", - "format": "email", - "title": "Email", - "description": "the maintainer's email address" + "format": "email", + "title": "Email", + "description": "the maintainer's email address" + } + }, + "type": "object", + "required": [ + "email" + ], + "title": "ImplementationMaintainer", + "description": "Details about the maintainer of the implementation" + }, + "InfoResponse": { + "properties": { + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/BaseInfoResource" + } + ], + "title": "Data", + "description": "The implementations /info data." + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/ResponseMeta" + } + ], + "title": "Meta", + "description": "A meta object containing non-standard information" + }, + "errors": { + "items": { + "$ref": "#/components/schemas/Error" + }, + "type": "array", + "uniqueItems": true, + "title": "Errors", + "description": "A list of unique errors" + }, + "included": { + "items": { + "$ref": "#/components/schemas/Resource" + }, + "type": "array", + "uniqueItems": true, + "title": "Included", + "description": "A list of unique included resources" + }, + "links": { + "allOf": [ + { + "$ref": "#/components/schemas/ToplevelLinks" + } + ], + "title": "Links", + "description": "Links associated with the primary data or errors" + }, + "jsonapi": { + "allOf": [ + { + "$ref": "#/components/schemas/JsonApi" + } + ], + "title": "Jsonapi", + "description": "Information about the JSON API used" + } + }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "InfoResponse", + "description": "errors are not allowed" + }, + "JsonApi": { + "properties": { + "version": { + "type": "string", + "title": "Version", + "description": "Version of the json API used", + "default": "1.0" + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/Meta" + } + ], + "title": "Meta", + "description": "Non-standard meta information" + } + }, + "type": "object", + "title": "JsonApi", + "description": "An object describing the server's implementation" + }, + "Link": { + "properties": { + "href": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri", + "title": "Href", + "description": "a string containing the link\u2019s URL." + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/Meta" + } + ], + "title": "Meta", + "description": "a meta object containing non-standard meta-information about the link." + } + }, + "type": "object", + "required": [ + "href" + ], + "title": "Link", + "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object." + }, + "LinkType": { + "enum": [ + "child", + "root", + "external", + "providers" + ], + "title": "LinkType", + "description": "Enumeration of link_type values" + }, + "LinksResource": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", + "x-optimade-queryable": "must", + "x-optimade-support": "must" + }, + "type": { + "type": "string", + "pattern": "^links$", + "title": "Type", + "description": "These objects are described in detail in the section Links Endpoint", + "default": "links" + }, + "links": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceLinks" + } + ], + "title": "Links", + "description": "a links object containing links related to the resource." + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/EntryMetadata" + } + ], + "title": "Meta", + "description": "A dictionary, containing entry and property-specific metadata for a given entry." + }, + "attributes": { + "allOf": [ + { + "$ref": "#/components/schemas/LinksResourceAttributes" + } + ], + "title": "Attributes", + "description": "A dictionary containing key-value pairs representing the Links resource's properties." + }, + "relationships": { + "allOf": [ + { + "$ref": "#/components/schemas/EntryRelationships" + } + ], + "title": "Relationships", + "description": "A dictionary containing references to other entries according to the description in section Relationships encoded as [JSON API Relationships](https://jsonapi.org/format/1.0/#document-resource-object-relationships).\nThe OPTIONAL human-readable description of the relationship MAY be provided in the `description` field inside the `meta` dictionary of the JSON API resource identifier object." + } + }, + "type": "object", + "required": [ + "id", + "type", + "attributes" + ], + "title": "LinksResource", + "description": "A Links endpoint resource object" + }, + "LinksResourceAttributes": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Human-readable name for the OPTIMADE API implementation, e.g., for use in clients to show the name to the end-user." + }, + "description": { + "type": "string", + "title": "Description", + "description": "Human-readable description for the OPTIMADE API implementation, e.g., for use in clients to show a description to the end-user." + }, + "base_url": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Base Url", + "description": "JSON API links object, pointing to the base URL for this implementation" + }, + "homepage": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Homepage", + "description": "JSON API links object, pointing to a homepage URL for this implementation" + }, + "link_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LinkType" + } + ], + "title": "Link Type", + "description": "The type of the linked relation.\nMUST be one of these values: 'child', 'root', 'external', 'providers'." + }, + "aggregate": { + "allOf": [ + { + "$ref": "#/components/schemas/Aggregate" + } + ], + "title": "Aggregate", + "description": "A string indicating whether a client that is following links to aggregate results from different OPTIMADE implementations should follow this link or not.\nThis flag SHOULD NOT be indicated for links where `link_type` is not `child`.\n\nIf not specified, clients MAY assume that the value is `ok`.\nIf specified, and the value is anything different than `ok`, the client MUST assume that the server is suggesting not to follow the link during aggregation by default (also if the value is not among the known ones, in case a future specification adds new accepted values).\n\nSpecific values indicate the reason why the server is providing the suggestion.\nA client MAY follow the link anyway if it has reason to do so (e.g., if the client is looking for all test databases, it MAY follow the links marked with `aggregate`=`test`).\n\nIf specified, it MUST be one of the values listed in section Link Aggregate Options.", + "default": "ok" + }, + "no_aggregate_reason": { + "type": "string", + "title": "No Aggregate Reason", + "description": "An OPTIONAL human-readable string indicating the reason for suggesting not to aggregate results following the link.\nIt SHOULD NOT be present if `aggregate`=`ok`." } }, "type": "object", "required": [ - "email" + "name", + "description", + "base_url", + "homepage", + "link_type" ], - "title": "ImplementationMaintainer", - "description": "Details about the maintainer of the implementation" + "title": "LinksResourceAttributes", + "description": "Links endpoint resource object attributes" }, - "InfoResponse": { + "LinksResponse": { "properties": { "data": { - "allOf": [ + "anyOf": [ { - "$ref": "#/components/schemas/BaseInfoResource" + "items": { + "$ref": "#/components/schemas/LinksResource" + }, + "type": "array" + }, + { + "items": { + "type": "object" + }, + "type": "array" } ], + "uniqueItems": true, "title": "Data", - "description": "The implementations /info data." + "description": "List of unique OPTIMADE links resource objects." }, "meta": { "allOf": [ @@ -2338,13 +3050,22 @@ "description": "A list of unique errors" }, "included": { - "items": { - "$ref": "#/components/schemas/Resource" - }, - "type": "array", + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EntryResource" + }, + "type": "array" + }, + { + "items": { + "type": "object" + }, + "type": "array" + } + ], "uniqueItems": true, - "title": "Included", - "description": "A list of unique included resources" + "title": "Included" }, "links": { "allOf": [ @@ -2370,16 +3091,59 @@ "data", "meta" ], - "title": "InfoResponse", + "title": "LinksResponse", "description": "errors are not allowed" }, - "JsonApi": { + "Meta": { + "properties": {}, + "type": "object", + "title": "Meta", + "description": "Non-standard meta-information that can not be represented as an attribute or relationship." + }, + "OptimadeError": { "properties": { - "version": { + "id": { "type": "string", - "title": "Version", - "description": "Version of the json API used", - "default": "1.0" + "title": "Id", + "description": "A unique identifier for this particular occurrence of the problem." + }, + "links": { + "allOf": [ + { + "$ref": "#/components/schemas/ErrorLinks" + } + ], + "title": "Links", + "description": "A links object storing about" + }, + "status": { + "type": "string", + "title": "Status", + "description": "the HTTP status code applicable to this problem, expressed as a string value." + }, + "code": { + "type": "string", + "title": "Code", + "description": "an application-specific error code, expressed as a string value." + }, + "title": { + "type": "string", + "title": "Title", + "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." + }, + "detail": { + "type": "string", + "title": "Detail", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "source": { + "allOf": [ + { + "$ref": "#/components/schemas/ErrorSource" + } + ], + "title": "Source", + "description": "An object containing references to the source of the error" }, "meta": { "allOf": [ @@ -2388,22 +3152,148 @@ } ], "title": "Meta", - "description": "Non-standard meta information" + "description": "a meta object containing non-standard meta-information about the error." } }, "type": "object", - "title": "JsonApi", - "description": "An object describing the server's implementation" + "required": [ + "detail" + ], + "title": "OptimadeError", + "description": "detail MUST be present" }, - "Link": { + "PartialDataLink": { "properties": { - "href": { + "link": { "type": "string", "maxLength": 65536, "minLength": 1, "format": "uri", - "title": "Href", - "description": "a string containing the link\u2019s URL." + "title": "Link", + "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL." + }, + "format": { + "type": "string", + "title": "Format", + "description": "String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value \"jsonlines\", which refers to the format in OPTIMADE JSON lines partial data format." + } + }, + "type": "object", + "required": [ + "link", + "format" + ], + "title": "PartialDataLink" + }, + "Periodicity": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "title": "Periodicity", + "description": "Integer enumeration of dimension_types values" + }, + "Person": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Full name of the person, REQUIRED.", + "x-optimade-queryable": "optional", + "x-optimade-support": "must" + }, + "firstname": { + "type": "string", + "title": "Firstname", + "description": "First name of the person.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "lastname": { + "type": "string", + "title": "Lastname", + "description": "Last name of the person.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "Person", + "description": "A person, i.e., an author, editor or other." + }, + "Provider": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "a short name for the database provider" + }, + "description": { + "type": "string", + "title": "Description", + "description": "a longer description of the database provider" + }, + "prefix": { + "type": "string", + "pattern": "^[a-z]([a-z]|[0-9]|_)*$", + "title": "Prefix", + "description": "database-provider-specific prefix as found in section Database-Provider-Specific Namespace Prefixes." + }, + "homepage": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Homepage", + "description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object." + } + }, + "type": "object", + "required": [ + "name", + "description", + "prefix" + ], + "title": "Provider", + "description": "Information on the database provider of the implementation." + }, + "ReferenceRelationship": { + "properties": { + "links": { + "allOf": [ + { + "$ref": "#/components/schemas/RelationshipLinks" + } + ], + "title": "Links", + "description": "a links object containing at least one of the following: self, related" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/BaseRelationshipResource" + }, + { + "items": { + "$ref": "#/components/schemas/BaseRelationshipResource" + }, + "type": "array" + } + ], + "uniqueItems": true, + "title": "Data", + "description": "Resource linkage" }, "meta": { "allOf": [ @@ -2412,41 +3302,30 @@ } ], "title": "Meta", - "description": "a meta object containing non-standard meta-information about the link." + "description": "a meta object that contains non-standard meta-information about the relationship." } }, "type": "object", - "required": [ - "href" - ], - "title": "Link", - "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object." - }, - "LinkType": { - "enum": [ - "child", - "root", - "external", - "providers" - ], - "title": "LinkType", - "description": "Enumeration of link_type values" + "title": "ReferenceRelationship", + "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, - "LinksResource": { + "ReferenceResource": { "properties": { "id": { "type": "string", "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "type": "string", - "pattern": "^links$", + "pattern": "^references$", "title": "Type", - "description": "These objects are described in detail in the section Links Endpoint", - "default": "links" + "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", + "default": "references", + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "allOf": [ @@ -2467,13 +3346,7 @@ "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "allOf": [ - { - "$ref": "#/components/schemas/LinksResourceAttributes" - } - ], - "title": "Attributes", - "description": "A dictionary containing key-value pairs representing the Links resource's properties." + "$ref": "#/components/schemas/ReferenceResourceAttributes" }, "relationships": { "allOf": [ @@ -2491,107 +3364,322 @@ "type", "attributes" ], - "title": "LinksResource", - "description": "A Links endpoint resource object" + "title": "ReferenceResource", + "description": "The `references` entries describe bibliographic references.\n\nThe following properties are used to provide the bibliographic details:\n\n- **address**, **annote**, **booktitle**, **chapter**, **crossref**, **edition**, **howpublished**, **institution**, **journal**, **key**, **month**, **note**, **number**, **organization**, **pages**, **publisher**, **school**, **series**, **title**, **volume**, **year**: meanings of these properties match the [BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf), values are strings;\n- **bib_type**: type of the reference, corresponding to **type** property in the BibTeX specification, value is string;\n- **authors** and **editors**: lists of *person objects* which are dictionaries with the following keys:\n - **name**: Full name of the person, REQUIRED.\n - **firstname**, **lastname**: Parts of the person's name, OPTIONAL.\n- **doi** and **url**: values are strings.\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., any of the properties MAY be `null`.\n - **Query**: Support for queries on any of these properties is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Every references entry MUST contain at least one of the properties." }, - "LinksResourceAttributes": { + "ReferenceResourceAttributes": { "properties": { - "name": { + "immutable_id": { "type": "string", - "title": "Name", - "description": "Human-readable name for the OPTIMADE API implementation, e.g., for use in clients to show the name to the end-user." + "title": "Immutable Id", + "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, - "description": { + "last_modified": { "type": "string", - "title": "Description", - "description": "Human-readable description for the OPTIMADE API implementation, e.g., for use in clients to show a description to the end-user." + "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", + "x-optimade-queryable": "must", + "x-optimade-support": "should" }, - "base_url": { + "authors": { + "items": { + "$ref": "#/components/schemas/Person" + }, + "type": "array", + "title": "Authors", + "description": "List of person objects containing the authors of the reference.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "editors": { + "items": { + "$ref": "#/components/schemas/Person" + }, + "type": "array", + "title": "Editors", + "description": "List of person objects containing the editors of the reference.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "doi": { + "type": "string", + "title": "Doi", + "description": "The digital object identifier of the reference.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "url": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri", + "title": "Url", + "description": "The URL of the reference.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "address": { + "type": "string", + "title": "Address", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "annote": { + "type": "string", + "title": "Annote", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "booktitle": { + "type": "string", + "title": "Booktitle", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "chapter": { + "type": "string", + "title": "Chapter", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "crossref": { + "type": "string", + "title": "Crossref", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "edition": { + "type": "string", + "title": "Edition", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "howpublished": { + "type": "string", + "title": "Howpublished", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "institution": { + "type": "string", + "title": "Institution", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "journal": { + "type": "string", + "title": "Journal", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "key": { + "type": "string", + "title": "Key", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "month": { + "type": "string", + "title": "Month", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "note": { + "type": "string", + "title": "Note", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "number": { + "type": "string", + "title": "Number", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "organization": { + "type": "string", + "title": "Organization", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "pages": { + "type": "string", + "title": "Pages", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "publisher": { + "type": "string", + "title": "Publisher", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "school": { + "type": "string", + "title": "School", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "series": { + "type": "string", + "title": "Series", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "bib_type": { + "type": "string", + "title": "Bib Type", + "description": "Type of the reference, corresponding to the **type** property in the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "volume": { + "type": "string", + "title": "Volume", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "year": { + "type": "string", + "title": "Year", + "description": "Meaning of property matches the BiBTeX specification.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + } + }, + "type": "object", + "required": [ + "last_modified" + ], + "title": "ReferenceResourceAttributes", + "description": "Model that stores the attributes of a reference.\n\nMany properties match the meaning described in the\n[BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf)." + }, + "ReferenceResponseMany": { + "properties": { + "data": { "anyOf": [ { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" + "items": { + "$ref": "#/components/schemas/ReferenceResource" + }, + "type": "array" }, { - "$ref": "#/components/schemas/Link" + "items": { + "type": "object" + }, + "type": "array" + } + ], + "uniqueItems": true, + "title": "Data", + "description": "List of unique OPTIMADE references entry resource objects." + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/ResponseMeta" } ], - "title": "Base Url", - "description": "JSON API links object, pointing to the base URL for this implementation" + "title": "Meta", + "description": "A meta object containing non-standard information" }, - "homepage": { + "errors": { + "items": { + "$ref": "#/components/schemas/Error" + }, + "type": "array", + "uniqueItems": true, + "title": "Errors", + "description": "A list of unique errors" + }, + "included": { "anyOf": [ { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" + "items": { + "$ref": "#/components/schemas/EntryResource" + }, + "type": "array" }, { - "$ref": "#/components/schemas/Link" + "items": { + "type": "object" + }, + "type": "array" } ], - "title": "Homepage", - "description": "JSON API links object, pointing to a homepage URL for this implementation" + "uniqueItems": true, + "title": "Included" }, - "link_type": { + "links": { "allOf": [ { - "$ref": "#/components/schemas/LinkType" + "$ref": "#/components/schemas/ToplevelLinks" } ], - "title": "Link Type", - "description": "The type of the linked relation.\nMUST be one of these values: 'child', 'root', 'external', 'providers'." + "title": "Links", + "description": "Links associated with the primary data or errors" }, - "aggregate": { + "jsonapi": { "allOf": [ { - "$ref": "#/components/schemas/Aggregate" + "$ref": "#/components/schemas/JsonApi" } ], - "title": "Aggregate", - "description": "A string indicating whether a client that is following links to aggregate results from different OPTIMADE implementations should follow this link or not.\nThis flag SHOULD NOT be indicated for links where `link_type` is not `child`.\n\nIf not specified, clients MAY assume that the value is `ok`.\nIf specified, and the value is anything different than `ok`, the client MUST assume that the server is suggesting not to follow the link during aggregation by default (also if the value is not among the known ones, in case a future specification adds new accepted values).\n\nSpecific values indicate the reason why the server is providing the suggestion.\nA client MAY follow the link anyway if it has reason to do so (e.g., if the client is looking for all test databases, it MAY follow the links marked with `aggregate`=`test`).\n\nIf specified, it MUST be one of the values listed in section Link Aggregate Options.", - "default": "ok" - }, - "no_aggregate_reason": { - "type": "string", - "title": "No Aggregate Reason", - "description": "An OPTIONAL human-readable string indicating the reason for suggesting not to aggregate results following the link.\nIt SHOULD NOT be present if `aggregate`=`ok`." + "title": "Jsonapi", + "description": "Information about the JSON API used" } }, "type": "object", "required": [ - "name", - "description", - "base_url", - "homepage", - "link_type" + "data", + "meta" ], - "title": "LinksResourceAttributes", - "description": "Links endpoint resource object attributes" + "title": "ReferenceResponseMany", + "description": "errors are not allowed" }, - "LinksResponse": { + "ReferenceResponseOne": { "properties": { "data": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/LinksResource" - }, - "type": "array" + "$ref": "#/components/schemas/ReferenceResource" }, { - "items": { - "type": "object" - }, - "type": "array" + "type": "object" } ], - "uniqueItems": true, "title": "Data", - "description": "List of unique OPTIMADE links resource objects." + "description": "A single references entry resource." }, "meta": { "allOf": [ @@ -2653,184 +3741,340 @@ "data", "meta" ], - "title": "LinksResponse", + "title": "ReferenceResponseOne", "description": "errors are not allowed" }, - "Meta": { + "RelationshipLinks": { + "properties": { + "self": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Self", + "description": "A link for the relationship itself (a 'relationship link').\nThis link allows the client to directly manipulate the relationship.\nWhen fetched successfully, this link returns the [linkage](https://jsonapi.org/format/1.0/#document-resource-object-linkage) for the related resources as its primary data.\n(See [Fetching Relationships](https://jsonapi.org/format/1.0/#fetching-relationships).)" + }, + "related": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Related", + "description": "A [related resource link](https://jsonapi.org/format/1.0/#document-resource-object-related-resource-links)." + } + }, + "type": "object", + "title": "RelationshipLinks", + "description": "A resource object **MAY** contain references to other resource objects (\"relationships\").\nRelationships may be to-one or to-many.\nRelationships can be specified by including a member in a resource's links object." + }, + "Relationships": { "properties": {}, "type": "object", - "title": "Meta", - "description": "Non-standard meta-information that can not be represented as an attribute or relationship." + "title": "Relationships", + "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.\nKeys MUST NOT be:\n type\n id" }, - "OptimadeError": { + "Resource": { "properties": { "id": { "type": "string", "title": "Id", - "description": "A unique identifier for this particular occurrence of the problem." + "description": "Resource ID" + }, + "type": { + "type": "string", + "title": "Type", + "description": "Resource type" + }, + "links": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceLinks" + } + ], + "title": "Links", + "description": "a links object containing links related to the resource." + }, + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/Meta" + } + ], + "title": "Meta", + "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." + }, + "attributes": { + "allOf": [ + { + "$ref": "#/components/schemas/Attributes" + } + ], + "title": "Attributes", + "description": "an attributes object representing some of the resource\u2019s data." + }, + "relationships": { + "allOf": [ + { + "$ref": "#/components/schemas/Relationships" + } + ], + "title": "Relationships", + "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." + } + }, + "type": "object", + "required": [ + "id", + "type" + ], + "title": "Resource", + "description": "Resource objects appear in a JSON API document to represent resources." + }, + "ResourceLinks": { + "properties": { + "self": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Self", + "description": "A link that identifies the resource represented by the resource object." + } + }, + "type": "object", + "title": "ResourceLinks", + "description": "A Resource Links object" + }, + "ResponseMeta": { + "properties": { + "query": { + "allOf": [ + { + "$ref": "#/components/schemas/ResponseMetaQuery" + } + ], + "title": "Query", + "description": "Information on the Query that was requested" + }, + "api_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "Api Version", + "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", + "example": [ + "0.10.1", + "1.0.0-rc.2", + "1.2.3-rc.5+develop" + ] + }, + "more_data_available": { + "type": "boolean", + "title": "More Data Available", + "description": "`false` if the response contains all data for the request (e.g., a request issued to a single entry endpoint, or a `filter` query at the last page of a paginated response) and `true` if the response is incomplete in the sense that multiple objects match the request, and not all of them have been included in the response (e.g., a query with multiple pages that is not at the last page)." + }, + "schema": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Schema", + "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) that points to a schema for the response.\nIf it is a string, or a dictionary containing no `meta` field, the provided URL MUST point at an [OpenAPI](https://swagger.io/specification/) schema.\nIt is possible that future versions of this specification allows for alternative schema types.\nHence, if the `meta` field of the JSON API links object is provided and contains a field `schema_type` that is not equal to the string `OpenAPI` the client MUST not handle failures to parse the schema or to validate the response against the schema as errors." + }, + "time_stamp": { + "type": "string", + "format": "date-time", + "title": "Time Stamp", + "description": "A timestamp containing the date and time at which the query was executed." + }, + "data_returned": { + "type": "integer", + "minimum": 0.0, + "title": "Data Returned", + "description": "An integer containing the total number of data resource objects returned for the current `filter` query, independent of pagination." }, - "links": { + "provider": { "allOf": [ { - "$ref": "#/components/schemas/ErrorLinks" + "$ref": "#/components/schemas/Provider" } ], - "title": "Links", - "description": "A links object storing about" - }, - "status": { - "type": "string", - "title": "Status", - "description": "the HTTP status code applicable to this problem, expressed as a string value." + "title": "Provider", + "description": "information on the database provider of the implementation." }, - "code": { - "type": "string", - "title": "Code", - "description": "an application-specific error code, expressed as a string value." + "data_available": { + "type": "integer", + "title": "Data Available", + "description": "An integer containing the total number of data resource objects available in the database for the endpoint." }, - "title": { + "last_id": { "type": "string", - "title": "Title", - "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization." + "title": "Last Id", + "description": "a string containing the last ID returned" }, - "detail": { + "response_message": { "type": "string", - "title": "Detail", - "description": "A human-readable explanation specific to this occurrence of the problem." + "title": "Response Message", + "description": "response string from the server" }, - "source": { + "implementation": { "allOf": [ { - "$ref": "#/components/schemas/ErrorSource" + "$ref": "#/components/schemas/Implementation" } ], - "title": "Source", - "description": "An object containing references to the source of the error" + "title": "Implementation", + "description": "a dictionary describing the server implementation" }, - "meta": { - "allOf": [ - { - "$ref": "#/components/schemas/Meta" - } - ], - "title": "Meta", - "description": "a meta object containing non-standard meta-information about the error." + "warnings": { + "items": { + "$ref": "#/components/schemas/Warnings" + }, + "type": "array", + "uniqueItems": true, + "title": "Warnings", + "description": "A list of warning resource objects representing non-critical errors or warnings.\nA warning resource object is defined similarly to a [JSON API error object](http://jsonapi.org/format/1.0/#error-objects), but MUST also include the field `type`, which MUST have the value `\"warning\"`.\nThe field `detail` MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\nThe field `status`, representing a HTTP response status code, MUST NOT be present for a warning resource object.\nThis is an exclusive field for error resource objects." } }, "type": "object", "required": [ - "detail" + "query", + "api_version", + "more_data_available" ], - "title": "OptimadeError", - "description": "detail MUST be present" + "title": "ResponseMeta", + "description": "A [JSON API meta member](https://jsonapi.org/format/1.0#document-meta)\nthat contains JSON API meta objects of non-standard\nmeta-information.\n\nOPTIONAL additional information global to the query that is not\nspecified in this document, MUST start with a\ndatabase-provider-specific prefix." }, - "PartialDataLink": { + "ResponseMetaQuery": { "properties": { - "link": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Link", - "description": "String. A JSON API link that points to a location from which the omitted data can be fetched. There is no requirement on the syntax or format for the link URL." - }, - "format": { + "representation": { "type": "string", - "title": "Format", - "description": "String. The name of the format provided via this link. For one of the objects this format field SHOULD have the value \"jsonlines\", which refers to the format in OPTIMADE JSON lines partial data format." + "title": "Representation", + "description": "A string with the part of the URL following the versioned or unversioned base URL that serves the API.\nQuery parameters that have not been used in processing the request MAY be omitted.\nIn particular, if no query parameters have been involved in processing the request, the query part of the URL MAY be excluded.\nExample: `/structures?filter=nelements=2`" } }, "type": "object", "required": [ - "link", - "format" - ], - "title": "PartialDataLink" - }, - "Periodicity": { - "type": "integer", - "enum": [ - 0, - 1 + "representation" ], - "title": "Periodicity", - "description": "Integer enumeration of dimension_types values" + "title": "ResponseMetaQuery", + "description": "Information on the query that was requested." }, - "Person": { + "Species": { "properties": { "name": { "type": "string", "title": "Name", - "description": "Full name of the person, REQUIRED.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" + "description": "Gives the name of the species; the **name** value MUST be unique in the `species` list.", + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, - "firstname": { - "type": "string", - "title": "Firstname", - "description": "First name of the person.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "chemical_symbols": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Chemical Symbols", + "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, - "lastname": { - "type": "string", - "title": "Lastname", - "description": "Last name of the person.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - } - }, - "type": "object", - "required": [ - "name" - ], - "title": "Person", - "description": "A person, i.e., an author, editor or other." - }, - "Provider": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "a short name for the database provider" + "concentration": { + "items": { + "type": "number" + }, + "type": "array", + "title": "Concentration", + "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", + "x-optimade-queryable": "optional", + "x-optimade-support": "must" }, - "description": { - "type": "string", - "title": "Description", - "description": "a longer description of the database provider" + "mass": { + "items": { + "type": "number" + }, + "type": "array", + "title": "Mass", + "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", + "x-optimade-unit": "a.m.u.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, - "prefix": { + "original_name": { "type": "string", - "pattern": "^[a-z]([a-z]|[0-9]|_)*$", - "title": "Prefix", - "description": "database-provider-specific prefix as found in section Database-Provider-Specific Namespace Prefixes." + "title": "Original Name", + "description": "Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\nNote: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, - "homepage": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Homepage", - "description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object." + "attached": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Attached", + "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "nattached": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Nattached", + "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" } }, "type": "object", "required": [ "name", - "description", - "prefix" + "chemical_symbols", + "concentration" ], - "title": "Provider", - "description": "Information on the database provider of the implementation." + "title": "Species", + "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." }, - "ReferenceRelationship": { + "StructureFeatures": { + "enum": [ + "disorder", + "implicit_atoms", + "site_attachments", + "assemblies" + ], + "title": "StructureFeatures", + "description": "Enumeration of structure_features values" + }, + "StructureRelationship": { "properties": { "links": { "allOf": [ @@ -2868,26 +4112,26 @@ } }, "type": "object", - "title": "ReferenceRelationship", + "title": "StructureRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, - "ReferenceResource": { + "StructureResource": { "properties": { "id": { "type": "string", "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "type": "string", - "pattern": "^references$", + "pattern": "^structures$", "title": "Type", - "description": "The name of the type of an entry.\n- **Type**: string.\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type and ID MUST be returned in response to a request for `//` under the versioned base URL.\n- **Example**: `\"structures\"`", - "default": "references", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", + "default": "structures", + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "allOf": [ @@ -2908,7 +4152,7 @@ "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "$ref": "#/components/schemas/ReferenceResourceAttributes" + "$ref": "#/components/schemas/StructureResourceAttributes" }, "relationships": { "allOf": [ @@ -2926,232 +4170,227 @@ "type", "attributes" ], - "title": "ReferenceResource", - "description": "The `references` entries describe bibliographic references.\n\nThe following properties are used to provide the bibliographic details:\n\n- **address**, **annote**, **booktitle**, **chapter**, **crossref**, **edition**, **howpublished**, **institution**, **journal**, **key**, **month**, **note**, **number**, **organization**, **pages**, **publisher**, **school**, **series**, **title**, **volume**, **year**: meanings of these properties match the [BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf), values are strings;\n- **bib_type**: type of the reference, corresponding to **type** property in the BibTeX specification, value is string;\n- **authors** and **editors**: lists of *person objects* which are dictionaries with the following keys:\n - **name**: Full name of the person, REQUIRED.\n - **firstname**, **lastname**: Parts of the person's name, OPTIONAL.\n- **doi** and **url**: values are strings.\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., any of the properties MAY be `null`.\n - **Query**: Support for queries on any of these properties is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Every references entry MUST contain at least one of the properties." + "title": "StructureResource", + "description": "Representing a structure." }, - "ReferenceResourceAttributes": { + "StructureResourceAttributes": { "properties": { - "immutable_id": { - "type": "string", - "title": "Immutable Id", - "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" - }, - "last_modified": { - "type": "string", - "format": "date-time", - "title": "Last Modified", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", - "x-optimade-support": "should", - "x-optimade-queryable": "must" - }, - "authors": { + "elements": { "items": { - "$ref": "#/components/schemas/Person" + "type": "string" }, "type": "array", - "title": "Authors", - "description": "List of person objects containing the authors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "title": "Elements", + "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", + "x-optimade-queryable": "must", + "x-optimade-support": "should", + "nullable": true + }, + "nelements": { + "type": "integer", + "title": "Nelements", + "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", + "x-optimade-queryable": "must", + "nullable": true, + "x-optimade-support": "should" }, - "editors": { + "elements_ratios": { "items": { - "$ref": "#/components/schemas/Person" + "type": "number" }, "type": "array", - "title": "Editors", - "description": "List of person objects containing the editors of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "doi": { - "type": "string", - "title": "Doi", - "description": "The digital object identifier of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "url": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Url", - "description": "The URL of the reference.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "address": { - "type": "string", - "title": "Address", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "annote": { - "type": "string", - "title": "Annote", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "booktitle": { - "type": "string", - "title": "Booktitle", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "chapter": { - "type": "string", - "title": "Chapter", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "crossref": { - "type": "string", - "title": "Crossref", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "edition": { - "type": "string", - "title": "Edition", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "howpublished": { - "type": "string", - "title": "Howpublished", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "title": "Elements Ratios", + "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", + "x-optimade-queryable": "must", + "x-optimade-support": "should", + "nullable": true }, - "institution": { + "chemical_formula_descriptive": { "type": "string", - "title": "Institution", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "title": "Chemical Formula Descriptive", + "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", + "x-optimade-queryable": "must", + "nullable": true, + "x-optimade-support": "should" }, - "journal": { + "chemical_formula_reduced": { "type": "string", - "title": "Journal", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Reduced", + "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", + "x-optimade-queryable": "must", + "x-optimade-support": "should", + "nullable": true }, - "key": { + "chemical_formula_hill": { "type": "string", - "title": "Key", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Hill", + "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, - "month": { + "chemical_formula_anonymous": { "type": "string", - "title": "Month", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", + "title": "Chemical Formula Anonymous", + "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", + "x-optimade-queryable": "must", + "x-optimade-support": "should", + "nullable": true }, - "note": { - "type": "string", - "title": "Note", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "dimension_types": { + "items": { + "$ref": "#/components/schemas/Periodicity" + }, + "type": "array", + "maxItems": 3, + "minItems": 3, + "title": "Dimension Types", + "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", + "x-optimade-queryable": "optional", + "x-optimade-support": "should", + "nullable": true }, - "number": { - "type": "string", - "title": "Number", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "nperiodic_dimensions": { + "type": "integer", + "title": "Nperiodic Dimensions", + "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", + "x-optimade-queryable": "must", + "nullable": true, + "x-optimade-support": "should" }, - "organization": { - "type": "string", - "title": "Organization", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "lattice_vectors": { + "items": { + "items": { + "type": "number" + }, + "type": "array", + "maxItems": 3, + "minItems": 3 + }, + "type": "array", + "maxItems": 3, + "minItems": 3, + "title": "Lattice Vectors", + "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", + "x-optimade-queryable": "optional", + "x-optimade-support": "should", + "x-optimade-unit": "\u00c5", + "nullable": true }, - "pages": { - "type": "string", - "title": "Pages", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "cartesian_site_positions": { + "items": { + "items": { + "type": "number" + }, + "type": "array", + "maxItems": 3, + "minItems": 3 + }, + "type": "array", + "title": "Cartesian Site Positions", + "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", + "x-optimade-queryable": "optional", + "x-optimade-support": "should", + "x-optimade-unit": "\u00c5", + "nullable": true }, - "publisher": { - "type": "string", - "title": "Publisher", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "nsites": { + "type": "integer", + "title": "Nsites", + "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", + "x-optimade-queryable": "must", + "nullable": true, + "x-optimade-support": "should" }, - "school": { - "type": "string", - "title": "School", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "species": { + "items": { + "$ref": "#/components/schemas/Species" + }, + "type": "array", + "title": "Species", + "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", + "x-optimade-queryable": "optional", + "x-optimade-support": "should", + "nullable": true }, - "series": { - "type": "string", - "title": "Series", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "species_at_sites": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Species At Sites", + "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", + "x-optimade-queryable": "optional", + "x-optimade-support": "should", + "nullable": true }, - "title": { - "type": "string", - "title": "Title", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "assemblies": { + "items": { + "$ref": "#/components/schemas/Assembly" + }, + "type": "array", + "title": "Assemblies", + "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, - "bib_type": { - "type": "string", - "title": "Bib Type", - "description": "Type of the reference, corresponding to the **type** property in the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "structure_features": { + "items": { + "$ref": "#/components/schemas/StructureFeatures" + }, + "type": "array", + "title": "Structure Features", + "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, - "volume": { + "immutable_id": { "type": "string", - "title": "Volume", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "title": "Immutable Id", + "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", + "x-optimade-queryable": "must", + "x-optimade-support": "optional" }, - "year": { + "last_modified": { "type": "string", - "title": "Year", - "description": "Meaning of property matches the BiBTeX specification.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", + "x-optimade-queryable": "must", + "x-optimade-support": "should", + "nullable": true } }, "type": "object", "required": [ + "elements", + "nelements", + "elements_ratios", + "chemical_formula_descriptive", + "chemical_formula_reduced", + "chemical_formula_anonymous", + "nperiodic_dimensions", + "dimension_types", + "cartesian_site_positions", + "lattice_vectors", + "nsites", + "species", + "species_at_sites", + "structure_features", "last_modified" ], - "title": "ReferenceResourceAttributes", - "description": "Model that stores the attributes of a reference.\n\nMany properties match the meaning described in the\n[BibTeX specification](http://bibtexml.sourceforge.net/btxdoc.pdf)." + "title": "StructureResourceAttributes", + "description": "Contains key-value pairs representing the entry's properties." }, - "ReferenceResponseMany": { + "StructureResponseMany": { "properties": { "data": { "anyOf": [ { "items": { - "$ref": "#/components/schemas/ReferenceResource" + "$ref": "#/components/schemas/StructureResource" }, "type": "array" }, @@ -3164,7 +4403,7 @@ ], "uniqueItems": true, "title": "Data", - "description": "List of unique OPTIMADE references entry resource objects." + "description": "List of unique OPTIMADE structures entry resource objects." }, "meta": { "allOf": [ @@ -3226,22 +4465,22 @@ "data", "meta" ], - "title": "ReferenceResponseMany", + "title": "StructureResponseMany", "description": "errors are not allowed" }, - "ReferenceResponseOne": { + "StructureResponseOne": { "properties": { "data": { "anyOf": [ { - "$ref": "#/components/schemas/ReferenceResource" + "$ref": "#/components/schemas/StructureResource" }, { "type": "object" } ], "title": "Data", - "description": "A single references entry resource." + "description": "A single structures entry resource." }, "meta": { "allOf": [ @@ -3303,10 +4542,10 @@ "data", "meta" ], - "title": "ReferenceResponseOne", + "title": "StructureResponseOne", "description": "errors are not allowed" }, - "RelationshipLinks": { + "ToplevelLinks": { "properties": { "self": { "anyOf": [ @@ -3321,7 +4560,7 @@ } ], "title": "Self", - "description": "A link for the relationship itself (a 'relationship link').\nThis link allows the client to directly manipulate the relationship.\nWhen fetched successfully, this link returns the [linkage](https://jsonapi.org/format/1.0/#document-resource-object-linkage) for the related resources as its primary data.\n(See [Fetching Relationships](https://jsonapi.org/format/1.0/#fetching-relationships).)" + "description": "A link to itself" }, "related": { "anyOf": [ @@ -3336,126 +4575,9 @@ } ], "title": "Related", - "description": "A [related resource link](https://jsonapi.org/format/1.0/#document-resource-object-related-resource-links)." - } - }, - "type": "object", - "title": "RelationshipLinks", - "description": "A resource object **MAY** contain references to other resource objects (\"relationships\").\nRelationships may be to-one or to-many.\nRelationships can be specified by including a member in a resource's links object." - }, - "Relationships": { - "properties": {}, - "type": "object", - "title": "Relationships", - "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.\nKeys MUST NOT be:\n type\n id" - }, - "Resource": { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Resource ID" - }, - "type": { - "type": "string", - "title": "Type", - "description": "Resource type" - }, - "links": { - "allOf": [ - { - "$ref": "#/components/schemas/ResourceLinks" - } - ], - "title": "Links", - "description": "a links object containing links related to the resource." - }, - "meta": { - "allOf": [ - { - "$ref": "#/components/schemas/Meta" - } - ], - "title": "Meta", - "description": "a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship." - }, - "attributes": { - "allOf": [ - { - "$ref": "#/components/schemas/Attributes" - } - ], - "title": "Attributes", - "description": "an attributes object representing some of the resource\u2019s data." - }, - "relationships": { - "allOf": [ - { - "$ref": "#/components/schemas/Relationships" - } - ], - "title": "Relationships", - "description": "[Relationships object](https://jsonapi.org/format/1.0/#document-resource-object-relationships)\ndescribing relationships between the resource and other JSON API resources." - } - }, - "type": "object", - "required": [ - "id", - "type" - ], - "title": "Resource", - "description": "Resource objects appear in a JSON API document to represent resources." - }, - "ResourceLinks": { - "properties": { - "self": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Self", - "description": "A link that identifies the resource represented by the resource object." - } - }, - "type": "object", - "title": "ResourceLinks", - "description": "A Resource Links object" - }, - "ResponseMeta": { - "properties": { - "query": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseMetaQuery" - } - ], - "title": "Query", - "description": "Information on the Query that was requested" - }, - "api_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "Api Version", - "description": "Presently used full version of the OPTIMADE API.\nThe version number string MUST NOT be prefixed by, e.g., \"v\".\nExamples: `1.0.0`, `1.0.0-rc.2`.", - "example": [ - "0.10.1", - "1.0.0-rc.2", - "1.2.3-rc.5+develop" - ] - }, - "more_data_available": { - "type": "boolean", - "title": "More Data Available", - "description": "`false` if the response contains all data for the request (e.g., a request issued to a single entry endpoint, or a `filter` query at the last page of a paginated response) and `true` if the response is incomplete in the sense that multiple objects match the request, and not all of them have been included in the response (e.g., a query with multiple pages that is not at the last page)." + "description": "A related resource link" }, - "schema": { + "first": { "anyOf": [ { "type": "string", @@ -3467,176 +4589,60 @@ "$ref": "#/components/schemas/Link" } ], - "title": "Schema", - "description": "A [JSON API links object](http://jsonapi.org/format/1.0/#document-links) that points to a schema for the response.\nIf it is a string, or a dictionary containing no `meta` field, the provided URL MUST point at an [OpenAPI](https://swagger.io/specification/) schema.\nIt is possible that future versions of this specification allows for alternative schema types.\nHence, if the `meta` field of the JSON API links object is provided and contains a field `schema_type` that is not equal to the string `OpenAPI` the client MUST not handle failures to parse the schema or to validate the response against the schema as errors." - }, - "time_stamp": { - "type": "string", - "format": "date-time", - "title": "Time Stamp", - "description": "A timestamp containing the date and time at which the query was executed." - }, - "data_returned": { - "type": "integer", - "minimum": 0.0, - "title": "Data Returned", - "description": "An integer containing the total number of data resource objects returned for the current `filter` query, independent of pagination." - }, - "provider": { - "allOf": [ - { - "$ref": "#/components/schemas/Provider" - } - ], - "title": "Provider", - "description": "information on the database provider of the implementation." - }, - "data_available": { - "type": "integer", - "title": "Data Available", - "description": "An integer containing the total number of data resource objects available in the database for the endpoint." - }, - "last_id": { - "type": "string", - "title": "Last Id", - "description": "a string containing the last ID returned" - }, - "response_message": { - "type": "string", - "title": "Response Message", - "description": "response string from the server" - }, - "implementation": { - "allOf": [ - { - "$ref": "#/components/schemas/Implementation" - } - ], - "title": "Implementation", - "description": "a dictionary describing the server implementation" - }, - "warnings": { - "items": { - "$ref": "#/components/schemas/Warnings" - }, - "type": "array", - "uniqueItems": true, - "title": "Warnings", - "description": "A list of warning resource objects representing non-critical errors or warnings.\nA warning resource object is defined similarly to a [JSON API error object](http://jsonapi.org/format/1.0/#error-objects), but MUST also include the field `type`, which MUST have the value `\"warning\"`.\nThe field `detail` MUST be present and SHOULD contain a non-critical message, e.g., reporting unrecognized search attributes or deprecated features.\nThe field `status`, representing a HTTP response status code, MUST NOT be present for a warning resource object.\nThis is an exclusive field for error resource objects." - } - }, - "type": "object", - "required": [ - "query", - "api_version", - "more_data_available" - ], - "title": "ResponseMeta", - "description": "A [JSON API meta member](https://jsonapi.org/format/1.0#document-meta)\nthat contains JSON API meta objects of non-standard\nmeta-information.\n\nOPTIONAL additional information global to the query that is not\nspecified in this document, MUST start with a\ndatabase-provider-specific prefix." - }, - "ResponseMetaQuery": { - "properties": { - "representation": { - "type": "string", - "title": "Representation", - "description": "A string with the part of the URL following the versioned or unversioned base URL that serves the API.\nQuery parameters that have not been used in processing the request MAY be omitted.\nIn particular, if no query parameters have been involved in processing the request, the query part of the URL MAY be excluded.\nExample: `/structures?filter=nelements=2`" - } - }, - "type": "object", - "required": [ - "representation" - ], - "title": "ResponseMetaQuery", - "description": "Information on the query that was requested." - }, - "Species": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Gives the name of the species; the **name** value MUST be unique in the `species` list.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" - }, - "chemical_symbols": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Chemical Symbols", - "description": "MUST be a list of strings of all chemical elements composing this species. Each item of the list MUST be one of the following:\n\n- a valid chemical-element symbol, or\n- the special value `\"X\"` to represent a non-chemical element, or\n- the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\nIf any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" - }, - "concentration": { - "items": { - "type": "number" - }, - "type": "array", - "title": "Concentration", - "description": "MUST be a list of floats, with same length as `chemical_symbols`. The numbers represent the relative concentration of the corresponding chemical symbol in this species. The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n- Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n- Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\nNote that concentrations are uncorrelated between different site (even of the same species).", - "x-optimade-support": "must", - "x-optimade-queryable": "optional" - }, - "mass": { - "items": { - "type": "number" - }, - "type": "array", - "title": "Mass", - "description": "If present MUST be a list of floats expressed in a.m.u.\nElements denoting vacancies MUST have masses equal to 0.", - "x-optimade-unit": "a.m.u.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" - }, - "original_name": { - "type": "string", - "title": "Original Name", - "description": "Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\nNote: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "title": "First", + "description": "The first page of data" }, - "attached": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Attached", - "description": "If provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "last": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Last", + "description": "The last page of data" }, - "nattached": { - "items": { - "type": "integer" - }, - "type": "array", - "title": "Nattached", - "description": "If provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the :field:`attached` key.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "prev": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Prev", + "description": "The previous page of data" + }, + "next": { + "anyOf": [ + { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + { + "$ref": "#/components/schemas/Link" + } + ], + "title": "Next", + "description": "The next page of data" } }, "type": "object", - "required": [ - "name", - "chemical_symbols", - "concentration" - ], - "title": "Species", - "description": "A list describing the species of the sites of this structure.\n\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a\nstatistical occupation of a given site by multiple chemical elements, and/or a\nlocation to which there are attached atoms, i.e., atoms whose precise location are\nunknown beyond that they are attached to that position (frequently used to indicate\nhydrogen atoms attached to another element, e.g., a carbon with three attached\nhydrogens might represent a methyl group, -CH3).\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms." - }, - "StructureFeatures": { - "enum": [ - "disorder", - "implicit_atoms", - "site_attachments", - "assemblies" - ], - "title": "StructureFeatures", - "description": "Enumeration of structure_features values" + "title": "ToplevelLinks", + "description": "A set of Links objects, possibly including pagination" }, - "StructureRelationship": { + "TrajectoryRelationship": { "properties": { "links": { "allOf": [ @@ -3674,26 +4680,27 @@ } }, "type": "object", - "title": "StructureRelationship", + "title": "TrajectoryRelationship", "description": "Similar to normal JSON API relationship, but with addition of OPTIONAL meta field for a resource." }, - "StructureResource": { + "TrajectoryResource": { "properties": { "id": { "type": "string", "title": "Id", "description": "An entry's ID as defined in section Definition of Terms.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n\n- **Examples**:\n - `\"db/1234567\"`\n - `\"cod/2000000\"`\n - `\"cod/2000000@1234567\"`\n - `\"nomad/L1234567890\"`\n - `\"42\"`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "type": { "type": "string", - "pattern": "^structures$", + "const": "trajectories", + "pattern": "^trajectories$", "title": "Type", - "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"structures\"`", - "default": "structures", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "description": "The name of the type of an entry.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response.\n - MUST be an existing entry type.\n - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL.\n\n- **Examples**:\n - `\"trajectories\"`", + "default": "trajectories", + "x-optimade-queryable": "must", + "x-optimade-support": "must" }, "links": { "allOf": [ @@ -3714,7 +4721,7 @@ "description": "A dictionary, containing entry and property-specific metadata for a given entry." }, "attributes": { - "$ref": "#/components/schemas/StructureResourceAttributes" + "$ref": "#/components/schemas/TrajectoryResourceAttributes" }, "relationships": { "allOf": [ @@ -3732,27 +4739,11 @@ "type", "attributes" ], - "title": "StructureResource", - "description": "Representing a structure." + "title": "TrajectoryResource", + "description": "Representing a trajectory." }, - "StructureResourceAttributes": { + "TrajectoryResourceAttributes": { "properties": { - "immutable_id": { - "type": "string", - "title": "Immutable Id", - "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", - "x-optimade-support": "optional", - "x-optimade-queryable": "must" - }, - "last_modified": { - "type": "string", - "format": "date-time", - "title": "Last Modified", - "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", - "nullable": true, - "x-optimade-support": "should", - "x-optimade-queryable": "must" - }, "elements": { "items": { "type": "string" @@ -3760,17 +4751,17 @@ "type": "array", "title": "Elements", "description": "The chemical symbols of the different elements present in the structure.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The strings are the chemical symbols, i.e., either a single uppercase letter or an uppercase letter followed by a number of lowercase letters.\n - The order MUST be alphabetical.\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements_ratios`, if the latter is provided.\n - Note: This property SHOULD NOT contain the string \"X\" to indicate non-chemical elements or \"vacancy\" to indicate vacancies (in contrast to the field `chemical_symbols` for the `species` property).\n\n- **Examples**:\n - `[\"Si\"]`\n - `[\"Al\",\"O\",\"Si\"]`\n\n- **Query examples**:\n - A filter that matches all records of structures that contain Si, Al **and** O, and possibly other elements: `elements HAS ALL \"Si\", \"Al\", \"O\"`.\n - To match structures with exactly these three elements, use `elements HAS ALL \"Si\", \"Al\", \"O\" AND elements LENGTH 3`.\n - Note: length queries on this property can be equivalently formulated by filtering on the `nelements`_ property directly.", - "nullable": true, + "x-optimade-queryable": "must", "x-optimade-support": "should", - "x-optimade-queryable": "must" + "nullable": true }, "nelements": { "type": "integer", "title": "Nelements", "description": "Number of different elements in the structure as an integer.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - MUST be equal to the lengths of the list properties `elements` and `elements_ratios`, if they are provided.\n\n- **Examples**:\n - `3`\n\n- **Querying**:\n - Note: queries on this property can equivalently be formulated using `elements LENGTH`.\n - A filter that matches structures that have exactly 4 elements: `nelements=4`.\n - A filter that matches structures that have between 2 and 7 elements: `nelements>=2 AND nelements<=7`.", - "x-optimade-support": "should", + "x-optimade-queryable": "must", "nullable": true, - "x-optimade-queryable": "must" + "x-optimade-support": "should" }, "elements_ratios": { "items": { @@ -3779,43 +4770,43 @@ "type": "array", "title": "Elements Ratios", "description": "Relative proportions of different elements in the structure.\n\n- **Type**: list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - Composed by the proportions of elements in the structure as a list of floating point numbers.\n - The sum of the numbers MUST be 1.0 (within floating point accuracy)\n - MUST refer to the same elements in the same order, and therefore be of the same length, as `elements`, if the latter is provided.\n\n- **Examples**:\n - `[1.0]`\n - `[0.3333333333333333, 0.2222222222222222, 0.4444444444444444]`\n\n- **Query examples**:\n - Note: Useful filters can be formulated using the set operator syntax for correlated values.\n However, since the values are floating point values, the use of equality comparisons is generally inadvisable.\n - OPTIONAL: a filter that matches structures where approximately 1/3 of the atoms in the structure are the element Al is: `elements:elements_ratios HAS ALL \"Al\":>0.3333, \"Al\":<0.3334`.", - "nullable": true, + "x-optimade-queryable": "must", "x-optimade-support": "should", - "x-optimade-queryable": "must" + "nullable": true }, "chemical_formula_descriptive": { "type": "string", "title": "Chemical Formula Descriptive", "description": "The chemical formula for a structure as a string in a form chosen by the API implementation.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The chemical formula is given as a string consisting of properly capitalized element symbols followed by integers or decimal numbers, balanced parentheses, square, and curly brackets `(`,`)`, `[`,`]`, `{`, `}`, commas, the `+`, `-`, `:` and `=` symbols. The parentheses are allowed to be followed by a number. Spaces are allowed anywhere except within chemical symbols. The order of elements and any groupings indicated by parentheses or brackets are chosen freely by the API implementation.\n - The string SHOULD be arithmetically consistent with the element ratios in the `chemical_formula_reduced` property.\n - It is RECOMMENDED, but not mandatory, that symbols, parentheses and brackets, if used, are used with the meanings prescribed by [IUPAC's Nomenclature of Organic Chemistry](https://www.qmul.ac.uk/sbcs/iupac/bibliog/blue.html).\n\n- **Examples**:\n - `\"(H2O)2 Na\"`\n - `\"NaCl\"`\n - `\"CaCO3\"`\n - `\"CCaO3\"`\n - `\"(CH3)3N+ - [CH2]2-OH = Me3N+ - CH2 - CH2OH\"`\n\n- **Query examples**:\n - Note: the free-form nature of this property is likely to make queries on it across different databases inconsistent.\n - A filter that matches an exactly given formula: `chemical_formula_descriptive=\"(H2O)2 Na\"`.\n - A filter that does a partial match: `chemical_formula_descriptive CONTAINS \"H2O\"`.", - "x-optimade-support": "should", + "x-optimade-queryable": "must", "nullable": true, - "x-optimade-queryable": "must" + "x-optimade-support": "should" }, "chemical_formula_reduced": { "type": "string", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "title": "Chemical Formula Reduced", "description": "The reduced chemical formula for a structure as a string with element symbols and integer chemical proportion numbers.\nThe proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n Intricate queries on formula components are instead suggested to be formulated using set-type filter operators on the multi valued `elements` and `elements_ratios` properties.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in alphabetical order, followed by their integer chemical proportion number.\n - For structures with no partial occupation, the chemical proportion numbers are the smallest integers for which the chemical proportion is exactly correct.\n - For structures with partial occupation, the chemical proportion numbers are integers that within reasonable approximation indicate the correct chemical proportions. The precise details of how to perform the rounding is chosen by the API implementation.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2NaO\"`\n - `\"ClNa\"`\n - `\"CCaO3\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_reduced=\"H2NaO\"`.", - "nullable": true, + "x-optimade-queryable": "must", "x-optimade-support": "should", - "x-optimade-queryable": "must" + "nullable": true }, "chemical_formula_hill": { "type": "string", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "title": "Chemical Formula Hill", "description": "The chemical formula for a structure in [Hill form](https://dx.doi.org/10.1021/ja02046a005) with element symbols followed by integer chemical proportion numbers. The proportion number MUST be omitted if it is 1.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, only a subset of the filter features MAY be supported.\n - The overall scale factor of the chemical proportions is chosen such that the resulting values are integers that indicate the most chemically relevant unit of which the system is composed.\n For example, if the structure is a repeating unit cell with four hydrogens and four oxygens that represents two hydroperoxide molecules, `chemical_formula_hill` is `\"H2O2\"` (i.e., not `\"HO\"`, nor `\"H4O4\"`).\n - If the chemical insight needed to ascribe a Hill formula to the system is not present, the property MUST be handled as unset.\n - Element symbols MUST have proper capitalization (e.g., `\"Si\"`, not `\"SI\"` for \"silicon\").\n - Elements MUST be placed in [Hill order](https://dx.doi.org/10.1021/ja02046a005), followed by their integer chemical proportion number.\n Hill order means: if carbon is present, it is placed first, and if also present, hydrogen is placed second.\n After that, all other elements are ordered alphabetically.\n If carbon is not present, all elements are ordered alphabetically.\n - If the system has sites with partial occupation and the total occupations of each element do not all sum up to integers, then the Hill formula SHOULD be handled as unset.\n - No spaces or separators are allowed.\n\n- **Examples**:\n - `\"H2O2\"`\n\n- **Query examples**:\n - A filter that matches an exactly given formula is `chemical_formula_hill=\"H2O2\"`.", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "chemical_formula_anonymous": { "type": "string", "pattern": "(^$)|^([A-Z][a-z]?([2-9]|[1-9]\\d+)?)+$", "title": "Chemical Formula Anonymous", "description": "The anonymous formula is the `chemical_formula_reduced`, but where the elements are instead first ordered by their chemical proportion number, and then, in order left to right, replaced by anonymous symbols A, B, C, ..., Z, Aa, Ba, ..., Za, Ab, Bb, ... and so on.\n\n- **Type**: string\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property.\n However, support for filters using partial string matching with this property is OPTIONAL (i.e., BEGINS WITH, ENDS WITH, and CONTAINS).\n\n- **Examples**:\n - `\"A2B\"`\n - `\"A42B42C16D12E10F9G5\"`\n\n- **Querying**:\n - A filter that matches an exactly given formula is `chemical_formula_anonymous=\"A2B\"`.", - "nullable": true, + "x-optimade-queryable": "must", "x-optimade-support": "should", - "x-optimade-queryable": "must" + "nullable": true }, "dimension_types": { "items": { @@ -3826,17 +4817,17 @@ "minItems": 3, "title": "Dimension Types", "description": "List of three integers.\nFor each of the three directions indicated by the three lattice vectors (see property `lattice_vectors`), this list indicates if the direction is periodic (value `1`) or non-periodic (value `0`).\nNote: the elements in this list each refer to the direction of the corresponding entry in `lattice_vectors` and *not* the Cartesian x, y, z directions.\n\n- **Type**: list of integers.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n - MUST be a list of length 3.\n - Each integer element MUST assume only the value 0 or 1.\n\n- **Examples**:\n - For a molecule: `[0, 0, 0]`\n - For a wire along the direction specified by the third lattice vector: `[0, 0, 1]`\n - For a 2D surface/slab, periodic on the plane defined by the first and third lattice vectors: `[1, 0, 1]`\n - For a bulk 3D system: `[1, 1, 1]`", - "x-optimade-support": "should", "x-optimade-queryable": "optional", + "x-optimade-support": "should", "nullable": true }, "nperiodic_dimensions": { "type": "integer", "title": "Nperiodic Dimensions", "description": "An integer specifying the number of periodic dimensions in the structure, equivalent to the number of non-zero entries in `dimension_types`.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be between 0 and 3 inclusive and MUST be equal to the sum of the items in the `dimension_types` property.\n - This property only reflects the treatment of the lattice vectors provided for the structure, and not any physical interpretation of the dimensionality of its contents.\n\n- **Examples**:\n - `2` should be indicated in cases where `dimension_types` is any of `[1, 1, 0]`, `[1, 0, 1]`, `[0, 1, 1]`.\n\n- **Query examples**:\n - Match only structures with exactly 3 periodic dimensions: `nperiodic_dimensions=3`\n - Match all structures with 2 or fewer periodic dimensions: `nperiodic_dimensions<=2`", - "x-optimade-support": "should", + "x-optimade-queryable": "must", "nullable": true, - "x-optimade-queryable": "must" + "x-optimade-support": "should" }, "lattice_vectors": { "items": { @@ -3852,8 +4843,8 @@ "minItems": 3, "title": "Lattice Vectors", "description": "The three lattice vectors in Cartesian coordinates, in \u00e5ngstr\u00f6m (\u00c5).\n\n- **Type**: list of list of floats or unknown values.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST be a list of three vectors *a*, *b*, and *c*, where each of the vectors MUST BE a list of the vector's coordinates along the x, y, and z Cartesian coordinates.\n (Therefore, the first index runs over the three lattice vectors and the second index runs over the x, y, z Cartesian coordinates).\n - For databases that do not define an absolute Cartesian system (e.g., only defining the length and angles between vectors), the first lattice vector SHOULD be set along *x* and the second on the *xy*-plane.\n - MUST always contain three vectors of three coordinates each, independently of the elements of property `dimension_types`.\n The vectors SHOULD by convention be chosen so the determinant of the `lattice_vectors` matrix is different from zero.\n The vectors in the non-periodic directions have no significance beyond fulfilling these requirements.\n - The coordinates of the lattice vectors of non-periodic dimensions (i.e., those dimensions for which `dimension_types` is `0`) MAY be given as a list of all `null` values.\n If a lattice vector contains the value `null`, all coordinates of that lattice vector MUST be `null`.\n\n- **Examples**:\n - `[[4.0,0.0,0.0],[0.0,4.0,0.0],[0.0,1.0,4.0]]` represents a cell, where the first vector is `(4, 0, 0)`, i.e., a vector aligned along the `x` axis of length 4 \u00c5; the second vector is `(0, 4, 0)`; and the third vector is `(0, 1, 4)`.", - "x-optimade-support": "should", "x-optimade-queryable": "optional", + "x-optimade-support": "should", "x-optimade-unit": "\u00c5", "nullable": true }, @@ -3869,8 +4860,8 @@ "type": "array", "title": "Cartesian Site Positions", "description": "Cartesian positions of each site in the structure.\nA site is usually used to describe positions of atoms; what atoms can be encountered at a given site is conveyed by the `species_at_sites` property, and the species themselves are described in the `species` property.\n\n- **Type**: list of list of floats\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - It MUST be a list of length equal to the number of sites in the structure, where every element is a list of the three Cartesian coordinates of a site expressed as float values in the unit angstrom (\u00c5).\n - An entry MAY have multiple sites at the same Cartesian position (for a relevant use of this, see e.g., the property `assemblies`).\n\n- **Examples**:\n - `[[0,0,0],[0,0,2]]` indicates a structure with two sites, one sitting at the origin and one along the (positive) *z*-axis, 2 \u00c5 away from the origin.", - "x-optimade-support": "should", "x-optimade-queryable": "optional", + "x-optimade-support": "should", "x-optimade-unit": "\u00c5", "nullable": true }, @@ -3878,9 +4869,9 @@ "type": "integer", "title": "Nsites", "description": "An integer specifying the length of the `cartesian_site_positions` property.\n\n- **Type**: integer\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `42`\n\n- **Query examples**:\n - Match only structures with exactly 4 sites: `nsites=4`\n - Match structures that have between 2 and 7 sites: `nsites>=2 AND nsites<=7`", - "x-optimade-support": "should", + "x-optimade-queryable": "must", "nullable": true, - "x-optimade-queryable": "must" + "x-optimade-support": "should" }, "species": { "items": { @@ -3889,9 +4880,9 @@ "type": "array", "title": "Species", "description": "A list describing the species of the sites of this structure.\nSpecies can represent pure chemical elements, virtual-crystal atoms representing a statistical occupation of a given site by multiple chemical elements, and/or a location to which there are attached atoms, i.e., atoms whose precise location are unknown beyond that they are attached to that position (frequently used to indicate hydrogen atoms attached to another element, e.g., a carbon with three attached hydrogens might represent a methyl group, -CH3).\n\n- **Type**: list of dictionary with keys:\n - `name`: string (REQUIRED)\n - `chemical_symbols`: list of strings (REQUIRED)\n - `concentration`: list of float (REQUIRED)\n - `attached`: list of strings (REQUIRED)\n - `nattached`: list of integers (OPTIONAL)\n - `mass`: list of floats (OPTIONAL)\n - `original_name`: string (OPTIONAL).\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - Each list member MUST be a dictionary with the following keys:\n - **name**: REQUIRED; gives the name of the species; the **name** value MUST be unique in the `species` list;\n - **chemical_symbols**: REQUIRED; MUST be a list of strings of all chemical elements composing this species.\n Each item of the list MUST be one of the following:\n - a valid chemical-element symbol, or\n - the special value `\"X\"` to represent a non-chemical element, or\n - the special value `\"vacancy\"` to represent that this site has a non-zero probability of having a vacancy (the respective probability is indicated in the `concentration` list, see below).\n\n If any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element, the correct flag MUST be set in the list `structure_features`.\n\n - **concentration**: REQUIRED; MUST be a list of floats, with same length as `chemical_symbols`.\n The numbers represent the relative concentration of the corresponding chemical symbol in this species.\n The numbers SHOULD sum to one. Cases in which the numbers do not sum to one typically fall only in the following two categories:\n\n - Numerical errors when representing float numbers in fixed precision, e.g. for two chemical symbols with concentrations `1/3` and `2/3`, the concentration might look something like `[0.33333333333, 0.66666666666]`. If the client is aware that the sum is not one because of numerical precision, it can renormalize the values so that the sum is exactly one.\n - Experimental errors in the data present in the database. In this case, it is the responsibility of the client to decide how to process the data.\n\n Note that concentrations are uncorrelated between different sites (even of the same species).\n\n - **attached**: OPTIONAL; if provided MUST be a list of length 1 or more of strings of chemical symbols for the elements attached to this site, or \"X\" for a non-chemical element.\n\n - **nattached**: OPTIONAL; if provided MUST be a list of length 1 or more of integers indicating the number of attached atoms of the kind specified in the value of the `attached` key.\n\n The implementation MUST include either both or none of the `attached` and `nattached` keys, and if they are provided, they MUST be of the same length.\n Furthermore, if they are provided, the `structure_features` property MUST include the string `site_attachments`.\n\n - **mass**: OPTIONAL. If present MUST be a list of floats, with the same length as `chemical_symbols`, providing element masses expressed in a.m.u.\n Elements denoting vacancies MUST have masses equal to 0.\n\n - **original_name**: OPTIONAL. Can be any valid Unicode string, and SHOULD contain (if specified) the name of the species that is used internally in the source database.\n\n Note: With regards to \"source database\", we refer to the immediate source being queried via the OPTIMADE API implementation.\n\n The main use of this field is for source databases that use species names, containing characters that are not allowed (see description of the list property `species_at_sites`).\n\n - For systems that have only species formed by a single chemical symbol, and that have at most one species per chemical symbol, SHOULD use the chemical symbol as species name (e.g., `\"Ti\"` for titanium, `\"O\"` for oxygen, etc.)\n However, note that this is OPTIONAL, and client implementations MUST NOT assume that the key corresponds to a chemical symbol, nor assume that if the species name is a valid chemical symbol, that it represents a species with that chemical symbol.\n This means that a species `{\"name\": \"C\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]}` is valid and represents a titanium species (and *not* a carbon species).\n - It is NOT RECOMMENDED that a structure includes species that do not have at least one corresponding site.\n\n- **Examples**:\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\"], \"concentration\": [1.0]} ]`: any site with this species is occupied by a Ti atom.\n - `[ {\"name\": \"Ti\", \"chemical_symbols\": [\"Ti\", \"vacancy\"], \"concentration\": [0.9, 0.1]} ]`: any site with this species is occupied by a Ti atom with 90 % probability, and has a vacancy with 10 % probability.\n - `[ {\"name\": \"BaCa\", \"chemical_symbols\": [\"vacancy\", \"Ba\", \"Ca\"], \"concentration\": [0.05, 0.45, 0.5], \"mass\": [0.0, 137.327, 40.078]} ]`: any site with this species is occupied by a Ba atom with 45 % probability, a Ca atom with 50 % probability, and by a vacancy with 5 % probability. The mass of this site is (on average) 88.5 a.m.u.\n - `[ {\"name\": \"C12\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [12.0]} ]`: any site with this species is occupied by a carbon isotope with mass 12.\n - `[ {\"name\": \"C13\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"mass\": [13.0]} ]`: any site with this species is occupied by a carbon isotope with mass 13.\n - `[ {\"name\": \"CH3\", \"chemical_symbols\": [\"C\"], \"concentration\": [1.0], \"attached\": [\"H\"], \"nattached\": [3]} ]`: any site with this species is occupied by a methyl group, -CH3, which is represented without specifying precise positions of the hydrogen atoms.", - "nullable": true, + "x-optimade-queryable": "optional", "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "nullable": true }, "species_at_sites": { "items": { @@ -3900,9 +4891,9 @@ "type": "array", "title": "Species At Sites", "description": "Name of the species at each site (where values for sites are specified with the same order of the property `cartesian_site_positions`).\nThe properties of the species are found in the property `species`.\n\n- **Type**: list of strings.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - MUST have length equal to the number of sites in the structure (first dimension of the list property `cartesian_site_positions`).\n - Each species name mentioned in the `species_at_sites` list MUST be described in the list property `species` (i.e. for each value in the `species_at_sites` list there MUST exist exactly one dictionary in the `species` list with the `name` attribute equal to the corresponding `species_at_sites` value).\n - Each site MUST be associated only to a single species.\n **Note**: However, species can represent mixtures of atoms, and multiple species MAY be defined for the same chemical element.\n This latter case is useful when different atoms of the same type need to be grouped or distinguished, for instance in simulation codes to assign different initial spin states.\n\n- **Examples**:\n - `[\"Ti\",\"O2\"]` indicates that the first site is hosting a species labeled `\"Ti\"` and the second a species labeled `\"O2\"`.\n - `[\"Ac\", \"Ac\", \"Ag\", \"Ir\"]` indicating the first two sites contains the `\"Ac\"` species, while the third and fourth sites contain the `\"Ag\"` and `\"Ir\"` species, respectively.", - "nullable": true, + "x-optimade-queryable": "optional", "x-optimade-support": "should", - "x-optimade-queryable": "optional" + "nullable": true }, "assemblies": { "items": { @@ -3911,8 +4902,8 @@ "type": "array", "title": "Assemblies", "description": "A description of groups of sites that are statistically correlated.\n\n- **Type**: list of dictionary with keys:\n - `sites_in_groups`: list of list of integers (REQUIRED)\n - `group_probabilities`: list of floats (REQUIRED)\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n - The property SHOULD be `null` for entries that have no partial occupancies.\n - If present, the correct flag MUST be set in the list `structure_features`.\n - Client implementations MUST check its presence (as its presence changes the interpretation of the structure).\n - If present, it MUST be a list of dictionaries, each of which represents an assembly and MUST have the following two keys:\n - **sites_in_groups**: Index of the sites (0-based) that belong to each group for each assembly.\n\n Example: `[[1], [2]]`: two groups, one with the second site, one with the third.\n Example: `[[1,2], [3]]`: one group with the second and third site, one with the fourth.\n\n - **group_probabilities**: Statistical probability of each group. It MUST have the same length as `sites_in_groups`.\n It SHOULD sum to one.\n See below for examples of how to specify the probability of the occurrence of a vacancy.\n The possible reasons for the values not to sum to one are the same as already specified above for the `concentration` of each `species`.\n\n - If a site is not present in any group, it means that it is present with 100 % probability (as if no assembly was specified).\n - A site MUST NOT appear in more than one group.\n\n- **Examples** (for each entry of the assemblies list):\n - `{\"sites_in_groups\": [[0], [1]], \"group_probabilities: [0.3, 0.7]}`: the first site and the second site never occur at the same time in the unit cell.\n Statistically, 30 % of the times the first site is present, while 70 % of the times the second site is present.\n - `{\"sites_in_groups\": [[1,2], [3]], \"group_probabilities: [0.3, 0.7]}`: the second and third site are either present together or not present; they form the first group of atoms for this assembly.\n The second group is formed by the fourth site.\n Sites of the first group (the second and the third) are never present at the same time as the fourth site.\n 30 % of times sites 1 and 2 are present (and site 3 is absent); 70 % of times site 3 is present (and sites 1 and 2 are absent).\n\n- **Notes**:\n - Assemblies are essential to represent, for instance, the situation where an atom can statistically occupy two different positions (sites).\n\n - By defining groups, it is possible to represent, e.g., the case where a functional molecule (and not just one atom) is either present or absent (or the case where it it is present in two conformations)\n\n - Considerations on virtual alloys and on vacancies: In the special case of a virtual alloy, these specifications allow two different, equivalent ways of specifying them.\n For instance, for a site at the origin with 30 % probability of being occupied by Si, 50 % probability of being occupied by Ge, and 20 % of being a vacancy, the following two representations are possible:\n\n - Using a single species:\n ```json\n {\n \"cartesian_site_positions\": [[0,0,0]],\n \"species_at_sites\": [\"SiGe-vac\"],\n \"species\": [\n {\n \"name\": \"SiGe-vac\",\n \"chemical_symbols\": [\"Si\", \"Ge\", \"vacancy\"],\n \"concentration\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - Using multiple species and the assemblies:\n ```json\n {\n \"cartesian_site_positions\": [ [0,0,0], [0,0,0], [0,0,0] ],\n \"species_at_sites\": [\"Si\", \"Ge\", \"vac\"],\n \"species\": [\n { \"name\": \"Si\", \"chemical_symbols\": [\"Si\"], \"concentration\": [1.0] },\n { \"name\": \"Ge\", \"chemical_symbols\": [\"Ge\"], \"concentration\": [1.0] },\n { \"name\": \"vac\", \"chemical_symbols\": [\"vacancy\"], \"concentration\": [1.0] }\n ],\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1], [2] ],\n \"group_probabilities\": [0.3, 0.5, 0.2]\n }\n ]\n // ...\n }\n ```\n\n - It is up to the database provider to decide which representation to use, typically depending on the internal format in which the structure is stored.\n However, given a structure identified by a unique ID, the API implementation MUST always provide the same representation for it.\n\n - The probabilities of occurrence of different assemblies are uncorrelated.\n So, for instance in the following case with two assemblies:\n ```json\n {\n \"assemblies\": [\n {\n \"sites_in_groups\": [ [0], [1] ],\n \"group_probabilities\": [0.2, 0.8],\n },\n {\n \"sites_in_groups\": [ [2], [3] ],\n \"group_probabilities\": [0.3, 0.7]\n }\n ]\n }\n ```\n\n Site 0 is present with a probability of 20 % and site 1 with a probability of 80 %. These two sites are correlated (either site 0 or 1 is present). Similarly, site 2 is present with a probability of 30 % and site 3 with a probability of 70 %.\n These two sites are correlated (either site 2 or 3 is present).\n However, the presence or absence of sites 0 and 1 is not correlated with the presence or absence of sites 2 and 3 (in the specific example, the pair of sites (0, 2) can occur with 0.2*0.3 = 6 % probability; the pair (0, 3) with 0.2*0.7 = 14 % probability; the pair (1, 2) with 0.8*0.3 = 24 % probability; and the pair (1, 3) with 0.8*0.7 = 56 % probability).", - "x-optimade-support": "optional", - "x-optimade-queryable": "optional" + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" }, "structure_features": { "items": { @@ -3921,38 +4912,69 @@ "type": "array", "title": "Structure Features", "description": "A list of strings that flag which special features are used by the structure.\n\n- **Type**: list of strings\n\n- **Requirements/Conventions**:\n - **Support**: MUST be supported by all implementations, MUST NOT be `null`.\n - **Query**: MUST be a queryable property.\n Filters on the list MUST support all mandatory HAS-type queries.\n Filter operators for comparisons on the string components MUST support equality, support for other comparison operators are OPTIONAL.\n - MUST be an empty list if no special features are used.\n - MUST be sorted alphabetically.\n - If a special feature listed below is used, the list MUST contain the corresponding string.\n - If a special feature listed below is not used, the list MUST NOT contain the corresponding string.\n - **List of strings used to indicate special structure features**:\n - `disorder`: this flag MUST be present if any one entry in the `species` list has a `chemical_symbols` list that is longer than 1 element.\n - `implicit_atoms`: this flag MUST be present if the structure contains atoms that are not assigned to sites via the property `species_at_sites` (e.g., because their positions are unknown).\n When this flag is present, the properties related to the chemical formula will likely not match the type and count of atoms represented by the `species_at_sites`, `species` and `assemblies` properties.\n - `site_attachments`: this flag MUST be present if any one entry in the `species` list includes `attached` and `nattached`.\n - `assemblies`: this flag MUST be present if the property `assemblies` is present.\n\n- **Examples**: A structure having implicit atoms and using assemblies: `[\"assemblies\", \"implicit_atoms\"]`", - "x-optimade-support": "must", - "x-optimade-queryable": "must" + "x-optimade-queryable": "must", + "x-optimade-support": "must" + }, + "immutable_id": { + "type": "string", + "title": "Immutable Id", + "description": "The entry's immutable ID (e.g., an UUID). This is important for databases having preferred IDs that point to \"the latest version\" of a record, but still offer access to older variants. This ID maps to the version-specific record, in case it changes in the future.\n\n- **Type**: string.\n\n- **Requirements/Conventions**:\n - **Support**: OPTIONAL support in implementations, i.e., MAY be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n\n- **Examples**:\n - `\"8bd3e750-b477-41a0-9b11-3a799f21b44f\"`\n - `\"fjeiwoj,54;@=%<>#32\"` (Strings that are not URL-safe are allowed.)", + "x-optimade-queryable": "must", + "x-optimade-support": "optional" + }, + "last_modified": { + "type": "string", + "format": "date-time", + "title": "Last Modified", + "description": "Date and time representing when the entry was last modified.\n\n- **Type**: timestamp.\n\n- **Requirements/Conventions**:\n - **Support**: SHOULD be supported by all implementations, i.e., SHOULD NOT be `null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - **Response**: REQUIRED in the response unless the query parameter `response_fields` is present and does not include this property.\n\n- **Example**:\n - As part of JSON response format: `\"2007-04-05T14:30:20Z\"` (i.e., encoded as an [RFC 3339 Internet Date/Time Format](https://tools.ietf.org/html/rfc3339#section-5.6) string.)", + "x-optimade-queryable": "must", + "x-optimade-support": "should", + "nullable": true + }, + "reference_frames": { + "type": "integer", + "title": "Reference Frames", + "description": "The indexes of a set of frames that give a good but very brief overview of the trajectory.\n The first frame could for example be a starting configuration, the second a transition state and the third the final state.\n- **Type**: list of integers\n- **Requirements/Conventions**: The values MUST be larger than or equal to 0 and less than nframes.\n\n - **Support**: OPTIONAL support in implementations, i.e., MAY be :val:`null`.\n - **Query**: Support for queries on this property is OPTIONAL.\n If supported, filters MAY support only a subset of comparison operators.\n\n- **Examples**:\n\n - :val:`[0, 397, 1000]`\n\n ", + "x-optimade-queryable": "optional", + "x-optimade-support": "optional" + }, + "nframes": { + "type": "integer", + "title": "Nframes", + "description": " The number of frames in the trajectory as exposed by the API.\n This value may deviate from the number of steps used to calculate the trajectory.\n E.g., for a 10 ps simulation with calculation steps of 1 fs where data is stored once every 50 fs, nframes = 200.\n- **Type**: integer\n- **Requirements/Conventions**:\n\n - **Support**: MUST be supported by all implementations, i.e., MUST NOT be :val:`null`.\n - **Query**: MUST be a queryable property with support for all mandatory filter features.\n - The integer value MUST be equal to the length of the trajectory, that is, the number of frames.\n - The integer MUST be a positive non-zero value.\n\n- **Querying**:\n\n - A filter that matches trajectories that have exactly 100 frames:\n - :filter:`nframes=100`\n - A filter that matches trajectories that have between 100 and 1000 frames:\n - :filter:`nframes>=100 AND nframes<=1000`\n\n- **Examples**:\n\n - :val:`42`\n", + "x-optimade-queryable": "must", + "x-optimade-support": "must" } }, "type": "object", "required": [ - "last_modified", "elements", "nelements", "elements_ratios", "chemical_formula_descriptive", "chemical_formula_reduced", "chemical_formula_anonymous", - "dimension_types", "nperiodic_dimensions", - "lattice_vectors", + "dimension_types", "cartesian_site_positions", + "lattice_vectors", "nsites", "species", "species_at_sites", - "structure_features" + "structure_features", + "last_modified", + "nframes" ], - "title": "StructureResourceAttributes", - "description": "This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions." + "title": "TrajectoryResourceAttributes", + "description": "This class contains the Field for the attributes used to represent a trajectory." }, - "StructureResponseMany": { + "TrajectoryResponseMany": { "properties": { "data": { "anyOf": [ { "items": { - "$ref": "#/components/schemas/StructureResource" + "$ref": "#/components/schemas/TrajectoryResource" }, "type": "array" }, @@ -3965,7 +4987,7 @@ ], "uniqueItems": true, "title": "Data", - "description": "List of unique OPTIMADE structures entry resource objects." + "description": "List of unique OPTIMADE trajectories entry resource objects." }, "meta": { "allOf": [ @@ -4027,22 +5049,22 @@ "data", "meta" ], - "title": "StructureResponseMany", + "title": "TrajectoryResponseMany", "description": "errors are not allowed" }, - "StructureResponseOne": { + "TrajectoryResponseOne": { "properties": { "data": { "anyOf": [ { - "$ref": "#/components/schemas/StructureResource" + "$ref": "#/components/schemas/TrajectoryResource" }, { "type": "object" } ], "title": "Data", - "description": "A single structures entry resource." + "description": "A single trajectories entry resource." }, "meta": { "allOf": [ @@ -4104,106 +5126,9 @@ "data", "meta" ], - "title": "StructureResponseOne", + "title": "TrajectoryResponseOne", "description": "errors are not allowed" }, - "ToplevelLinks": { - "properties": { - "self": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Self", - "description": "A link to itself" - }, - "related": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Related", - "description": "A related resource link" - }, - "first": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "First", - "description": "The first page of data" - }, - "last": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Last", - "description": "The last page of data" - }, - "prev": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Prev", - "description": "The previous page of data" - }, - "next": { - "anyOf": [ - { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - { - "$ref": "#/components/schemas/Link" - } - ], - "title": "Next", - "description": "The next page of data" - } - }, - "type": "object", - "title": "ToplevelLinks", - "description": "A set of Links objects, possibly including pagination" - }, "Warnings": { "properties": { "id": { diff --git a/optimade/filtertransformers/mongo.py b/optimade/filtertransformers/mongo.py index 862e21f5e..c3e25e4de 100755 --- a/optimade/filtertransformers/mongo.py +++ b/optimade/filtertransformers/mongo.py @@ -379,6 +379,7 @@ def check_for_entry_type(prop, _): return str(prop).count(".") == 1 and str(prop).split(".")[0] in ( "structures", "references", + "trajectories", ) def replace_with_relationship(subdict, prop, expr): diff --git a/optimade/models/__init__.py b/optimade/models/__init__.py index af5814317..c1d0d5a8a 100644 --- a/optimade/models/__init__.py +++ b/optimade/models/__init__.py @@ -9,6 +9,7 @@ from .references import * # noqa: F403 from .responses import * # noqa: F403 from .structures import * # noqa: F403 +from .trajectories import * # noqa: F403 from .utils import * # noqa: F403 __all__ = ( @@ -23,4 +24,5 @@ + references.__all__ # type: ignore[name-defined] # noqa: F405 + responses.__all__ # type: ignore[name-defined] # noqa: F405 + structures.__all__ # type: ignore[name-defined] # noqa: F405 + + trajectories.__all__ # type: ignore[name-defined] # noqa: F405 ) diff --git a/optimade/models/entries.py b/optimade/models/entries.py index 7719aba6b..9895740c2 100644 --- a/optimade/models/entries.py +++ b/optimade/models/entries.py @@ -40,6 +40,10 @@ class StructureRelationship(TypedRelationship): _req_type = "structures" +class TrajectoryRelationship(TypedRelationship): + _req_type = "trajectories" + + class EntryRelationships(Relationships): """This model wraps the JSON API Relationships to include type-specific top level keys.""" @@ -53,6 +57,11 @@ class EntryRelationships(Relationships): description="Object containing links to relationships with entries of the `structures` type.", ) + trajectories: Optional[TrajectoryRelationship] = StrictField( + None, + description="Object containing links to relationships with entries of the `trajectories` type.", + ) + class EntryResourceAttributes(Attributes): """Contains key-value pairs representing the entry's properties.""" diff --git a/optimade/models/responses.py b/optimade/models/responses.py index abfcdee0d..47e22efa9 100644 --- a/optimade/models/responses.py +++ b/optimade/models/responses.py @@ -12,6 +12,7 @@ from optimade.models.partial_data import PartialDataResource from optimade.models.references import ReferenceResource from optimade.models.structures import StructureResource +from optimade.models.trajectories import TrajectoryResource from optimade.models.utils import StrictField __all__ = ( @@ -24,6 +25,8 @@ "EntryResponseMany", "StructureResponseOne", "StructureResponseMany", + "TrajectoryResponseOne", + "TrajectoryResponseMany", "ReferenceResponseOne", "ReferenceResponseMany", "PartialDataResponse", @@ -105,6 +108,20 @@ class StructureResponseMany(EntryResponseMany): ) +class TrajectoryResponseOne(EntryResponseOne): + data: Union[TrajectoryResource, Dict[str, Any], None] = StrictField( + ..., description="A single trajectories entry resource." + ) + + +class TrajectoryResponseMany(EntryResponseMany): + data: Union[List[TrajectoryResource], List[Dict[str, Any]]] = StrictField( + ..., + description="List of unique OPTIMADE trajectories entry resource objects.", + uniqueItems=True, + ) + + class ReferenceResponseOne(EntryResponseOne): data: Union[ReferenceResource, Dict[str, Any], None] = StrictField( ..., description="A single references entry resource." diff --git a/optimade/models/structures.py b/optimade/models/structures.py index aa89afe69..747cdadf2 100644 --- a/optimade/models/structures.py +++ b/optimade/models/structures.py @@ -7,6 +7,7 @@ from pydantic import BaseModel, conlist, root_validator, validator from optimade.models.entries import EntryResource, EntryResourceAttributes +from optimade.models.jsonapi import Attributes from optimade.models.utils import ( ANONYMOUS_ELEMENTS, CHEMICAL_FORMULA_REGEXP, @@ -30,6 +31,7 @@ "Assembly", "StructureResourceAttributes", "StructureResource", + "StructureAttributes", ) @@ -260,7 +262,7 @@ def check_self_consistency(cls, v, values): ) -class StructureResourceAttributes(EntryResourceAttributes): +class StructureAttributes(Attributes): """This class contains the Field for the attributes used to represent a structure, e.g. unit cell, atoms, positions.""" elements: Optional[List[str]] = OptimadeField( @@ -1092,6 +1094,10 @@ def validate_structure_features(cls, v, values): return v +class StructureResourceAttributes(EntryResourceAttributes, StructureAttributes): + pass + + class StructureResource(EntryResource): """Representing a structure.""" diff --git a/optimade/models/trajectories.py b/optimade/models/trajectories.py new file mode 100644 index 000000000..c9da7cea5 --- /dev/null +++ b/optimade/models/trajectories.py @@ -0,0 +1,109 @@ +# pylint: disable=no-self-argument,line-too-long,no-name-in-module +# import warnings +from typing import Optional + +from optimade.models.entries import EntryResource, EntryResourceAttributes +from optimade.models.structures import StructureAttributes + +# from optimade.server.warnings import MissingExpectedField +from optimade.models.utils import ( + CHEMICAL_SYMBOLS, + EXTRA_SYMBOLS, + OptimadeField, + StrictField, + SupportLevel, +) + +EXTENDED_CHEMICAL_SYMBOLS = set(CHEMICAL_SYMBOLS + EXTRA_SYMBOLS) + +__all__ = ( + "TrajectoryResourceAttributes", + "TrajectoryResource", +) + +CORRELATED_TRAJECTORY_FIELDS = ( + {"cartesian_site_positions", "species_at_sites"}, + {"species_at_sites", "species"}, +) + + +class TrajectoryResourceAttributes(EntryResourceAttributes, StructureAttributes): + """This class contains the Field for the attributes used to represent a trajectory.""" + + reference_frames: Optional[int] = OptimadeField( + None, + description="""The indexes of a set of frames that give a good but very brief overview of the trajectory. + The first frame could for example be a starting configuration, the second a transition state and the third the final state. +- **Type**: list of integers +- **Requirements/Conventions**: The values MUST be larger than or equal to 0 and less than nframes. + + - **Support**: OPTIONAL support in implementations, i.e., MAY be :val:`null`. + - **Query**: Support for queries on this property is OPTIONAL. + If supported, filters MAY support only a subset of comparison operators. + +- **Examples**: + + - :val:`[0, 397, 1000]` + + """, + support=SupportLevel.OPTIONAL, + queryable=SupportLevel.OPTIONAL, + ) + + nframes: int = OptimadeField( + ..., + description=""" The number of frames in the trajectory as exposed by the API. + This value may deviate from the number of steps used to calculate the trajectory. + E.g., for a 10 ps simulation with calculation steps of 1 fs where data is stored once every 50 fs, nframes = 200. +- **Type**: integer +- **Requirements/Conventions**: + + - **Support**: MUST be supported by all implementations, i.e., MUST NOT be :val:`null`. + - **Query**: MUST be a queryable property with support for all mandatory filter features. + - The integer value MUST be equal to the length of the trajectory, that is, the number of frames. + - The integer MUST be a positive non-zero value. + +- **Querying**: + + - A filter that matches trajectories that have exactly 100 frames: + - :filter:`nframes=100` + - A filter that matches trajectories that have between 100 and 1000 frames: + - :filter:`nframes>=100 AND nframes<=1000` + +- **Examples**: + + - :val:`42` +""", + support=SupportLevel.MUST, + queryable=SupportLevel.MUST, + ) + + +# TODO add more Trajectory specific validators + + +class TrajectoryResource(EntryResource): + """Representing a trajectory.""" + + type: str = StrictField( + "trajectories", + const="trajectories", + description="""The name of the type of an entry. + +- **Type**: string. + +- **Requirements/Conventions**: + - **Support**: MUST be supported by all implementations, MUST NOT be `null`. + - **Query**: MUST be a queryable property with support for all mandatory filter features. + - **Response**: REQUIRED in the response. + - MUST be an existing entry type. + - The entry of type `` and ID `` MUST be returned in response to a request for `//` under the versioned base URL. + +- **Examples**: + - `"trajectories"`""", + pattern="^trajectories$", + support=SupportLevel.MUST, + queryable=SupportLevel.MUST, + ) + + attributes: TrajectoryResourceAttributes diff --git a/optimade/server/config.py b/optimade/server/config.py index a88d0b895..38f64ecd5 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -184,6 +184,10 @@ class ServerConfig(BaseSettings): "structures", description="Mongo collection name for /structures endpoint resources", ) + trajectories_collection: str = Field( + "trajectories", + description="Mongo collection name for /trajectories endpoint resources", + ) partial_data_collection: str = Field( "fs", description="Mongo Grid FS system containing the data that needs to be returned via the partial data mechanism.", diff --git a/optimade/server/data/__init__.py b/optimade/server/data/__init__.py index b4cee3665..940ed17f6 100644 --- a/optimade/server/data/__init__.py +++ b/optimade/server/data/__init__.py @@ -8,6 +8,7 @@ "references": "test_references.json", "links": "test_links.json", "providers": "providers.json", + "trajectories": "test_trajectories.json", } data_files = [ diff --git a/optimade/server/data/test_references.json b/optimade/server/data/test_references.json index 05cb7932c..6928fb9b7 100644 --- a/optimade/server/data/test_references.json +++ b/optimade/server/data/test_references.json @@ -59,6 +59,28 @@ "journal": "JACS", "doi": "10.1038/00000" }, + { + "_id": "62696ac7eef0323c842f9f50", + "title": "Molecular Dynamics Simulations Related to SARS-CoV-2", + "organization": "D. E. Shaw Research", + "year": "2020", + "note": "Only a small fraction of trajectory DESRES-ANTON-10875754 is shared here as an example.", + "url": "http://www.deshawresearch.com/resources_sarscov2.html", + "id": "Shaw2020a", + "last_modified": {"$date":"2022-04-27T16:09:41.000Z"} + }, + { + "_id": "62696ac7eef0323c842f9f4f", + "title": "Creative Commons Attribution 4.0 International Public License", + "url": "https://creativecommons.org/licenses/by/4.0/legalcode", + "note": "Entries with a reference to this licence were and are shared under this licence.", + "organization": "Creative Commons", + "id": "CCBy4", + "last_modified": { + "$date": "2022-04-27T16:09:41.000Z" + } + }, + { "_id": { "$oid": "98fb441f053b1744107019e3" diff --git a/optimade/server/data/test_trajectories.json b/optimade/server/data/test_trajectories.json new file mode 100644 index 000000000..b5345ede8 --- /dev/null +++ b/optimade/server/data/test_trajectories.json @@ -0,0 +1,72845 @@ +[{"_id":"622a07fa8544a62c55ef087a","reference_structure":{"elements":["F","O"],"nelements":{"$numberInt":"2"},"elements_ratios":["0.66666667","0.33333333"],"chemical_formula_descriptive":"F2O1","chemical_formula_reduced":"F2O","chemical_formula_anonymous":"A2B","dimension_types":null,"nperiodic_dimensions":null,"lattice_vectors":null,"cartesian_site_positions":[["0.0","0.0","0.0"],["1.797217686782648e-16","1.1175874471664429","-0.8746330738067626"],["-1.797217686782648e-16","-1.1175874471664429","-0.8746330738067628"]],"nsites":{"$numberInt":"3"},"species_at_sites":["O","F","F"],"species":[{"name":"F","chemical_symbols":["F"],"concentration":["1.0"],"mass":["18.998"]},{"name":"O","chemical_symbols":["O"],"concentration":["1.0"],"mass":["15.999"]}],"structure_features":[]},"nframes":{"$numberInt":"48"},"reference_frame":{"$numberInt":"1"},"available_properties":{"cartesian_site_positions":{"frame_serialization_format":"explicit_custom_sparse","nvalues":{"$numberInt":"23"}},"lattice_vectors":{"frame_serialization_format":"constant"},"species":{"frame_serialization_format":"constant"},"dimension_types":{"frame_serialization_format":"constant"},"species_at_sites":{"frame_serialization_format":"constant"}},"type":"trajectories","last_modified":{"$date":{"$numberLong":"1646921722000"}},"cartesian_site_positions":{"frame_serialization_format":"explicit_custom_sparse","nvalues":{"$numberInt":"23"},"_storage_method":"mongo","frames":[{"$numberInt":"1"},{"$numberInt":"3"},{"$numberInt":"4"},{"$numberInt":"6"},{"$numberInt":"7"},{"$numberInt":"9"},{"$numberInt":"14"},{"$numberInt":"15"},{"$numberInt":"16"},{"$numberInt":"18"},{"$numberInt":"19"},{"$numberInt":"20"},{"$numberInt":"22"},{"$numberInt":"23"},{"$numberInt":"26"},{"$numberInt":"27"},{"$numberInt":"28"},{"$numberInt":"31"},{"$numberInt":"32"},{"$numberInt":"42"},{"$numberInt":"43"},{"$numberInt":"44"},{"$numberInt":"46"}],"values":[[["0.0","0.0","0.0"],["0.0","1.1175874471664429","-0.8746330738067627"],["0.0","-1.1175874471664429","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.21803049743175507","1.0961133241653442","-0.8746330738067627"],["-0.21803049743175507","-1.0961133241653442","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.289252907037735","1.0795066356658936","-0.8746330738067627"],["-0.289252907037735","-1.0795066356658936","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.42768222093582153","1.0325162410736084","-0.8746330738067627"],["-0.42768222093582153","-1.0325162410736084","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.49429628252983093","1.0023337602615356","-0.8746330738067627"],["-0.49429628252983093","-1.0023337602615356","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.6208983063697815","0.9292399883270264","-0.8746330738067627"],["-0.6208983063697815","-0.9292399883270264","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.8866417407989502","0.6803441643714905","-0.8746330738067627"],["-0.8866417407989502","-0.6803441643714905","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.9292399883270264","0.6208983063697815","-0.8746330738067627"],["-0.9292399883270264","-0.6208983063697815","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.967859148979187","0.5587937235832214","-0.8746330738067627"],["-0.967859148979187","-0.5587937235832214","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.0325162410736084","0.42768222093582153","-0.8746330738067627"],["-1.0325162410736084","-0.42768222093582153","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.0582772493362427","0.3592367172241211","-0.8746330738067627"],["-1.0582772493362427","-0.3592367172241211","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.0795066356658936","0.289252907037735","-0.8746330738067627"],["-1.0795066356658936","-0.289252907037735","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.108026385307312","0.14587444067001343","-0.8746330738067627"],["-1.108026385307312","-0.14587444067001343","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.1151946783065796","0.0730937197804451","-0.8746330738067627"],["-1.1151946783065796","-0.0730937197804451","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.108026385307312","-0.14587444067001343","-0.8746330738067627"],["-1.108026385307312","0.14587444067001343","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.0961133241653442","-0.21803049743175507","-0.8746330738067627"],["-1.0961133241653442","0.21803049743175507","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.0795066356658936","-0.289252907037735","-0.8746330738067627"],["-1.0795066356658936","0.289252907037735","-0.8746330738067627"]],[["0.0","0.0","0.0"],["1.0023337602615356","-0.49429628252983093","-0.8746330738067627"],["-1.0023337602615356","0.49429628252983093","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.967859148979187","-0.5587937235832214","-0.8746330738067627"],["-0.967859148979187","0.5587937235832214","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.42768222093582153","-1.0325162410736084","-0.8746330738067627"],["-0.42768222093582153","1.0325162410736084","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.3592367172241211","-1.0582772493362427","-0.8746330738067627"],["-0.3592367172241211","1.0582772493362427","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.289252907037735","-1.0795066356658936","-0.8746330738067627"],["-0.289252907037735","1.0795066356658936","-0.8746330738067627"]],[["0.0","0.0","0.0"],["0.14587444067001343","-1.108026385307312","-0.8746330738067627"],["-0.14587444067001343","1.108026385307312","-0.8746330738067627"]]]},"lattice_vectors":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[null]},"species":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[[{"name":"F","chemical_symbols":["F"],"concentration":["1.0"],"mass":["18.998"]},{"name":"O","chemical_symbols":["O"],"concentration":["1.0"],"mass":["15.999"]}]]},"dimension_types":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[null]},"species_at_sites":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[["O","F","F"]]},"_storage_path":"/home/kwibus/Documents/Cecam/testfiles/622a07fa8544a62c55ef087a.hdf5","id":"622a07fa8544a62c55ef087a"}, + {"_id":"622a29c4087ac20730106f33","reference_structure":{"elements":["H","O"],"nelements":2,"elements_ratios":[0.66666667,0.33333333],"chemical_formula_descriptive":"H2O1","chemical_formula_reduced":"H2O","chemical_formula_anonymous":"A2B","dimension_types":null,"nperiodic_dimensions":null,"lattice_vectors":null,"cartesian_site_positions":[[0,0,0],[1.1944197570411098e-16,0.7427417039871216,-0.587079644203186],[-1.1944197570411098e-16,-0.7427417039871216,-0.587079644203186]],"nsites":3,"species_at_sites":["O","H","H"],"species":[{"name":"H","chemical_symbols":["H"],"concentration":[1],"mass":[1.008]},{"name":"O","chemical_symbols":["O"],"concentration":[1],"mass":[15.999]}],"structure_features":[]},"nframes":48,"reference_frame":1,"available_properties":{"cartesian_site_positions":{"frame_serialization_format":"explicit","nvalues":48},"lattice_vectors":{"frame_serialization_format":"constant"},"species":{"frame_serialization_format":"constant"},"dimension_types":{"frame_serialization_format":"constant"},"species_at_sites":{"frame_serialization_format":"constant"}},"type":"trajectories","last_modified":{"$date":"2022-03-10T16:39:32.000Z"},"cartesian_site_positions":{"frame_serialization_format":"explicit","nvalues":48,"_storage_method":"mongo","values":[[[0,0,0],[0,0.7427417039871216,-0.587079644203186],[0,-0.7427417039871216,-0.587079644203186]],[[0,0,0],[0.048577629029750824,0.7411513924598694,-0.587079644203186],[-0.048577629029750824,-0.7411513924598694,-0.587079644203186]],[[0,0,0],[0.09694724529981613,0.7363874316215515,-0.587079644203186],[-0.09694724529981613,-0.7363874316215515,-0.587079644203186]],[[0,0,0],[0.14490170776844025,0.7284700870513916,-0.587079644203186],[-0.14490170776844025,-0.7284700870513916,-0.587079644203186]],[[0,0,0],[0.19223569333553314,0.7174333930015564,-0.587079644203186],[-0.19223569333553314,-0.7174333930015564,-0.587079644203186]],[[0,0,0],[0.2387464940547943,0.7033244967460632,-0.587079644203186],[-0.2387464940547943,-0.7033244967460632,-0.587079644203186]],[[0,0,0],[0.2842349410057068,0.6862038373947144,-0.587079644203186],[-0.2842349410057068,-0.6862038373947144,-0.587079644203186]],[[0,0,0],[0.3285062313079834,0.6661447882652283,-0.587079644203186],[-0.3285062313079834,-0.6661447882652283,-0.587079644203186]],[[0,0,0],[0.3713708519935608,0.6432331800460815,-0.587079644203186],[-0.3713708519935608,-0.6432331800460815,-0.587079644203186]],[[0,0,0],[0.412645161151886,0.6175671219825745,-0.587079644203186],[-0.412645161151886,-0.6175671219825745,-0.587079644203186]],[[0,0,0],[0.4521524906158447,0.5892565846443176,-0.587079644203186],[-0.4521524906158447,-0.5892565846443176,-0.587079644203186]],[[0,0,0],[0.4897236227989197,0.5584227442741394,-0.587079644203186],[-0.4897236227989197,-0.5584227442741394,-0.587079644203186]],[[0,0,0],[0.5251976847648621,0.5251976847648621,-0.587079644203186],[-0.5251976847648621,-0.5251976847648621,-0.587079644203186]],[[0,0,0],[0.5584227442741394,0.4897236227989197,-0.587079644203186],[-0.5584227442741394,-0.4897236227989197,-0.587079644203186]],[[0,0,0],[0.5892565846443176,0.4521524906158447,-0.587079644203186],[-0.5892565846443176,-0.4521524906158447,-0.587079644203186]],[[0,0,0],[0.6175671219825745,0.412645161151886,-0.587079644203186],[-0.6175671219825745,-0.412645161151886,-0.587079644203186]],[[0,0,0],[0.6432331800460815,0.3713708519935608,-0.587079644203186],[-0.6432331800460815,-0.3713708519935608,-0.587079644203186]],[[0,0,0],[0.6661447882652283,0.3285062313079834,-0.587079644203186],[-0.6661447882652283,-0.3285062313079834,-0.587079644203186]],[[0,0,0],[0.6862038373947144,0.2842349410057068,-0.587079644203186],[-0.6862038373947144,-0.2842349410057068,-0.587079644203186]],[[0,0,0],[0.7033244967460632,0.2387464940547943,-0.587079644203186],[-0.7033244967460632,-0.2387464940547943,-0.587079644203186]],[[0,0,0],[0.7174333930015564,0.19223569333553314,-0.587079644203186],[-0.7174333930015564,-0.19223569333553314,-0.587079644203186]],[[0,0,0],[0.7284700870513916,0.14490170776844025,-0.587079644203186],[-0.7284700870513916,-0.14490170776844025,-0.587079644203186]],[[0,0,0],[0.7363874316215515,0.09694724529981613,-0.587079644203186],[-0.7363874316215515,-0.09694724529981613,-0.587079644203186]],[[0,0,0],[0.7411513924598694,0.048577629029750824,-0.587079644203186],[-0.7411513924598694,-0.048577629029750824,-0.587079644203186]],[[0,0,0],[0.7427417039871216,4.54798095200966e-17,-0.587079644203186],[-0.7427417039871216,-4.54798095200966e-17,-0.587079644203186]],[[0,0,0],[0.7411513924598694,-0.048577629029750824,-0.587079644203186],[-0.7411513924598694,0.048577629029750824,-0.587079644203186]],[[0,0,0],[0.7363874316215515,-0.09694724529981613,-0.587079644203186],[-0.7363874316215515,0.09694724529981613,-0.587079644203186]],[[0,0,0],[0.7284700870513916,-0.14490170776844025,-0.587079644203186],[-0.7284700870513916,0.14490170776844025,-0.587079644203186]],[[0,0,0],[0.7174333930015564,-0.19223569333553314,-0.587079644203186],[-0.7174333930015564,0.19223569333553314,-0.587079644203186]],[[0,0,0],[0.7033244967460632,-0.2387464940547943,-0.587079644203186],[-0.7033244967460632,0.2387464940547943,-0.587079644203186]],[[0,0,0],[0.6862038373947144,-0.2842349410057068,-0.587079644203186],[-0.6862038373947144,0.2842349410057068,-0.587079644203186]],[[0,0,0],[0.6661447882652283,-0.3285062313079834,-0.587079644203186],[-0.6661447882652283,0.3285062313079834,-0.587079644203186]],[[0,0,0],[0.6432331800460815,-0.3713708519935608,-0.587079644203186],[-0.6432331800460815,0.3713708519935608,-0.587079644203186]],[[0,0,0],[0.6175671219825745,-0.412645161151886,-0.587079644203186],[-0.6175671219825745,0.412645161151886,-0.587079644203186]],[[0,0,0],[0.5892565846443176,-0.4521524906158447,-0.587079644203186],[-0.5892565846443176,0.4521524906158447,-0.587079644203186]],[[0,0,0],[0.5584227442741394,-0.4897236227989197,-0.587079644203186],[-0.5584227442741394,0.4897236227989197,-0.587079644203186]],[[0,0,0],[0.5251976847648621,-0.5251976847648621,-0.587079644203186],[-0.5251976847648621,0.5251976847648621,-0.587079644203186]],[[0,0,0],[0.4897236227989197,-0.5584227442741394,-0.587079644203186],[-0.4897236227989197,0.5584227442741394,-0.587079644203186]],[[0,0,0],[0.4521524906158447,-0.5892565846443176,-0.587079644203186],[-0.4521524906158447,0.5892565846443176,-0.587079644203186]],[[0,0,0],[0.412645161151886,-0.6175671219825745,-0.587079644203186],[-0.412645161151886,0.6175671219825745,-0.587079644203186]],[[0,0,0],[0.3713708519935608,-0.6432331800460815,-0.587079644203186],[-0.3713708519935608,0.6432331800460815,-0.587079644203186]],[[0,0,0],[0.3285062313079834,-0.6661447882652283,-0.587079644203186],[-0.3285062313079834,0.6661447882652283,-0.587079644203186]],[[0,0,0],[0.2842349410057068,-0.6862038373947144,-0.587079644203186],[-0.2842349410057068,0.6862038373947144,-0.587079644203186]],[[0,0,0],[0.2387464940547943,-0.7033244967460632,-0.587079644203186],[-0.2387464940547943,0.7033244967460632,-0.587079644203186]],[[0,0,0],[0.19223569333553314,-0.7174333930015564,-0.587079644203186],[-0.19223569333553314,0.7174333930015564,-0.587079644203186]],[[0,0,0],[0.14490170776844025,-0.7284700870513916,-0.587079644203186],[-0.14490170776844025,0.7284700870513916,-0.587079644203186]],[[0,0,0],[0.09694724529981613,-0.7363874316215515,-0.587079644203186],[-0.09694724529981613,0.7363874316215515,-0.587079644203186]],[[0,0,0],[0.048577629029750824,-0.7411513924598694,-0.587079644203186],[-0.048577629029750824,0.7411513924598694,-0.587079644203186]]]},"lattice_vectors":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[null]},"species":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[[{"name":"H","chemical_symbols":["H"],"concentration":[1],"mass":[1.008]},{"name":"O","chemical_symbols":["O"],"concentration":[1],"mass":[15.999]}]]},"dimension_types":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[null]},"species_at_sites":{"frame_serialization_format":"constant","_storage_method":"mongo","values":[["O","H","H"]]},"_storage_path":"/home/kwibus/Documents/Cecam/testfiles/622a29c4087ac20730106f33.hdf5","id":"622a29c4087ac20730106f33"}, + {"_id": "622b548fe73216ae229b188b","reference_structure": {"elements": ["Br","O"],"nelements": 2,"elements_ratios": [0.66666667,0.33333333],"chemical_formula_descriptive": "Br2O1","chemical_formula_reduced": "Br2O","chemical_formula_anonymous": "A2B","dimension_types": null,"nperiodic_dimensions": null,"lattice_vectors": null,"cartesian_site_positions": [[ 0, 0, 0],[ 2.0066809927844637e-16, 1.2478407621383667, -1.034506916999817],[ -2.0066809927844637e-16, -1.2478407621383667, -1.034506916999817]],"nsites": 3,"species_at_sites": ["O","Br","Br"],"species": [{ "name": "O", "chemical_symbols": ["O" ], "concentration": [1 ], "mass": [15.999 ]},{ "name": "Br", "chemical_symbols": ["Br" ], "concentration": [1 ], "mass": [79.904 ]}],"structure_features": [] }, "nframes": 48, "reference_frame": 1, "available_properties": {"cartesian_site_positions": {"frame_serialization_format": "explicit_regular_sparse","nvalues": 24},"lattice_vectors": {"frame_serialization_format": "constant"},"species": {"frame_serialization_format": "constant"},"dimension_types": {"frame_serialization_format": "constant"},"species_at_sites": {"frame_serialization_format": "constant"} }, "type": "trajectories", "last_modified": {"$date":"2022-03-11T13:54:22.000Z"}, "cartesian_site_positions": {"frame_serialization_format": "explicit_regular_sparse","nvalues": 24,"_storage_method": "mongo","offset_sparse": 1,"step_size_sparse": 2,"values": [[ [0,0,0 ], [0,1.2478407621383667,-1.034506916999817 ], [0,-1.2478407621383667,-1.034506916999817 ]],[ [0,0,0 ], [0.16287590563297272,1.2371653318405151,-1.034506916999817 ], [-0.16287590563297272,-1.2371653318405151,-1.034506916999817 ]],[ [0,0,0 ], [0.32296496629714966,1.2053216695785522,-1.034506916999817 ], [-0.32296496629714966,-1.2053216695785522,-1.034506916999817 ]],[ [0,0,0 ], [0.4775279760360718,1.152854561805725,-1.034506916999817 ], [-0.4775279760360718,-1.152854561805725,-1.034506916999817 ]],[ [0,0,0 ], [0.6239203810691833,1.0806617736816406,-1.034506916999817 ], [-0.6239203810691833,-1.0806617736816406,-1.034506916999817 ]],[ [0,0,0 ], [0.7596372961997986,0.9899786114692688,-1.034506916999817 ], [-0.7596372961997986,-0.9899786114692688,-1.034506916999817 ]],[ [0,0,0 ], [0.8823566436767578,0.8823566436767578,-1.034506916999817 ], [-0.8823566436767578,-0.8823566436767578,-1.034506916999817 ]],[ [0,0,0 ], [0.9899786114692688,0.7596372961997986,-1.034506916999817 ], [-0.9899786114692688,-0.7596372961997986,-1.034506916999817 ]],[ [0,0,0 ], [1.0806617736816406,0.6239203810691833,-1.034506916999817 ], [-1.0806617736816406,-0.6239203810691833,-1.034506916999817 ]],[ [0,0,0 ], [1.152854561805725,0.4775279760360718,-1.034506916999817 ], [-1.152854561805725,-0.4775279760360718,-1.034506916999817 ]],[ [0,0,0 ], [1.2053216695785522,0.32296496629714966,-1.034506916999817 ], [-1.2053216695785522,-0.32296496629714966,-1.034506916999817 ]],[ [0,0,0 ], [1.2371653318405151,0.16287590563297272,-1.034506916999817 ], [-1.2371653318405151,-0.16287590563297272,-1.034506916999817 ]],[ [0,0,0 ], [1.2478407621383667,7.640820842874006e-17,-1.034506916999817 ], [-1.2478407621383667,-7.640820842874006e-17,-1.034506916999817 ]],[ [0,0,0 ], [1.2371653318405151,-0.16287590563297272,-1.034506916999817 ], [-1.2371653318405151,0.16287590563297272,-1.034506916999817 ]],[ [0,0,0 ], [1.2053216695785522,-0.32296496629714966,-1.034506916999817 ], [-1.2053216695785522,0.32296496629714966,-1.034506916999817 ]],[ [0,0,0 ], [1.152854561805725,-0.4775279760360718,-1.034506916999817 ], [-1.152854561805725,0.4775279760360718,-1.034506916999817 ]],[ [0,0,0 ], [1.0806617736816406,-0.6239203810691833,-1.034506916999817 ], [-1.0806617736816406,0.6239203810691833,-1.034506916999817 ]],[ [0,0,0 ], [0.9899786114692688,-0.7596372961997986,-1.034506916999817 ], [-0.9899786114692688,0.7596372961997986,-1.034506916999817 ]],[ [0,0,0 ], [0.8823566436767578,-0.8823566436767578,-1.034506916999817 ], [-0.8823566436767578,0.8823566436767578,-1.034506916999817 ]],[ [0,0,0 ], [0.7596372961997986,-0.9899786114692688,-1.034506916999817 ], [-0.7596372961997986,0.9899786114692688,-1.034506916999817 ]],[ [0,0,0 ], [0.6239203810691833,-1.0806617736816406,-1.034506916999817 ], [-0.6239203810691833,1.0806617736816406,-1.034506916999817 ]],[ [0,0,0 ], [0.4775279760360718,-1.152854561805725,-1.034506916999817 ], [-0.4775279760360718,1.152854561805725,-1.034506916999817 ]],[ [0,0,0 ], [0.32296496629714966,-1.2053216695785522,-1.034506916999817 ], [-0.32296496629714966,1.2053216695785522,-1.034506916999817 ]],[ [0,0,0 ], [0.16287590563297272,-1.2371653318405151,-1.034506916999817 ], [-0.16287590563297272,1.2371653318405151,-1.034506916999817 ]]] }, "lattice_vectors": {"frame_serialization_format": "constant","_storage_method": "mongo","values": [null] }, "species": {"frame_serialization_format": "constant","_storage_method": "mongo","values": [[ {"name": "O","chemical_symbols": ["O"],"concentration": [1],"mass": [15.999] }, {"name": "Br","chemical_symbols": ["Br"],"concentration": [1],"mass": [79.904] }]] }, "dimension_types": {"frame_serialization_format": "constant","_storage_method": "mongo","values": [null] }, "species_at_sites": {"frame_serialization_format": "constant","_storage_method": "mongo","values": [[ "O", "Br", "Br"]] }, "_storage_path": "/home/kwibus/Documents/Cecam/testfiles/622b548fe73216ae229b188b.hdf5", "id": "622b548fe73216ae229b188b"}, +{"_id": "62696ac7eef0323c842f9f51", + "reference_structure": { + "elements": [ + "C", + "Cl", + "H", + "N", + "O", + "S" + ], + "nelements": 6, + "elements_ratios": [ + 0.32738033, + 0.00031149, + 0.48790364, + 0.08431108, + 0.09708234, + 0.00301111 + ], + "chemical_formula_descriptive": "C3153Cl3H4699N812O935S29", + "chemical_formula_reduced": "C3153Cl3H4699N812O935S29", + "chemical_formula_anonymous": "A4699B3153C935D812E29F3", + "dimension_types": null, + "nperiodic_dimensions": null, + "lattice_vectors": [ + [ + 104.75525665283203, + 0, + -0.000004578997504722793 + ], + [ + -0.000007908802217571065, + 104.75525665283203, + -0.000004578997504722793 + ], + [ + 0, + 0, + 104.75525665283203 + ] + ], + "cartesian_site_positions": [ + [ + -39.045972971700586, + 15.760869200231696, + -22.706104729608043 + ], + [ + -38.16115927809377, + 15.62664720686655, + -23.534841981237825 + ], + [ + -40.337439419675974, + 16.48069407377409, + -23.00275706994879 + ], + [ + -41.10311323598406, + 16.29638819864772, + -22.249182315157 + ], + [ + -40.16636288857151, + 17.55610280050894, + -23.051011543536298 + ], + [ + -40.61403478030535, + 15.985718278131458, + -23.93366943237053 + ], + [ + -38.89050920063696, + 15.358595024852548, + -21.414166910749984 + ], + [ + -37.69569208660088, + 14.744582400307081, + -20.926705673978013 + ], + [ + -37.40640273451883, + 13.345002880581205, + -21.523856598416124 + ], + [ + -38.25535451075142, + 12.439173010662728, + -21.61284770448318 + ], + [ + -37.73499430026222, + 14.558952818410148, + -19.390545517882362 + ], + [ + -37.88773579507552, + 15.810113277461596, + -18.81001741533068 + ], + [ + -36.83587278271798, + 15.386272671962047, + -21.11918487965569 + ], + [ + -38.57356248921715, + 13.894075824620813, + -19.18356953761746 + ], + [ + -36.77515076348353, + 14.15332722978053, + -19.070756405844527 + ], + [ + -38.4620653055772, + 15.697841714058313, + -18.04899994341705 + ], + [ + -39.68266030332689, + 15.558679234928036, + -20.82040478854912 + ], + [ + -36.19043756129817, + 13.12365194757865, + -21.91809960107484 + ], + [ + -35.574586015224206, + 11.891572846502868, + -22.445882380626735 + ], + [ + -34.89830916664523, + 11.168133535428353, + -21.350842830666902 + ], + [ + -34.66538052214359, + 11.695544829874677, + -20.26968662734538 + ], + [ + -34.5992639140047, + 12.324579496998581, + -23.597668112998104 + ], + [ + -35.39359106255442, + 13.143994573326268, + -24.625510811687366 + ], + [ + -33.57548293932144, + 13.199434160193391, + -23.091815526789354 + ], + [ + -35.62586419886843, + 13.958313066392293, + -21.849558812486546 + ], + [ + -36.33070974848482, + 11.201162204718855, + -22.819660894784548 + ], + [ + -34.38600344275727, + 11.377666326968722, + -24.093627290799887 + ], + [ + -34.01394525714331, + 13.99180690622245, + -22.773233039643973 + ], + [ + -36.36803901628252, + 12.690976223775579, + -24.808049600756497 + ], + [ + -35.62695377545649, + 14.171064588311083, + -24.344841303723 + ], + [ + -34.83695050336635, + 13.031186815022409, + -25.555840983574047 + ], + [ + -34.462822029988466, + 9.884108309457758, + -21.573534604073856 + ], + [ + -33.81103686988661, + 9.045060070504178, + -20.503523720583438 + ], + [ + -32.527356650591344, + 9.45842263154924, + -19.92813593475912 + ], + [ + -32.243137438013534, + 9.288241238396267, + -18.79841933299173 + ], + [ + -33.84216884348163, + 7.573328385445336, + -21.023175342785063 + ], + [ + -33.630175879023945, + 6.561750266503509, + -19.900217722681635 + ], + [ + -32.86886034289243, + 7.250354860252685, + -22.175601041759236 + ], + [ + -34.66034754516302, + 6.480930007188306, + -18.781727599316838 + ], + [ + -34.791937954892376, + 9.396980315453106, + -22.394808765906046 + ], + [ + -34.53239150433607, + 9.117129504163984, + -19.689554857528478 + ], + [ + -34.818795938969814, + 7.3946029958198665, + -21.473013935829403 + ], + [ + -33.5989844001688, + 5.5405460051945, + -20.280045034785125 + ], + [ + -32.70683109850316, + 6.680901827066293, + -19.33335907545651 + ], + [ + -32.74727605695976, + 7.967110076525842, + -22.987746694318567 + ], + [ + -31.91114599121416, + 7.046692115069277, + -21.69664244319605 + ], + [ + -33.101133350996435, + 6.366480493464707, + -22.76966904038488 + ], + [ + -35.70373443132755, + 6.479175861571065, + -19.097058545394884 + ], + [ + -34.548091524444594, + 5.592629886129998, + -18.160097383018805 + ], + [ + -34.63809123522758, + 7.422937813389751, + -18.233800453051074 + ], + [ + -31.707707479828997, + 10.144668592125868, + -20.736521227806854 + ], + [ + -30.5174141733182, + 10.882692092301056, + -20.238665517642673 + ], + [ + -30.919708727123044, + 12.018500403855228, + -19.210771339939093 + ], + [ + -30.425582096710706, + 11.950275651534923, + -18.10921786212742 + ], + [ + -29.715866061068574, + 11.473773214118978, + -21.448544493635907 + ], + [ + -28.314872327162053, + 11.859716469411296, + -21.053182393512543 + ], + [ + -27.589840084832424, + 12.43850023045269, + -22.296541156679094 + ], + [ + -27.254914116526162, + 11.6728576197292, + -23.226560656319915 + ], + [ + -27.240125589372546, + 13.655263825656561, + -22.16378342630432 + ], + [ + -31.966083187568636, + 10.270969418029665, + -21.704709700352915 + ], + [ + -29.894285407435635, + 10.253008059591593, + -19.603598462478878 + ], + [ + -29.67466250619479, + 10.683154223463418, + -22.197762493016658 + ], + [ + -30.28211603359499, + 12.26808391056744, + -21.934891229639284 + ], + [ + -28.22169778281174, + 12.53957179848004, + -20.206298874510914 + ], + [ + -27.77292048246366, + 10.95306318519863, + -20.784181122778037 + ], + [ + -31.88655483235874, + 12.884572241407852, + -19.533966519171837 + ], + [ + -32.43476306719904, + 13.824087951077217, + -18.560956206289426 + ], + [ + -33.039469112486536, + 13.20797893715337, + -17.280288584105644 + ], + [ + -32.91842491124327, + 13.757198612839716, + -16.21849471031619 + ], + [ + -33.50009732247026, + 14.63155844697053, + -19.23076586969749 + ], + [ + -32.963284340692525, + 15.49097975068355, + -20.33640762059135 + ], + [ + -34.04635438670051, + 16.208132235085372, + -21.074363202360786 + ], + [ + -34.585112492526065, + 17.325468749387824, + -20.826246256918928 + ], + [ + -34.448829887611595, + 15.675156064887801, + -22.124310825546953 + ], + [ + -32.21456250739642, + 12.958507820638658, + -20.486357919736527 + ], + [ + -31.598177313070547, + 14.44420242676199, + -18.238952110224606 + ], + [ + -34.17245601610617, + 13.927405762079616, + -19.7208713632792 + ], + [ + -34.03373850778308, + 15.15846086357817, + -18.4397542935436 + ], + [ + -32.371930892492294, + 16.335362621580998, + -19.982263049074916 + ], + [ + -32.42788549154559, + 14.88429746457507, + -21.06673941350919 + ], + [ + -33.6339757003896, + 11.969849497112136, + -17.351209840571414 + ], + [ + -34.17309893022637, + 11.178117531306327, + -16.18775426274604 + ], + [ + -33.0176589772888, + 10.65184496809718, + -15.344212784856657 + ], + [ + -32.99585529803213, + 10.904281937045937, + -14.164991430042853 + ], + [ + -35.13640147139358, + 10.045494389168823, + -16.61787301794015 + ], + [ + -36.462352960750806, + 10.532845602593511, + -17.238393310459518 + ], + [ + -37.394879324929555, + 9.472106918582426, + -17.705792835237013 + ], + [ + -37.518558420624544, + 8.508442926200075, + -16.825960175348623 + ], + [ + -38.11179142220611, + 9.512099877680555, + -18.70373658875547 + ], + [ + -33.64453722411965, + 11.534273481823561, + -18.26239617658198 + ], + [ + -34.784145748708895, + 11.792321375285042, + -15.526333267667848 + ], + [ + -34.64838134074822, + 9.522989239038395, + -17.44062545723623 + ], + [ + -35.17925018758337, + 9.428161570872192, + -15.720563701012237 + ], + [ + -36.982566647225994, + 11.163244561837075, + -16.51723380813816 + ], + [ + -36.317494531725984, + 11.165363585352452, + -18.114201763338322 + ], + [ + -37.10143468585384, + 8.448218951064348, + -15.90808661868606 + ], + [ + -38.17066190170458, + 7.7856631270483945, + -17.095123711439854 + ], + [ + -31.958181519999442, + 10.108118363313679, + -15.977194399724471 + ], + [ + -30.65228232246968, + 9.719092962952402, + -15.375757029577178 + ], + [ + -29.955016749257137, + 10.912921152991316, + -14.731722256186686 + ], + [ + -29.54873241866336, + 10.773462869105117, + -13.59665776086681 + ], + [ + -30.08372522545756, + 8.878595358743553, + -16.558409407465223 + ], + [ + -32.09045540168252, + 9.91042556688501, + -16.958786955647323 + ], + [ + -30.76092300359127, + 8.99705384642175, + -14.566463278614243 + ], + [ + -29.753207548167516, + 9.407217189275457, + -17.452509368561234 + ], + [ + -29.2157918854953, + 8.351911478631052, + -16.161673586179397 + ], + [ + -30.867868457100315, + 8.158452046308241, + -16.792096659863986 + ], + [ + -29.90695753987442, + 12.076510136002696, + -15.32458840584024 + ], + [ + -29.394389652968858, + 13.355960924837518, + -14.80044899325278 + ], + [ + -30.147257287834467, + 13.9289308346207, + -13.623623715159676 + ], + [ + -29.578834522686236, + 14.254252066161143, + -12.582715696174384 + ], + [ + -29.22605418684385, + 14.337862568226797, + -15.991811673612487 + ], + [ + -28.139456362410726, + 13.951797556887186, + -17.01061323482744 + ], + [ + -28.14965897178018, + 14.97164494070762, + -18.190444986973084 + ], + [ + -27.439349904913158, + 16.339722424659044, + -17.885060618538446 + ], + [ + -27.301887381436604, + 17.053868471277724, + -19.186551630620627 + ], + [ + -30.348301355929507, + 12.053592682049839, + -16.232769864250418 + ], + [ + -28.401881164537812, + 13.089031083823556, + -14.437431808991677 + ], + [ + -30.165642487642035, + 14.414592292645466, + -16.53897394657784 + ], + [ + -29.002188597336968, + 15.320204406556286, + -15.575888385861875 + ], + [ + -27.127872777636938, + 13.919749179874884, + -16.60591803009397 + ], + [ + -28.356868881579167, + 12.971681668858196, + -17.435120324291535 + ], + [ + -27.57173916861627, + 14.418440095934898, + -18.93076390191505 + ], + [ + -29.17694284410598, + 15.021589895696934, + -18.551409478150045 + ], + [ + -28.04202052552766, + 16.871747961102756, + -17.14896726081984 + ], + [ + -26.461742490028705, + 16.159258108922245, + -17.438052057448342 + ], + [ + -26.65062370825712, + 17.821274983711987, + -19.102604019974518 + ], + [ + -26.857249870129614, + 16.57246535295826, + -19.955086726347716 + ], + [ + -28.192261290435052, + 17.48697658514618, + -19.38592869904912 + ], + [ + -31.487485413864764, + 13.881705098020916, + -13.679857777636599 + ], + [ + -32.454141051709456, + 14.371008310639695, + -12.663446859336508 + ], + [ + -32.363488922492586, + 13.4559788347633, + -11.383422376167264 + ], + [ + -32.45811837586085, + 13.840395456539568, + -10.202277900875787 + ], + [ + -33.91371509080207, + 14.471023098615547, + -13.248961484999999 + ], + [ + -35.02642489331517, + 14.70954319526129, + -12.255494539880868 + ], + [ + -34.03184351182915, + 15.524748322107598, + -14.267805202813989 + ], + [ + -31.86216621187597, + 13.578298394018134, + -14.56735786938505 + ], + [ + -32.25837925679257, + 15.370767507631854, + -12.27581390090215 + ], + [ + -34.09531260350261, + 13.53244007148794, + -13.77258580521589 + ], + [ + -33.63750686485844, + 15.136789848135095, + -15.052399610869823 + ], + [ + -35.87648193617815, + 15.079973481348588, + -12.82846130674897 + ], + [ + -35.38699130544783, + 13.740655400157607, + -11.910021843913766 + ], + [ + -34.772981923539525, + 15.339206154808721, + -11.40262390621146 + ], + [ + -32.18068928659521, + 12.110080463606153, + -11.633972075542326 + ], + [ + -31.89351665460135, + 11.214293126126847, + -10.568469269333791 + ], + [ + -30.50612524755578, + 11.48120579641619, + -9.94915096319324 + ], + [ + -30.33151458792902, + 11.481076235494072, + -8.735012935507791 + ], + [ + -31.96448783892452, + 9.844075545498015, + -11.201816847290418 + ], + [ + -31.547260994003462, + 8.647361112748285, + -10.351597456925276 + ], + [ + -32.475204368883155, + 8.0263568813333, + -9.471187216122361 + ], + [ + -30.182772162487133, + 8.26311073480582, + -10.366603152114157 + ], + [ + -32.002887620038955, + 7.154840363101755, + -8.512577643228031 + ], + [ + -29.729923891887246, + 7.371424859047806, + -9.434118054506241 + ], + [ + -30.60311139066269, + 6.799800509684701, + -8.486384528977393 + ], + [ + -32.23464904379614, + 11.773659139087556, + -12.584766592759271 + ], + [ + -32.66510345745189, + 11.207130592498629, + -9.798597162901645 + ], + [ + -33.01047842022666, + 9.69523814353289, + -11.469854928302146 + ], + [ + -31.35971618205474, + 9.789520250948726, + -12.107008302498814 + ], + [ + -33.456395799176626, + 8.430519055932962, + -9.270389615264989 + ], + [ + -29.471732490494848, + 8.719354839122275, + -11.03940604731333 + ], + [ + -32.689866441806, + 6.935552258515827, + -7.7086029111552925 + ], + [ + -28.694273174463365, + 7.066053668051211, + -9.458021296071207 + ], + [ + -30.253184461823462, + 6.15182263086956, + -7.696400061617 + ], + [ + -29.424560058824145, + 11.78937737650051, + -10.715229927166849 + ], + [ + -28.147111253506026, + 12.228114366093791, + -10.14813326070742 + ], + [ + -28.165012619392904, + 13.618682377345067, + -9.484704131199555 + ], + [ + -27.43826327664801, + 13.827211461982756, + -8.524711592817876 + ], + [ + -27.034248491357943, + 12.200350084873719, + -11.236086029694473 + ], + [ + -26.375373339701717, + 10.788278862988136, + -11.502647447693377 + ], + [ + -25.648225925251495, + 10.690982512914331, + -12.823816880982116 + ], + [ + -25.457374861350424, + 10.416203309287425, + -10.34406219379627 + ], + [ + -29.355543093168862, + 11.543806355936567, + -11.692486881829494 + ], + [ + -27.976599659996197, + 11.510853393931882, + -9.34528634876211 + ], + [ + -27.34169502811573, + 12.591683386721172, + -12.205846413470558 + ], + [ + -26.258212961885544, + 12.896660431539033, + -10.918236469183658 + ], + [ + -27.09088361685112, + 9.972508663204394, + -11.605930850312145 + ], + [ + -24.949516296997576, + 9.855635345603446, + -12.778018650015467 + ], + [ + -26.28731558950231, + 10.384855029547055, + -13.652038156259714 + ], + [ + -25.128102894725544, + 11.642100949500673, + -12.937586264174598 + ], + [ + -25.940797876216713, + 10.349204702802353, + -9.36942686481071 + ], + [ + -24.95847938590399, + 9.46695882314691, + -10.539344825193155 + ], + [ + -24.54227206430763, + 11.007702772396044, + -10.37266790637831 + ], + [ + -29.029327650546907, + 14.558109891928893, + -9.930716047901829 + ], + [ + -29.064537101566476, + 15.878710322311122, + -9.338017031718612 + ], + [ + -29.766126659020042, + 15.792027821513784, + -7.990020675751655 + ], + [ + -29.34697058525761, + 16.399545229228693, + -6.990174889526247 + ], + [ + -29.75358274906173, + 16.916068723292142, + -10.231102336758244 + ], + [ + -29.984379245303913, + 18.28994366826464, + -9.587999432725242 + ], + [ + -29.062061643164295, + 19.16214935694336, + -9.704913414116392 + ], + [ + -31.05139306454883, + 18.500192947314076, + -8.992061299852466 + ], + [ + -29.641245423451583, + 14.250321531198551, + -10.672958042719074 + ], + [ + -28.06917832401425, + 16.289487128326186, + -9.168850333757215 + ], + [ + -29.17034007517836, + 17.076952169064384, + -11.1377689217849 + ], + [ + -30.718930231045192, + 16.62600835524256, + -10.645914208182957 + ], + [ + -30.78385417407308, + 14.934195590315426, + -7.872835861661812 + ], + [ + -31.287914805354177, + 14.422134923677731, + -6.576270498891515 + ], + [ + -30.17602604248627, + 13.74404583778221, + -5.843662039832889 + ], + [ + -30.01335686108165, + 14.005349925021278, + -4.661433473293481 + ], + [ + -32.41849143554789, + 13.445097278280286, + -7.004246034947363 + ], + [ + -33.01670692912183, + 12.593115581251823, + -5.894463405355543 + ], + [ + -33.66297248033771, + 13.413504705957848, + -4.818525905962388 + ], + [ + -34.34313915036746, + 12.43937749838318, + -3.8930819230498597 + ], + [ + -34.84704690347857, + 13.217109079725333, + -2.6821956056813843 + ], + [ + -31.075275676351104, + 14.45813881125207, + -8.714584553757797 + ], + [ + -31.621095608340045, + 15.249909020944528, + -5.950265315550853 + ], + [ + -33.29674282031401, + 13.975533742209336, + -7.372241965372826 + ], + [ + -32.13372271939782, + 12.740007227922717, + -7.785175255133074 + ], + [ + -33.83760801610005, + 12.096195591289927, + -6.411458646498462 + ], + [ + -32.24038719818586, + 11.911640740656594, + -5.54657243118156 + ], + [ + -32.98737319684299, + 14.040425032491271, + -4.236593715350952 + ], + [ + -34.434094161971025, + 14.05963751236402, + -5.238021922426369 + ], + [ + -35.152204926405325, + 11.95896716014164, + -4.443286907818251 + ], + [ + -33.77689541287662, + 11.527655728458228, + -3.702740523118882 + ], + [ + -35.36688284436973, + 13.984698226230535, + -3.08304052418758 + ], + [ + -35.41894750469371, + 12.677798473118628, + -2.0480262579584565 + ], + [ + -34.10825933614483, + 13.615622866413105, + -2.12052193606939 + ], + [ + -29.42151935581601, + 12.798998032835868, + -6.342297923196556 + ], + [ + -28.440671309981276, + 11.997028412720226, + -5.52981241280254 + ], + [ + -27.46015432503047, + 12.972476205115527, + -4.883180960392894 + ], + [ + -27.21492203875162, + 13.008472287815039, + -3.6784720066513312 + ], + [ + -27.82909997297476, + 10.973069420841227, + -6.4816527822842875 + ], + [ + -26.818737002027092, + 10.032429809196856, + -5.906453803298377 + ], + [ + -25.45681290244273, + 10.311297206257848, + -5.824176055330609 + ], + [ + -27.380219616540522, + 8.966172298196, + -5.177916667080196 + ], + [ + -24.665081640704116, + 9.299079868067736, + -5.1878984547300195 + ], + [ + -26.579345733958895, + 8.080166029849181, + -4.452558523808345 + ], + [ + -25.197445827085495, + 8.217860412024606, + -4.575015905527439 + ], + [ + -29.623228508511144, + 12.370917038843118, + -7.234578112643602 + ], + [ + -28.893628737872877, + 11.419059480610713, + -4.724280602752891 + ], + [ + -28.653859782123764, + 10.370935815781593, + -6.8628342210735065 + ], + [ + -27.39677238378534, + 11.465750583284887, + -7.352547292425582 + ], + [ + -25.004695299472093, + 11.159335100036515, + -6.316947030666375 + ], + [ + -28.43721506830068, + 8.776972766553456, + -5.293529442923764 + ], + [ + -23.632832334552774, + 9.613900421016695, + -5.146133847928582 + ], + [ + -27.002881886358697, + 7.245950569388128, + -3.9130183989036738 + ], + [ + -24.492573482687963, + 7.5549596125413245, + -4.09530800785491 + ], + [ + -26.706159766144598, + 13.722783797780039, + -5.648888417332579 + ], + [ + -25.554146248698398, + 14.460686322395418, + -5.1963013697269025 + ], + [ + -25.84778914640855, + 15.680789623537521, + -4.286234273762028 + ], + [ + -24.871162074888183, + 16.17697829672818, + -3.701282774767865 + ], + [ + -24.616054954205936, + 14.798723256003086, + -6.323800277078448 + ], + [ + -23.974598740912057, + 13.634668321964568, + -6.963720380279259 + ], + [ + -24.536307745234478, + 13.210005082658313, + -8.082103485180236 + ], + [ + -22.955016680891255, + 13.079097039144472, + -6.526418337205371 + ], + [ + -27.010971358028335, + 13.860697496938087, + -6.6018690897571695 + ], + [ + -25.01658544473503, + 13.79453869498434, + -4.521487203687842 + ], + [ + -25.162488330708303, + 15.343494153038364, + -7.093692642072262 + ], + [ + -23.78544305125156, + 15.41859890251817, + -5.986249260331548 + ], + [ + -25.364902946339438, + 13.620697596025252, + -8.488132567571276 + ], + [ + -23.914808638857327, + 12.602065431215294, + -8.596152834516406 + ], + [ + -27.086148091311692, + 16.231030176851164, + -4.1748785823410195 + ], + [ + -27.426066062904635, + 17.06750514857447, + -3.0217659093924887 + ], + [ + -27.46985447263667, + 16.272858062020987, + -1.6730620393297986 + ], + [ + -27.300557418888754, + 16.896547170376266, + -0.6493684478574251 + ], + [ + -28.77123004496928, + 17.724856682056156, + -3.2649095838201774 + ], + [ + -28.75102486449758, + 18.77758756449532, + -4.368596784803817 + ], + [ + -28.31536933822904, + 20.085481658660115, + -4.254637883676035 + ], + [ + -29.231258798930522, + 18.596953102487305, + -5.652428811234984 + ], + [ + -29.143884874554747, + 19.766935058469016, + -6.282767337659415 + ], + [ + -28.57285532633502, + 20.689895848144033, + -5.47937612489853 + ], + [ + -27.84407009161062, + 15.856897258146205, + -4.727762207030942 + ], + [ + -26.6956484739808, + 17.871937987185333, + -2.935283475603021 + ], + [ + -29.441562583118316, + 16.888489417605456, + -3.46299899715196 + ], + [ + -28.994390186069754, + 18.22968066875478, + -2.3249888134592394 + ], + [ + -29.53378504429876, + 17.686277185789095, + -5.967468237892072 + ], + [ + -27.980196828237215, + 20.54317044530694, + -3.335628346538968 + ], + [ + -29.55299457757616, + 20.00891895856273, + -7.252546051919236 + ], + [ + -27.605752852177723, + 14.93590954082731, + -1.599082981102586 + ], + [ + -27.873019810487552, + 14.229974222526039, + -0.29856764622938053 + ], + [ + -26.883342865729922, + 13.103237516982631, + -0.012106010032205362 + ], + [ + -26.569365223400975, + 12.89314901835462, + 1.158259631798737 + ], + [ + -29.240593055798588, + 13.650797876280876, + -0.4173217316172045 + ], + [ + -29.810211494086303, + 12.879319560649662, + 0.8393399057354534 + ], + [ + -30.638989370904092, + 13.841575553613325, + 1.6762599446112194 + ], + [ + -30.176041681034775, + 14.125498168099398, + 2.817093977541265 + ], + [ + -31.781819750241972, + 14.131681189936899, + 1.3497530922974859 + ], + [ + -27.992034807546602, + 14.518799859378078, + -2.433893040347114 + ], + [ + -27.859161531216788, + 14.977955962492274, + 0.49417172488379835 + ], + [ + -30.00329796930759, + 14.414662536518904, + -0.5686183521298996 + ], + [ + -29.140974705304814, + 12.986420394480433, + -1.2756792549854428 + ], + [ + -30.426231472648297, + 12.087392472973193, + 0.4133365821843524 + ], + [ + -29.0295803627524, + 12.362831969010415, + 1.397866102618759 + ], + [ + -26.28983827870838, + 12.420172042897775, + -1.0162547790411387 + ], + [ + -25.34584483244061, + 11.361725650623214, + -0.8263858768183925 + ], + [ + -24.002053036338264, + 11.882788459885717, + -0.268172871726333 + ], + [ + -23.387445634996176, + 11.282310268776769, + 0.647741676337774 + ], + [ + -25.18619450891342, + 10.726244156892676, + -2.177950858983095 + ], + [ + -26.750990881245347, + 12.584973535832887, + -1.8995876696841156 + ], + [ + -25.680247757285716, + 10.579672510089665, + -0.1447188045738347 + ], + [ + -26.088225722749684, + 10.414921748840925, + -2.7047564421055177 + ], + [ + -24.615292939282536, + 11.366305551171365, + -2.8506241951694262 + ], + [ + -24.536747688528273, + 9.876847434406727, + -1.966182352308604 + ], + [ + -23.511632252096692, + 13.027884572483345, + -0.8040503317290075 + ], + [ + -22.324979134281335, + 13.700692880071301, + -0.25070695853705394 + ], + [ + -22.50221225925469, + 14.063811559421197, + 1.2488981946934123 + ], + [ + -21.51886516935062, + 14.279752153194067, + 1.9598398975295719 + ], + [ + -22.080218358649482, + 15.010995558607533, + -1.0490553554388515 + ], + [ + -20.70721605198051, + 15.716948047633423, + -0.7777656558794397 + ], + [ + -20.21491585102658, + 16.824239688034254, + -1.7307870396493141 + ], + [ + -19.19439417468991, + 17.46887708042368, + -1.4442070356321892 + ], + [ + -20.733359348404413, + 16.878639665574497, + -2.882770543753543 + ], + [ + -23.894247530934795, + 13.321558597577564, + -1.691441180982291 + ], + [ + -21.409944930795206, + 13.108824246383392, + -0.2732096950798346 + ], + [ + -22.17686923004765, + 14.805327741081214, + -2.115104365506137 + ], + [ + -22.89287290558448, + 15.71541204826758, + -0.8715993264117328 + ], + [ + -20.717387392985078, + 16.0895512108724, + 0.24652117368033835 + ], + [ + -20.012299592615467, + 14.877934930616561, + -0.8131134886454813 + ], + [ + -23.72079050431127, + 14.281772054799148, + 1.691494738626753 + ], + [ + -24.036062205665853, + 14.63463825057704, + 3.091559134557912 + ], + [ + -24.267109815056585, + 13.308824163810755, + 3.902146770387619 + ], + [ + -24.12586656400912, + 13.410966560664292, + 5.161480483718584 + ], + [ + -25.141658705862678, + 15.675836649972666, + 3.1541907212706506 + ], + [ + -24.84300527384476, + 17.042968183095127, + 2.587499565349688 + ], + [ + -23.665482273226065, + 17.379670483107475, + 2.2260313557148246 + ], + [ + -25.828675172061438, + 17.854397311500406, + 2.4476233380328365 + ], + [ + -24.484333598214622, + 14.209030621416787, + 1.0343755342872436 + ], + [ + -23.17083099104166, + 15.136766433510616, + 3.524398505841292 + ], + [ + -26.11487662096666, + 15.350616881804967, + 2.7865206859222327 + ], + [ + -25.24609887074298, + 15.846409067354443, + 4.225683739414346 + ], + [ + -24.58747174059884, + 12.136162794301129, + 3.274751192239389 + ], + [ + -24.4937335327449, + 10.8087947569569, + 3.9243455145547586 + ], + [ + -22.9916541163283, + 10.324408615478774, + 4.054004343367847 + ], + [ + -22.747711133356635, + 9.53900250071979, + 5.008603387551143 + ], + [ + -25.356407833785603, + 9.822012725338652, + 3.2235817871557857 + ], + [ + -26.920134822952345, + 10.153362442195032, + 3.2825425971697726 + ], + [ + -27.750592184448113, + 9.468093651946674, + 2.155017080157777 + ], + [ + -27.46671328504479, + 9.57119214596645, + 4.571942309285025 + ], + [ + -24.954349250407876, + 12.172491364668247, + 2.334441741248928 + ], + [ + -24.829800528215422, + 10.971303177668005, + 4.9484305627486895 + ], + [ + -25.1332945561715, + 9.770676941655267, + 2.1578965610929455 + ], + [ + -25.064335297052658, + 8.868964923695216, + 3.664592755921896 + ], + [ + -27.10448292550084, + 11.227538779194788, + 3.2986498686971957 + ], + [ + -28.79940813284281, + 9.351116529510534, + 2.427786579475308 + ], + [ + -27.544724608698512, + 10.084962080191133, + 1.2802646248602596 + ], + [ + -27.35039871262748, + 8.460513189890946, + 2.042195884994573 + ], + [ + -27.564942235754547, + 8.486316886554619, + 4.610660393795385 + ], + [ + -26.94117676495656, + 10.146370835325513, + 5.334229165963099 + ], + [ + -28.49081591411702, + 9.935393361454771, + 4.653638304400959 + ], + [ + -22.080513072874897, + 10.904351400431892, + 3.33374233165783 + ], + [ + -20.6926564599912, + 10.703721629606036, + 3.4486366713512053 + ], + [ + -19.998737600552857, + 11.678320251620221, + 4.381987627705696 + ], + [ + -19.098381250793828, + 11.167626218564635, + 5.001020720950588 + ], + [ + -20.182234836455617, + 10.960530889432562, + 1.981384365540398 + ], + [ + -18.71621713540106, + 11.426025331393305, + 1.8780192506162245 + ], + [ + -17.718178061168704, + 10.47696660127366, + 2.202255797536668 + ], + [ + -18.38299902761211, + 12.698920025373923, + 1.4051895219663069 + ], + [ + -16.353920303580026, + 10.750122390936667, + 1.8915366347353828 + ], + [ + -17.10415157832398, + 12.999890047455892, + 0.9631852451537327 + ], + [ + -16.094781385248073, + 12.030028984461353, + 1.2222139169710942 + ], + [ + -22.384950058183254, + 11.405404852101867, + 2.511328028461836 + ], + [ + -20.470378230028366, + 9.672820201568925, + 3.7241971782942818 + ], + [ + -20.309056179547166, + 10.060331456213873, + 1.3800050489643079 + ], + [ + -20.710375168950772, + 11.791547912189742, + 1.5138586916669126 + ], + [ + -17.957199158179726, + 9.515369339745348, + 2.631907379947064 + ], + [ + -19.17284304759563, + 13.406200904095272, + 1.1995303909721797 + ], + [ + -15.602059484245283, + 10.000700651564955, + 2.0902206501603957 + ], + [ + -16.820784738687724, + 13.897427237871284, + 0.43353277806251056 + ], + [ + -15.105924060181161, + 12.331596079467545, + 0.9097676480990303 + ], + [ + -20.364600568853287, + 12.93612422012393, + 4.430208056614128 + ], + [ + -19.994947721187838, + 13.901570065429155, + 5.472200543664325 + ], + [ + -20.358661085424938, + 13.284671198172873, + 6.8736076176947325 + ], + [ + -19.52779312819021, + 13.184181873807574, + 7.837419090285441 + ], + [ + -20.67308529853719, + 15.2424007313615, + 5.364019486190338 + ], + [ + -20.42336839236967, + 16.088837845313265, + 6.628574233260755 + ], + [ + -19.092270425783024, + 16.35953587989343, + 7.020108830862005 + ], + [ + -21.455620900018626, + 16.827658223208232, + 7.250479940544517 + ], + [ + -18.804687392953266, + 17.259559703428522, + 8.028788947868833 + ], + [ + -21.128829295759974, + 17.697868985881314, + 8.308543061142466 + ], + [ + -19.815390640238178, + 17.985555111008694, + 8.684797274837862 + ], + [ + -19.519406429251987, + 18.74129333557744, + 9.771911706865149 + ], + [ + -20.995529508493803, + 13.325489132540156, + 3.7443328381508536 + ], + [ + -18.908816662309818, + 13.96638486793779, + 5.4072721299175255 + ], + [ + -20.358697177137287, + 15.791868602067325, + 4.4766953269687315 + ], + [ + -21.754138500247937, + 15.103342837553896, + 5.35453115319659 + ], + [ + -18.335395767156108, + 15.772983926937286, + 6.520609322324934 + ], + [ + -22.49488837446724, + 16.842030119713627, + 6.95701122845784 + ], + [ + -17.78940743198728, + 17.393417989626755, + 8.371852170634298 + ], + [ + -21.95564187215052, + 18.22374271998683, + 8.76267283802289 + ], + [ + -20.280133535481216, + 18.816413694806897, + 10.352647497069455 + ], + [ + -21.609376636205244, + 12.881931071766587, + 7.025398456569021 + ], + [ + -22.046309074652818, + 12.033088495393315, + 8.195352371204368 + ], + [ + -21.12652790482607, + 10.8919174543459, + 8.498717719047832 + ], + [ + -20.518743560443056, + 10.76013838680143, + 9.552523311943746 + ], + [ + -23.53330472575201, + 11.666751085664998, + 8.076669964630412 + ], + [ + -24.53327161609931, + 12.775189262177832, + 8.365114718849487 + ], + [ + -25.966074897387, + 12.383134009408934, + 8.005916507892007 + ], + [ + -26.332640229059763, + 12.642737414423323, + 6.8092645188163425 + ], + [ + -26.702019920356747, + 11.866044661920569, + 8.836501975843158 + ], + [ + -22.260261066253907, + 13.091846302173451, + 6.282173026597389 + ], + [ + -21.97715480894505, + 12.65832921286409, + 9.085515485530777 + ], + [ + -23.713536420019484, + 11.1872742104527, + 7.114527171188511 + ], + [ + -23.69557113544182, + 10.873329364459266, + 8.806225217393376 + ], + [ + -24.53044627341474, + 13.066622507709383, + 9.415427638204969 + ], + [ + -24.331699859241585, + 13.60116823823455, + 7.683039638464436 + ], + [ + -25.614296739589612, + 12.89215077486432, + 6.1445252387656994 + ], + [ + -27.293329776165855, + 12.543663113864056, + 6.513700979850391 + ], + [ + -20.90614627069659, + 10.010033720882404, + 7.494006357893479 + ], + [ + -20.07926027484757, + 8.773741548375313, + 7.625269541107638 + ], + [ + -18.619333482697808, + 9.035127586800058, + 7.966026398351348 + ], + [ + -18.11096446538214, + 8.287148188296271, + 8.825396200364217 + ], + [ + -20.27140217843743, + 7.901369615862791, + 6.38289351520472 + ], + [ + -21.598091944568473, + 7.535918839914757, + 6.202795322063091 + ], + [ + -21.41919348074529, + 10.105836998401912, + 6.629306635573652 + ], + [ + -20.517866099991664, + 8.210121878634197, + 8.448712757141916 + ], + [ + -19.95099337457752, + 8.42409642443829, + 5.481675508966554 + ], + [ + -19.73402086812798, + 6.990617991878764, + 6.647186105335367 + ], + [ + -22.05554663302852, + 8.172466479546586, + 5.648591835727924 + ], + [ + -18.038580627821116, + 10.042882878051898, + 7.400171343024045 + ], + [ + -16.684937518053534, + 10.555212812871105, + 7.746236289313913 + ], + [ + -16.55970991732593, + 11.282220512716265, + 9.080921359555534 + ], + [ + -15.502459995086225, + 11.053392509629987, + 9.682100392212426 + ], + [ + -16.250652499098, + 11.482877600604013, + 6.640147320591118 + ], + [ + -16.186554133385073, + 10.811158853541826, + 5.451080130756259 + ], + [ + -18.512990617926512, + 10.567803636941107, + 6.6794106627820655 + ], + [ + -15.985487987869774, + 9.722563790787717, + 7.6715865698588255 + ], + [ + -16.943775398039897, + 12.31940018206376, + 6.729109619057055 + ], + [ + -15.240330211063005, + 11.834506723721915, + 6.849207077184219 + ], + [ + -17.08036527068873, + 10.733413714908238, + 5.109523241069942 + ], + [ + -17.577590528475618, + 12.021122061309427, + 9.600330328036875 + ], + [ + -17.511562880860442, + 12.450822566828663, + 11.02779898531108 + ], + [ + -17.649415608748594, + 11.215738588944703, + 11.930101892308462 + ], + [ + -16.853476032061387, + 11.177824068012853, + 12.913639404327036 + ], + [ + -18.642341023207706, + 13.412686755076038, + 11.318460336105757 + ], + [ + -18.323688388272092, + 14.890252584067639, + 11.428615138940906 + ], + [ + -19.58460968490055, + 15.699799176664783, + 11.25418947458753 + ], + [ + -17.8207173006188, + 15.178492855307695, + 12.865520657451771 + ], + [ + -18.450943545188604, + 12.172580340241268, + 9.1161721204587 + ], + [ + -16.552874533037578, + 12.939016706734606, + 11.202966069257938 + ], + [ + -19.410651328362192, + 13.25659394147226, + 10.561211128177556 + ], + [ + -19.12752948493774, + 13.136119454626396, + 12.254516958549447 + ], + [ + -17.70586544707798, + 15.198097139896731, + 10.585036129688369 + ], + [ + -20.381670015102515, + 15.386573940130347, + 11.928490903261906 + ], + [ + -19.48023985518869, + 16.738465674666713, + 11.56783690488637 + ], + [ + -19.984200543921926, + 15.694601130030378, + 10.240088837795684 + ], + [ + -18.623699999934857, + 15.263898478583428, + 13.597657752399153 + ], + [ + -17.097412959118795, + 14.453174910862458, + 13.238132406141078 + ], + [ + -17.275812231008146, + 16.12251431921436, + 12.863155715296315 + ], + [ + -18.500056353828807, + 10.22957782536264, + 11.610201226624122 + ], + [ + -18.518719274620665, + 8.959435130245822, + 12.429282310644723 + ], + [ + -17.257477973769873, + 8.092212073656299, + 12.27389972342707 + ], + [ + -16.922740883227462, + 7.323828390893766, + 13.173278883256796 + ], + [ + -19.818613316197133, + 8.219133387108798, + 12.186711573143848 + ], + [ + -19.160974717482333, + 10.261050983100233, + 10.847117861870144 + ], + [ + -18.5495095319363, + 9.305475962987998, + 13.462436992264184 + ], + [ + -19.882071606433296, + 7.887632255680785, + 11.150284310993847 + ], + [ + -19.880157816610968, + 7.430468737109777, + 12.936591495831696 + ], + [ + -20.69365222323997, + 8.865537022671447, + 12.254321311321792 + ], + [ + -16.51330190088628, + 8.226219432963717, + 11.215298756244328 + ], + [ + -15.106229668439125, + 7.790605954275975, + 11.175611705775589 + ], + [ + -14.038003056312514, + 8.701796212225247, + 11.93888935290361 + ], + [ + -13.162569229514618, + 8.14693361203939, + 12.589346826438497 + ], + [ + -14.585866165225553, + 7.648409720300663, + 9.692811911195166 + ], + [ + -15.300233803308123, + 6.761217110980226, + 8.891613482718798 + ], + [ + -16.912232515729773, + 8.859879268909765, + 10.537489074607251 + ], + [ + -15.097984523457802, + 6.794357389980746, + 11.617788346891881 + ], + [ + -14.774844112457256, + 8.629022778856097, + 9.256021422780126 + ], + [ + -13.523112246758837, + 7.439457611447381, + 9.57036743662225 + ], + [ + -16.22077665848067, + 6.969418390875205, + 8.715946854675245 + ], + [ + -14.086413677941646, + 10.092969881763054, + 11.760130343622347 + ], + [ + -13.068726751011488, + 10.987542000231883, + 12.304317352433111 + ], + [ + -12.909269248041237, + 10.883846433287886, + 13.769338403678754 + ], + [ + -11.855507327589446, + 10.697774314988294, + 14.370009337267991 + ], + [ + -13.274168329660746, + 12.345101634867206, + 11.700368283128165 + ], + [ + -12.194592645961043, + 13.215390446288552, + 12.186474533786754 + ], + [ + -12.33842952164829, + 13.970688475917086, + 13.268329279912939 + ], + [ + -10.82650657902671, + 13.246906530837691, + 11.716138666792624 + ], + [ + -10.165800576106168, + 14.117944610242375, + 12.61775461783765 + ], + [ + -10.057944124632247, + 12.717111627619374, + 10.622493839588953 + ], + [ + -11.097533293473832, + 14.50040845233707, + 13.575569661034374 + ], + [ + -8.761331315876241, + 14.297747072593893, + 12.55201877084878 + ], + [ + -8.667428421514407, + 12.922045786912008, + 10.527930686940039 + ], + [ + -7.999898611689939, + 13.728934039143269, + 11.449724583379643 + ], + [ + -14.719396851906005, + 10.366696207775874, + 11.02222393227317 + ], + [ + -12.055083439098755, + 10.68168144358367, + 12.045328160129399 + ], + [ + -13.17408797635173, + 12.287025561283713, + 10.61652638730729 + ], + [ + -14.258249122623408, + 12.722884893528487, + 11.97779414631082 + ], + [ + -13.238818620111436, + 14.060574097343192, + 13.857922047529689 + ], + [ + -10.957745685453684, + 15.051201590788423, + 14.410546066604761 + ], + [ + -10.629566873352612, + 12.19169603966617, + 9.871771075536742 + ], + [ + -8.206213549459518, + 15.002083952530711, + 13.153809686851023 + ], + [ + -8.123420040891949, + 12.659022285748676, + 9.63279114178909 + ], + [ + -6.955200524087199, + 13.962914820589958, + 11.30739092771456 + ], + [ + -14.050470736241104, + 10.991672339990032, + 14.387531364351538 + ], + [ + -14.086529253590491, + 10.934071583283469, + 15.877901875077363 + ], + [ + -13.691184143172627, + 9.570992341170893, + 16.463222261086898 + ], + [ + -13.08047297680288, + 9.519654996512543, + 17.508703951336265 + ], + [ + -15.554476381370453, + 11.285398657745588, + 16.224319732082666 + ], + [ + -16.224439132405635, + 12.620653521101929, + 15.702821381724002 + ], + [ + -17.51505636851894, + 12.791046426362698, + 15.894524766177424 + ], + [ + -15.59549897840884, + 13.602690188825704, + 15.264354370381682 + ], + [ + -14.925013206108083, + 11.013728916249534, + 13.882760488065072 + ], + [ + -13.392900721499492, + 11.723284915982788, + 16.167938763685388 + ], + [ + -16.232031554704747, + 10.502289517648023, + 15.884081887621607 + ], + [ + -15.602262507417507, + 11.27791144132459, + 17.31324338248304 + ], + [ + -18.042656478293956, + 11.96132657380167, + 16.12539302287367 + ], + [ + -17.9451112826763, + 13.682740106995539, + 15.694445218847958 + ], + [ + -14.114500176926267, + 8.456291533097328, + 15.879645593643446 + ], + [ + -13.425961828021801, + 7.17690084179867, + 16.111353621367655 + ], + [ + -11.90112421330048, + 7.172020453569701, + 15.908628175211465 + ], + [ + -11.240549244052847, + 6.874493942261154, + 16.918660132580825 + ], + [ + -14.12489296701266, + 6.055794572955051, + 15.17367916122621 + ], + [ + -13.290003848241154, + 4.762872179926063, + 15.250268417919276 + ], + [ + -12.920855859878957, + 4.190553196703405, + 16.470406069391505 + ], + [ + -13.00407923742902, + 4.154470089649578, + 14.008829725047574 + ], + [ + -12.05338217704905, + 3.0016664680389766, + 16.430816636371315 + ], + [ + -12.193350115954948, + 2.9578709739254094, + 14.007655888740594 + ], + [ + -11.738834746472914, + 2.3626275123625504, + 15.23288231587019 + ], + [ + -10.926319880947208, + 1.3158160421136245, + 15.161921965164654 + ], + [ + -14.741418952837758, + 8.593421622822802, + 15.099729449246716 + ], + [ + -13.563349463610487, + 6.978139558006262, + 17.174232416749685 + ], + [ + -15.084325914276656, + 5.758104939762632, + 15.596729968343896 + ], + [ + -14.287067368655647, + 6.447520069762533, + 14.169513321873048 + ], + [ + -13.225379474945054, + 4.633951647786773, + 17.40692392056962 + ], + [ + -13.42950504257164, + 4.5460812450408525, + 13.096661517760634 + ], + [ + -11.595510733208135, + 2.695391082293739, + 17.359766880361665 + ], + [ + -11.967988229254107, + 2.580046154305677, + 13.021319522139304 + ], + [ + -10.84141921209615, + 1.0379726446298605, + 14.246940887945978 + ], + [ + -11.329629448942976, + 7.491015834063319, + 14.712323459465564 + ], + [ + -9.931435267496745, + 7.133362908554375, + 14.482443313769183 + ], + [ + -9.07208583976559, + 8.075554129314241, + 15.332456542618578 + ], + [ + -7.997763515406905, + 7.596074912639494, + 15.795024911005475 + ], + [ + -9.700378970459159, + 7.1043771644239655, + 13.009938156782258 + ], + [ + -10.29546078077744, + 5.907844975501433, + 12.350093824594943 + ], + [ + -11.424913587212094, + 5.966808853596433, + 11.698999506054163 + ], + [ + -9.566989592633984, + 4.924131040177457, + 12.184420538298737 + ], + [ + -11.931587445688672, + 7.509157485109881, + 13.901510941690994 + ], + [ + -9.719561720069503, + 6.154177751848437, + 14.91186756025982 + ], + [ + -10.14804324334829, + 7.998036112538102, + 12.575116072906868 + ], + [ + -8.640231895240913, + 7.094853656160751, + 12.756768264163085 + ], + [ + -12.060112599988614, + 6.702123281719366, + 11.974563875712422 + ], + [ + -11.716073607027685, + 5.237026520750476, + 11.064378154156305 + ], + [ + -9.44418100076018, + 9.335281999462666, + 15.641314132400481 + ], + [ + -8.841046878192778, + 10.228617825758988, + 16.702702116584344 + ], + [ + -9.169344866709825, + 9.933481167122295, + 18.195097234997363 + ], + [ + -8.30971676908869, + 10.400709852269472, + 19.03465507427836 + ], + [ + -9.312706501531546, + 11.695580732298879, + 16.483575529401232 + ], + [ + -8.758613497355965, + 12.163837319460697, + 15.134296822268437 + ], + [ + -10.661739318184383, + 11.798436494711552, + 16.50061830854436 + ], + [ + -10.280368780459435, + 9.697802825400856, + 15.206031601110018 + ], + [ + -7.753856687975862, + 10.1632972673616, + 16.659697211623357 + ], + [ + -8.853555911961433, + 12.359595287419893, + 17.215944348669563 + ], + [ + -11.078135608669482, + 11.461937121444691, + 15.703760914350147 + ], + [ + -7.705707764441455, + 11.881985338266077, + 15.127202157347382 + ], + [ + -9.230913752139886, + 11.660174698136245, + 14.290877115585264 + ], + [ + -8.76009494325662, + 13.232192780814898, + 14.918167303890222 + ], + [ + -10.094263051546564, + 9.040148462775903, + 18.607414802781438 + ], + [ + -10.275347028477231, + 8.432617006286307, + 19.948078478863973 + ], + [ + -11.097819178360403, + 7.162197238113151, + 19.892242495838875 + ], + [ + -12.352641689644152, + 7.227943942676063, + 19.78815985907964 + ], + [ + -11.023013529575207, + 9.466748091526597, + 20.764599495084248 + ], + [ + -11.55946673331101, + 8.960814251627653, + 22.131379854403704 + ], + [ + -12.621196679342845, + 9.529277626686053, + 22.636954691621995 + ], + [ + -10.95603120864341, + 8.080168371311629, + 22.76708223820908 + ], + [ + -10.729927154626457, + 8.71270118333274, + 17.89411016376798 + ], + [ + -9.29677649274848, + 8.261547418378086, + 20.396665185191225 + ], + [ + -10.477034506130044, + 10.370259913621624, + 21.036026441613945 + ], + [ + -11.827149809298186, + 9.815837508375978, + 20.11683236778015 + ], + [ + -12.942931638107702, + 10.419463405502427, + 22.28459734883501 + ], + [ + -12.742578845378977, + 9.161690656498024, + 23.56982613272514 + ], + [ + -10.437628144707325, + 6.013694687897527, + 19.95336717487435 + ], + [ + -11.033681649457316, + 4.651804518464758, + 20.13518806344042 + ], + [ + -12.006768458660478, + 4.538461735991547, + 21.29243251119474 + ], + [ + -11.531142504145706, + 4.478303321804361, + 22.44426811504433 + ], + [ + -9.933611776983533, + 3.555749556351543, + 20.236170655719256 + ], + [ + -8.871591537200244, + 3.6176625063997108, + 19.10541751246149 + ], + [ + -10.55620887718547, + 2.1495499417978863, + 20.417680913364322 + ], + [ + -7.568298354166044, + 2.7887707510577684, + 19.377468891599815 + ], + [ + -9.431642225024904, + 6.099078067280004, + 19.9816691642647 + ], + [ + -11.586168424901668, + 4.375712925135787, + 19.2370592997315 + ], + [ + -9.30236210610667, + 3.8169857411796215, + 21.08550802214473 + ], + [ + -9.304680127374846, + 3.4652504717640795, + 18.11683336083886 + ], + [ + -8.614161869756803, + 4.676391044899248, + 19.135803393604657 + ], + [ + -10.75326164614947, + 1.7822695080686657, + 19.41051647580463 + ], + [ + -9.865645210147092, + 1.49115060387075, + 20.94468479193876 + ], + [ + -11.460486356318961, + 2.1338937531398017, + 21.02606782434647 + ], + [ + -7.8264687042235614, + 1.7299501150352796, + 19.3960414293043 + ], + [ + -6.904231523963531, + 3.021622752482685, + 18.545063342405445 + ], + [ + -7.005725351531531, + 3.231066178206291, + 20.199651532616762 + ], + [ + -13.305758744820807, + 4.44836030977649, + 20.92653847907569 + ], + [ + -14.33736024169445, + 4.071722026252246, + 21.94921285011437 + ], + [ + -15.34483526446885, + 3.0985669158372104, + 21.316790173404403 + ], + [ + -15.518097243424071, + 3.1211934430809123, + 20.088010979989722 + ], + [ + -15.011601616031, + 5.286728744132688, + 22.598871875329518 + ], + [ + -14.180223310815238, + 6.389353849874794, + 23.245366743389663 + ], + [ + -15.925738265089421, + 5.96041861233229, + 21.73709194895421 + ], + [ + -13.517331738438402, + 4.551642608598428, + 19.94436054785109 + ], + [ + -13.906790229938096, + 3.4997663599527584, + 22.771147346216193 + ], + [ + -15.637181031133911, + 4.837241710197219, + 23.37004975027256 + ], + [ + -16.38827548832214, + 6.600750445523715, + 22.282654252525237 + ], + [ + -14.766466258611109, + 7.28848947865464, + 23.435028309944954 + ], + [ + -13.604161086091729, + 6.077635344425602, + 24.11662178675969 + ], + [ + -13.560088575881394, + 6.832087715866692, + 22.46593131141344 + ], + [ + -16.01223004596586, + 2.2387902951977168, + 22.063730809823575 + ], + [ + -16.902169896612925, + 1.2505207519984864, + 21.560514709438337 + ], + [ + -18.26229114369198, + 1.946244659881529, + 21.16168251289937 + ], + [ + -18.90965709450742, + 1.6043370937255617, + 20.167800429894037 + ], + [ + -17.108805431349968, + 0.09462439995744276, + 22.616839015805752 + ], + [ + -15.944405452770187, + -0.8202875637723466, + 22.77591328068776 + ], + [ + -16.264828253750974, + -2.027189797193955, + 23.683626533663357 + ], + [ + -15.317644208375834, + -2.6389790080232416, + 24.229618098460918 + ], + [ + -17.481887619242666, + -2.4837336087037443, + 23.696632650229642 + ], + [ + -15.825371976691919, + 2.237739563924208, + 23.05629546507883 + ], + [ + -16.578849801099164, + 0.80178225433934, + 20.621262029532833 + ], + [ + -17.26491233203276, + 0.6019805807325689, + 23.568847973256194 + ], + [ + -18.05745514881916, + -0.39823103070695076, + 22.40409692274694 + ], + [ + -15.65961022178424, + -1.237441928129961, + 21.810005392578415 + ], + [ + -15.168199765880319, + -0.2716138390801106, + 23.3093576854626 + ], + [ + -18.5426204853148, + 3.1582894277653395, + 21.721441850824753 + ], + [ + -19.638476494047282, + 4.09775050331092, + 21.234294351469273 + ], + [ + -19.370012273799833, + 4.881313887123383, + 19.963854244635982 + ], + [ + -20.280496210819287, + 5.149426947161032, + 19.14980582831787 + ], + [ + -20.02620089833487, + 5.111816816347414, + 22.37035473310206 + ], + [ + -20.935718528139713, + 4.536050810157661, + 23.451100498167037 + ], + [ + -21.29020040907518, + 5.5436086380763925, + 24.497971452039653 + ], + [ + -22.345538165888325, + 6.155307117235822, + 24.338357098306275 + ], + [ + -20.455853062542285, + 5.759677231796417, + 25.362128707882217 + ], + [ + -17.977380540266974, + 3.3795837754254023, + 22.5286812880427 + ], + [ + -20.52717539977861, + 3.5092492828668753, + 21.00629529066003 + ], + [ + -19.074335558447572, + 5.419374152782893, + 22.803323865147497 + ], + [ + -20.459892884225077, + 6.004354594192733, + 21.919368752899388 + ], + [ + -21.81342038057166, + 4.150615652216544, + 22.93227149929333 + ], + [ + -20.44705212969378, + 3.693471255588861, + 23.94034440920717 + ], + [ + -18.132858472666236, + 5.272772847455542, + 19.708111840009305 + ], + [ + -17.748716625946265, + 5.848449878072273, + 18.381098882514664 + ], + [ + -17.8613689883439, + 4.8034251387929885, + 17.26732144173674 + ], + [ + -18.444422820785924, + 5.126388907892107, + 16.222170665097906 + ], + [ + -16.398798021931853, + 6.6188796087705555, + 18.41528570254604 + ], + [ + -16.224961687532293, + 7.700163064787262, + 19.437079567285156 + ], + [ + -15.037184656772007, + 8.22767035919395, + 19.61284683437395 + ], + [ + -17.226430189559448, + 8.196176908781808, + 20.00390706267406 + ], + [ + -17.38129428085229, + 5.0833321451808615, + 20.355694767587032 + ], + [ + -18.472181752779488, + 6.638826527364472, + 18.181084913387817 + ], + [ + -15.677800796918497, + 5.833797786560609, + 18.643130294205417 + ], + [ + -16.22343500844193, + 7.096512972548851, + 17.451330559789284 + ], + [ + -14.213812472930263, + 7.7511398242286305, + 19.273620422681805 + ], + [ + -14.980209136774231, + 9.104981996984122, + 20.11001575900382 + ], + [ + -17.258891882346887, + 3.65842619688695, + 17.554189639696695 + ], + [ + -17.332693134320085, + 2.5536194335089846, + 16.61107671473842 + ], + [ + -18.81310459175443, + 2.170576079458428, + 16.333916325256165 + ], + [ + -19.203630863204335, + 2.086593675107295, + 15.213810662106727 + ], + [ + -16.508562260249125, + 1.330100133777222, + 16.9929489647791 + ], + [ + -16.825174724597932, + 0.16635524839118432, + 16.105740810417483 + ], + [ + -15.05288601074601, + 1.6950145197028093, + 16.969036309705327 + ], + [ + -16.708943235376605, + 3.7117370041451636, + 18.39965423987578 + ], + [ + -16.83468594795143, + 2.8537147242447816, + 15.68910554830523 + ], + [ + -16.83346824608574, + 0.9809108145300627, + 17.97305395544897 + ], + [ + -16.655151788335495, + 0.40386593081953137, + 15.055607372506698 + ], + [ + -16.129704119808853, + -0.6635365553183625, + 16.23101686213231 + ], + [ + -17.801125894839, + -0.3181686491276281, + 16.13502320363069 + ], + [ + -14.903149548834087, + 2.511371060707887, + 17.675610024538134 + ], + [ + -14.394938121677495, + 0.8585662796757845, + 17.204751342140952 + ], + [ + -14.836253932275529, + 2.0554485172342822, + 15.96342499234395 + ], + [ + -19.672697598369613, + 2.1130377617504763, + 17.348125507591064 + ], + [ + -21.10952353819814, + 2.066095342106891, + 17.18291510407262 + ], + [ + -21.749448428178955, + 3.1391263137258676, + 16.35331620813973 + ], + [ + -22.448011239092253, + 2.83942360819384, + 15.430230584103063 + ], + [ + -21.763948222153108, + 1.7817588741331463, + 18.62068703930872 + ], + [ + -23.27436006238124, + 1.4640940296755645, + 18.60071600551061 + ], + [ + -23.668880813483174, + 0.6478510008187435, + 19.806498975245336 + ], + [ + -24.88435110122385, + 0.121949559407593, + 19.913202617065217 + ], + [ + -22.94921827337162, + 0.5423441175494013, + 20.776304596783014 + ], + [ + -19.371921139172223, + 2.139381360630267, + 18.31194168073366 + ], + [ + -21.312394019642635, + 1.1529040118130567, + 16.623427383849233 + ], + [ + -21.234090819034403, + 0.9750904266891851, + 19.127278061767846 + ], + [ + -21.451778272812287, + 2.683996940656499, + 19.14663252517918 + ], + [ + -23.767074078638675, + 2.4355051408106334, + 18.559574928400995 + ], + [ + -23.480258859927936, + 0.8776607108167838, + 17.705284604957324 + ], + [ + -25.50699747837671, + 0.12293493704954717, + 19.117957704273692 + ], + [ + -25.057897136383094, + -0.4016597366084369, + 20.75926200554901 + ], + [ + -21.4425015288713, + 4.4095774965202, + 16.541945914969684 + ], + [ + -21.950096331706973, + 5.54303497977665, + 15.689876775985836 + ], + [ + -21.492348211661234, + 5.326469605773923, + 14.224332004659477 + ], + [ + -22.213938555348204, + 5.425264882058144, + 13.241072340273634 + ], + [ + -21.5046909603348, + 6.910924756488498, + 16.295252446786723 + ], + [ + -21.956402863864884, + 8.103346508083689, + 15.554796134750676 + ], + [ + -22.449745952366175, + 9.06592093994027, + 16.308723607848933 + ], + [ + -21.83480760555524, + 8.216744314924426, + 14.397673480261123 + ], + [ + -20.838238764739643, + 4.552371193663475, + 17.338545748549866 + ], + [ + -23.03970368456237, + 5.5143758696577265, + 15.684346290564802 + ], + [ + -21.802765379183526, + 6.981487849306802, + 17.341325780943773 + ], + [ + -20.425887124609446, + 7.064028303033751, + 16.324274039492952 + ], + [ + -22.448618924517238, + 9.0139459370086, + 17.317385047290756 + ], + [ + -22.850690238098984, + 9.874209386715393, + 15.854840460361894 + ], + [ + -20.19747262207594, + 4.973731409943184, + 14.001978884547077 + ], + [ + -19.573572762670832, + 4.716379711316222, + 12.62908109388052 + ], + [ + -20.38084804538366, + 3.5069445033306295, + 11.974066428075083 + ], + [ + -20.65650062568119, + 3.654995564156991, + 10.787284484607111 + ], + [ + -18.14939224504065, + 4.286548083899902, + 12.829518040833795 + ], + [ + -17.45588070105458, + 3.9496709546914417, + 11.470938293469676 + ], + [ + -15.605569658737807, + 3.931599547518317, + 11.333390562851251 + ], + [ + -15.213511953477507, + 2.4609765449285703, + 12.289242703165415 + ], + [ + -19.656700935012058, + 4.869229599429616, + 14.848586125700098 + ], + [ + -19.647539626731632, + 5.581710866247818, + 11.970422209273773 + ], + [ + -17.636969494381777, + 5.110024817087265, + 13.326919533178462 + ], + [ + -18.15228466808981, + 3.4446502851471905, + 13.521833889489896 + ], + [ + -17.7779722042897, + 3.0078945630286, + 11.026623215083363 + ], + [ + -17.71799811491142, + 4.726657560731411, + 10.752824225983588 + ], + [ + -15.293984908507287, + 2.6284560855385024, + 13.36328869495239 + ], + [ + -15.78030657995774, + 1.5822730052740397, + 11.98146767390701 + ], + [ + -14.222865699825755, + 2.0833907496003974, + 12.035967463862578 + ], + [ + -20.70115846706795, + 2.4444304054184016, + 12.69915106720819 + ], + [ + -21.544008372170754, + 1.2738186935991322, + 12.358569832418306 + ], + [ + -22.880040634598416, + 1.7180509979967695, + 11.818712923555562 + ], + [ + -23.355995914431123, + 1.2430987062822894, + 10.830828885177313 + ], + [ + -21.654239665605868, + 0.27129364409035617, + 13.49293585174468 + ], + [ + -22.383575466797293, + -0.9580711166426639, + 13.004428821975718 + ], + [ + -21.71468202087536, + -1.799775452060615, + 12.232367489748777 + ], + [ + -23.4934957670594, + -1.2492085574182923, + 13.414191055505523 + ], + [ + -20.365417724714266, + 2.4057545189472336, + 13.650928222244765 + ], + [ + -20.94146887984918, + 0.8265087319355615, + 11.568024200800819 + ], + [ + -20.64477117854032, + -0.07029605024562935, + 13.721826264635663 + ], + [ + -22.16565256674207, + 0.7893093814401517, + 14.30423854088915 + ], + [ + -20.75877375019431, + -1.5668381823782198, + 12.004160702732595 + ], + [ + -22.086891748701518, + -2.7232656073707346, + 12.062880006604715 + ], + [ + -23.54762442539736, + 2.5978079030700627, + 12.545896223809933 + ], + [ + -24.778648349493338, + 3.15539596554531, + 12.132193399659252 + ], + [ + -24.651085541768452, + 4.035398529053765, + 10.911244006043882 + ], + [ + -25.551391896574327, + 3.966549776991087, + 10.074421759753914 + ], + [ + -25.562376461347675, + 3.753863425777098, + 13.352749391639287 + ], + [ + -25.980211912940362, + 2.651642027185389, + 14.347767974105665 + ], + [ + -25.551305946888643, + 2.694162204752317, + 15.57754461650096 + ], + [ + -26.696736817100835, + 1.7469108885206026, + 14.05325889827237 + ], + [ + -23.117305808076875, + 3.051926544849408, + 13.338802004129658 + ], + [ + -25.30739421009284, + 2.262097797770025, + 11.799704233237732 + ], + [ + -24.964935205699444, + 4.530914812278127, + 13.829569427379687 + ], + [ + -26.438539258011648, + 4.236635128897376, + 12.919884807061083 + ], + [ + -24.944853177731993, + 3.4045386919517, + 15.96183318076964 + ], + [ + -25.763389306861978, + 1.837710460788884, + 16.069087874902078 + ], + [ + -23.65422045573949, + 4.874859645885664, + 10.832760445983345 + ], + [ + -23.491250049702547, + 5.712815202363544, + 9.682370243039083 + ], + [ + -23.42942446221073, + 5.023501925980128, + 8.324986245515715 + ], + [ + -24.103547128965545, + 5.265178704249422, + 7.310873122133071 + ], + [ + -22.3041068039118, + 6.626209166720059, + 9.974916371903486 + ], + [ + -22.948664456097994, + 4.897949197328444, + 11.555087530544986 + ], + [ + -24.34931647788899, + 6.384930437066913, + 9.691505076664123 + ], + [ + -22.364824076551532, + 7.0158222741557665, + 10.991094669691519 + ], + [ + -21.321053125454835, + 6.155423800114477, + 9.966731377281048 + ], + [ + -22.289597605410748, + 7.471282769039647, + 9.286627838011222 + ], + [ + -22.61687447019573, + 3.9163897977003046, + 8.355823318830678 + ], + [ + -22.46829299901018, + 3.0009374927301877, + 7.225488599513274 + ], + [ + -23.756292409644722, + 2.2380332223395527, + 6.898232629151204 + ], + [ + -23.920126066708224, + 1.8222185647458957, + 5.756658491656237 + ], + [ + -22.059937323620822, + 3.775191416971552, + 9.186477396735912 + ], + [ + -22.153453746021263, + 3.4202819049640993, + 6.269912766821369 + ], + [ + -21.63446695028814, + 2.3186029451728274, + 7.390560134495479 + ], + [ + -24.58582258480958, + 1.9871933259021546, + 7.943181318125406 + ], + [ + -25.75213306392073, + 1.142769772094674, + 7.76026011568522 + ], + [ + -26.915045421729914, + 1.9036552140505165, + 7.16504242778244 + ], + [ + -27.528330599962302, + 1.4800771450279413, + 6.193741410705155 + ], + [ + -26.067754355506718, + 0.5928185357347537, + 9.16958796190469 + ], + [ + -27.263033396955382, + -0.39820873803322776, + 8.975878869153915 + ], + [ + -27.077271048648953, + -1.504695769010155, + 8.442287715066177 + ], + [ + -28.419172645721623, + -0.14950395047041898, + 9.389723030640987 + ], + [ + -24.381759477240788, + 2.354000979338764, + 8.861827548042816 + ], + [ + -25.603796667101168, + 0.24448924052276588, + 7.160937078831686 + ], + [ + -25.186535561638447, + 0.11942809703397828, + 9.602551667762116 + ], + [ + -26.335062008061353, + 1.3292505731523647, + 9.927422555345734 + ], + [ + -27.115961720925966, + 3.0886426272516587, + 7.681867927486556 + ], + [ + -27.996254895646118, + 4.078687096547355, + 7.011237955665272 + ], + [ + -27.481576508324505, + 4.533439689284478, + 5.614516928969404 + ], + [ + -28.364982198744517, + 4.617751459353286, + 4.78847320738113 + ], + [ + -28.278067164722504, + 5.307110394254437, + 7.950979965326919 + ], + [ + -29.606828428692477, + 6.05506793910871, + 7.600879842575249 + ], + [ + -29.553408847227534, + 7.429902103197378, + 8.352731957536957 + ], + [ + -28.455787519286144, + 8.390849218652647, + 7.843706516736378 + ], + [ + -28.41542391945141, + 9.593765404939461, + 8.633619111874658 + ], + [ + -26.50876433366878, + 3.361363295143093, + 8.441496063206356 + ], + [ + -28.961564901517306, + 3.6202365541174686, + 6.796536838249388 + ], + [ + -28.447919947002525, + 4.96746175399511, + 8.972689614551955 + ], + [ + -27.42622132340138, + 5.9811073842784594, + 7.860487057942609 + ], + [ + -29.66846197499621, + 6.197778514335084, + 6.522020577135643 + ], + [ + -30.409871949779802, + 5.395388211466297, + 7.9295806488532 + ], + [ + -30.4943802067946, + 7.969553782833998, + 8.24573650705858 + ], + [ + -29.416508215253113, + 7.356140572675201, + 9.431580289847917 + ], + [ + -27.484217932269647, + 7.901796542515797, + 7.914336710386708 + ], + [ + -28.60408640205291, + 8.61820210039673, + 6.788046461319293 + ], + [ + -29.24853815510709, + 10.163749950101533, + 8.599820893428031 + ], + [ + -28.31041711405538, + 9.33572921879022, + 9.604437839699528 + ], + [ + -27.586259036129324, + 10.158533171767544, + 8.516916660101678 + ], + [ + -26.165693365648334, + 4.816374206617525, + 5.480406085183998 + ], + [ + -25.593923867528876, + 5.106652720918504, + 4.1057482735850925 + ], + [ + -25.824005245684845, + 3.9433431524259106, + 3.178945009818206 + ], + [ + -26.56154407771087, + 4.136428731244536, + 2.239830689635596 + ], + [ + -24.085656804596493, + 5.3937663584773645, + 4.19241586664168 + ], + [ + -23.193996684977172, + 5.394452016730867, + 3.015540606207591 + ], + [ + -21.98637021100476, + 4.788768364356429, + 2.8705498104889204 + ], + [ + -23.390734219647317, + 6.1218924968851525, + 1.7272839441520809 + ], + [ + -22.348873936654442, + 5.721722906002952, + 0.7932401553938722 + ], + [ + -24.497851079487397, + 6.766087352871921, + 1.172695705551334 + ], + [ + -21.512117930458096, + 4.940518545606778, + 1.5941486515681562 + ], + [ + -22.351588509272574, + 6.213835873559248, + -0.5223893228232168 + ], + [ + -24.524255001928466, + 7.1754132326567515, + -0.18788266408791626 + ], + [ + -23.455179130219054, + 6.905091393043222, + -1.0281329008745297 + ], + [ + -25.557687387073226, + 5.005835591810495, + 6.2643272876488485 + ], + [ + -26.18109558624917, + 5.884196595021081, + 3.617121735292332 + ], + [ + -23.934040935968877, + 6.304728323837963, + 4.771432556749889 + ], + [ + -23.74348634732709, + 4.573165331419801, + 4.822997090625307 + ], + [ + -21.633329138844747, + 4.163770768736498, + 3.6774825623942906 + ], + [ + -20.643599231064577, + 4.495700778036223, + 1.333542204057082 + ], + [ + -25.34589288674346, + 6.912316365670051, + 1.8252632716853687 + ], + [ + -21.488840750913155, + 5.9887253323528, + -1.1318099771365573 + ], + [ + -25.425788328389984, + 7.707017305859836, + -0.45439689154236856 + ], + [ + -23.3916521567575, + 7.232262379917529, + -2.0554228352855306 + ], + [ + -25.378059584549845, + 2.7624888106891063, + 3.514333586399276 + ], + [ + -25.80723707577622, + 1.6011388511435598, + 2.727858078191363 + ], + [ + -27.32283447505898, + 1.2863871762149444, + 2.5891571422922954 + ], + [ + -27.683972239991856, + 0.793842794202618, + 1.5273535204267754 + ], + [ + -25.100179324926504, + 0.38854349812121214, + 3.2369677437549367 + ], + [ + -25.354454305722538, + -0.09060024917984277, + 4.540403530355753 + ], + [ + -25.032325478931543, + 2.7034566399393753, + 4.4614781584356 + ], + [ + -25.49314395086692, + 1.7826780932658295, + 1.7000013101592648 + ], + [ + -25.359168423018403, + -0.44954132659598045, + 2.5899438637200816 + ], + [ + -24.041872655600297, + 0.596350095252312, + 3.079168534048663 + ], + [ + -24.903902348769545, + 0.6001811180608669, + 5.031753131264758 + ], + [ + -28.257961535085887, + 1.7032523699602393, + 3.448446566274692 + ], + [ + -29.675642109616998, + 1.558980429524837, + 3.2196049729325784 + ], + [ + -30.217281762349113, + 2.5057246240147037, + 2.12861379589907 + ], + [ + -30.8441286884746, + 2.04763817899547, + 1.1956747163042718 + ], + [ + -30.495347545983343, + 1.8066047175337445, + 4.510295977255148 + ], + [ + -28.007181551052188, + 1.8355660714303212, + 4.4178291736968145 + ], + [ + -29.869059316320083, + 0.5086775460832413, + 3.0015307758687646 + ], + [ + -30.229632097143334, + 1.1926930685563448, + 5.37088100302493 + ], + [ + -30.32660934978503, + 2.8079471333844452, + 4.906450689380782 + ], + [ + -31.501804868172922, + 1.5631724277941146, + 4.169875489509896 + ], + [ + -29.79841919903063, + 3.737768993397509, + 2.191577600179182 + ], + [ + -29.989373340538716, + 4.717989076505432, + 1.112349816130911 + ], + [ + -29.3250785593051, + 4.305973246611671, + -0.21136616057785398 + ], + [ + -29.841886156114054, + 4.3761979981062495, + -1.2836848934579295 + ], + [ + -29.38998715137752, + 6.041993212799468, + 1.4917429412729533 + ], + [ + -29.507631682393814, + 7.2576891011270845, + 0.5805297085065274 + ], + [ + -30.623513437395147, + 8.176476624232407, + 0.7442036983272848 + ], + [ + -28.43545107274745, + 7.5339918163201105, + -0.2988477190821733 + ], + [ + -30.50207279551272, + 9.348256823374129, + 0.013565556257376304 + ], + [ + -28.357730220246825, + 8.739601464909526, + -1.0134534557535881 + ], + [ + -29.478700751192253, + 9.626033879421868, + -0.922724312228632 + ], + [ + -29.311032888387125, + 4.065167492373007, + 3.013384444782054 + ], + [ + -31.051089207894552, + 4.890397590690128, + 0.935897342488691 + ], + [ + -29.798481840650357, + 6.421566909745934, + 2.4283083119611666 + ], + [ + -28.325008846461234, + 5.871134356511561, + 1.6489911299506488 + ], + [ + -31.44132382441649, + 8.083202126156664, + 1.4434090104514419 + ], + [ + -27.60182795067441, + 6.850379220509922, + -0.3632172112586591 + ], + [ + -31.354989566561425, + 10.010739281566714, + 0.007273221142814631 + ], + [ + -27.44352963340271, + 8.889615061510995, + -1.5685476145572617 + ], + [ + -29.520940797835507, + 10.474833528983595, + -1.5891741211122699 + ], + [ + -28.114199015601002, + 3.728051533994858, + -0.18503710155465594 + ], + [ + -27.297990153442274, + 3.351753152769305, + -1.33790913261002 + ], + [ + -27.841462225683813, + 2.1116840062118314, + -2.093450693933011 + ], + [ + -27.70694051462154, + 1.9725570392620142, + -3.327357501369971 + ], + [ + -25.84207504251438, + 3.2894359102051283, + -1.048470581317395 + ], + [ + -24.84384869945321, + 2.9783687215602015, + -2.2065074015357986 + ], + [ + -25.03479971675085, + 3.9286473536152187, + -3.3544749607733375 + ], + [ + -23.38329281712439, + 3.0110325129525677, + -1.708036062850981 + ], + [ + -27.676489154110133, + 3.815143400476842, + 0.7210127941136478 + ], + [ + -27.439885959029954, + 4.13711516998552, + -2.080319878612885 + ], + [ + -25.587350531737535, + 4.1766597390248705, + -0.46877399252026325 + ], + [ + -25.687196603196487, + 2.43858962734204, + -0.3850147028610624 + ], + [ + -25.005924649693863, + 1.9133713076000731, + -2.3726727427097485 + ], + [ + -26.061891581700884, + 3.879847373762942, + -3.7161368132081547 + ], + [ + -24.926374471110705, + 4.927995233704024, + -2.932992256381156 + ], + [ + -24.352068268719723, + 3.6294490381188496, + -4.149749185783888 + ], + [ + -22.681144411163828, + 2.8398347299753226, + -2.5239891150361196 + ], + [ + -23.209187979718948, + 3.8895043453856886, + -1.086686219051708 + ], + [ + -23.30243736649568, + 2.092109185025265, + -1.1273958756990088 + ], + [ + -28.37803793409521, + 1.1837625356580688, + -1.2730227735204538 + ], + [ + -29.22090813812458, + 0.09596127135671706, + -1.8403257719826387 + ], + [ + -30.313740502204574, + 0.5566709409026735, + -2.786470719576748 + ], + [ + -30.23267904455656, + 0.18976438506787296, + -4.002142595419586 + ], + [ + -29.58671005978066, + -0.87968363681086, + -0.5932230574974172 + ], + [ + -30.555866255956204, + -2.0270290167725307, + -1.0205030324763509 + ], + [ + -31.09827065576114, + -2.8109311321524615, + 0.22855487566178898 + ], + [ + -31.589484395350514, + -4.220068501590788, + -0.1792467875389728 + ], + [ + -32.55538756899622, + -4.714444492603008, + 0.8335115288927903 + ], + [ + -28.354548395427216, + 1.3507822715797886, + -0.2772052417649398 + ], + [ + -28.48231093357246, + -0.514349592521949, + -2.3600360020452924 + ], + [ + -28.649154124031696, + -1.2790128377961238, + -0.20641311877249297 + ], + [ + -30.09969018264391, + -0.32376086633100165, + 0.1915709458811029 + ], + [ + -31.31298597636882, + -1.5899361240614382, + -1.6715172862929653 + ], + [ + -29.942665290287916, + -2.6641959732218368, + -1.6577680366180751 + ], + [ + -30.261544366511668, + -2.8183055681322173, + 0.9270809656479742 + ], + [ + -31.893815346486708, + -2.2338681508884264, + 0.6999405198623623 + ], + [ + -31.987879557783046, + -4.089705628583573, + -1.1854202750448872 + ], + [ + -30.790911400751934, + -4.961908975799844, + -0.18662679916701408 + ], + [ + -33.37272971529356, + -4.122063078639002, + 0.8673860613259506 + ], + [ + -32.83003479767171, + -5.675621461621915, + 0.6892646668568926 + ], + [ + -32.1746251905584, + -4.701931327037528, + 1.7689046864882139 + ], + [ + -31.229093164772852, + 1.415953951989863, + -2.2596483004851993 + ], + [ + -32.34911459902282, + 1.9856019119250448, + -3.0911012014438497 + ], + [ + -31.944706625498274, + 2.709226588776687, + -4.3191922559130695 + ], + [ + -32.41503461083517, + 2.5025472594728626, + -5.425893818184093 + ], + [ + -33.074412326811576, + 2.992491642558633, + -2.1544727224034332 + ], + [ + -34.43231072363126, + 3.3980247434215585, + -2.7107276706291197 + ], + [ + -35.24176059714419, + 4.210810749315414, + -1.7763887394560869 + ], + [ + -35.24836049516435, + 5.480606517746196, + -1.9109885439788783 + ], + [ + -35.97007713326704, + 3.664693511372576, + -0.9525536092459865 + ], + [ + -31.056521167248402, + 1.7972607213915381, + -1.3404501676138807 + ], + [ + -33.00271348742601, + 1.1741628323043614, + -3.41121124914571 + ], + [ + -33.34680554145105, + 2.479192732529725, + -1.2322863370893757 + ], + [ + -32.55748304939534, + 3.921500039492912, + -1.913985470261631 + ], + [ + -34.21513543768699, + 3.91494160317626, + -3.64546253631174 + ], + [ + -34.88309524361927, + 2.412734418504513, + -2.82947233931875 + ], + [ + -30.91677969418024, + 3.4896816811895235, + -4.199415603923576 + ], + [ + -30.327137068373176, + 4.252356488260261, + -5.2474776693532394 + ], + [ + -29.51367548816069, + 3.4258116587786276, + -6.292267091084618 + ], + [ + -29.811500153337537, + 3.5271380559690613, + -7.482544054488293 + ], + [ + -29.52315700115681, + 5.42662175954672, + -4.623222403801153 + ], + [ + -30.441363151402285, + 6.622876485169172, + -4.346397944879873 + ], + [ + -31.731309135140652, + 6.354318547266416, + -3.6281960269332685 + ], + [ + -31.783945215782598, + 6.418061740461383, + -2.2777290727819755 + ], + [ + -32.695176808114255, + 6.0014383027138365, + -4.278524286245512 + ], + [ + -30.456317053859593, + 3.4743103704626037, + -3.3006183359230157 + ], + [ + -31.17148406765138, + 4.660380514924043, + -5.8030817135753265 + ], + [ + -29.118886316156154, + 5.126733883359435, + -3.6564075880140874 + ], + [ + -28.640996991409637, + 5.642325475368608, + -5.226020251697664 + ], + [ + -29.862079160318505, + 7.449839655941503, + -3.93570861493188 + ], + [ + -30.693972636762823, + 7.002729596634424, + -5.3363464197772 + ], + [ + -30.959450741811914, + 6.615339317549285, + -1.728741831906661 + ], + [ + -32.69892628633391, + 6.218040749871989, + -1.8997061557252355 + ], + [ + -28.721418177985672, + 2.415275100382388, + -5.9554356108526 + ], + [ + -28.226754503266527, + 1.4341939444592384, + -6.772756227758627 + ], + [ + -29.339486083514295, + 0.6671913342972431, + -7.4730360515948755 + ], + [ + -29.14138271383163, + 0.1792555479431721, + -8.598232062178568 + ], + [ + -27.23973435682338, + 0.5581074281144787, + -5.976832658776342 + ], + [ + -26.440508860626114, + -0.3700057252869744, + -6.744148238785016 + ], + [ + -28.628302884974993, + 2.224787764393483, + -4.967942550881397 + ], + [ + -27.707873977660356, + 1.9726838684779437, + -7.565779946567342 + ], + [ + -26.579385796186582, + 1.1512131832428452, + -5.344169169892116 + ], + [ + -27.766145017531073, + -0.08808112217111752, + -5.274386458510288 + ], + [ + -26.017100693411262, + 0.26867837687742124, + -7.3224301928005975 + ], + [ + -30.465101981723347, + 0.3054689714440304, + -6.8188118664425215 + ], + [ + -31.55565835052299, + -0.47598780348207725, + -7.42894304490851 + ], + [ + -32.30615644397497, + 0.34313029735846357, + -8.463232572107255 + ], + [ + -32.83854251767408, + -0.2921401232884868, + -9.39784286690832 + ], + [ + -32.47756074793382, + -1.1546520110913718, + -6.349268493874285 + ], + [ + -33.49232552169279, + -2.1556664270774917, + -6.899053544629299 + ], + [ + -31.781084887556663, + -1.8217635405435146, + -5.3669887055832195 + ], + [ + -30.587607320996195, + 0.6233207670439391, + -5.867988852907225 + ], + [ + -31.09254823383793, + -1.3234787706572817, + -7.934299307268475 + ], + [ + -33.148021401232896, + -0.46511088114349164, + -5.83631690160919 + ], + [ + -31.31990737623277, + -1.1016064720163214, + -4.930766888540532 + ], + [ + -34.11893212741711, + -1.6899723754430624, + -7.6597096137924705 + ], + [ + -32.952602764744384, + -2.857021844830612, + -7.5353631285137315 + ], + [ + -34.011540097285966, + -2.676348748692206, + -6.094434514298487 + ], + [ + -32.359732327084814, + 1.672323211998048, + -8.379103882112119 + ], + [ + -32.836223125108205, + 2.5719466454545454, + -9.39623206603874 + ], + [ + -31.823059861295857, + 2.905819873464182, + -10.469172950234306 + ], + [ + -32.160489578166, + 2.9392508840519866, + -11.688063360540177 + ], + [ + -33.36313968357698, + 3.8049139412855766, + -8.695073361993707 + ], + [ + -34.50806485269044, + 3.583378422993377, + -7.735391357017911 + ], + [ + -34.77411752130849, + 4.848772242022051, + -6.882399752869498 + ], + [ + -35.75681044509367, + 3.0750607792005695, + -8.51858159101 + ], + [ + -31.887712269522765, + 2.205332357791761, + -7.66273114863668 + ], + [ + -33.68577747504196, + 2.1610254492551917, + -9.941674127211957 + ], + [ + -32.541885820103914, + 4.352793129720482, + -8.23304278332764 + ], + [ + -33.710834417135544, + 4.438582752837675, + -9.510962208375137 + ], + [ + -34.26258899131923, + 2.7849436306866266, + -7.035145768294505 + ], + [ + -33.83848475945948, + 5.14804158187934, + -6.41004370918438 + ], + [ + -35.011978944819326, + 5.620984996374432, + -7.613982693695154 + ], + [ + -35.6480605538365, + 4.566816455992239, + -6.295172627714928 + ], + [ + -35.9284646679401, + 3.734863238499628, + -9.369050724634738 + ], + [ + -35.774848992880855, + 2.0298440400005546, + -8.827282295131186 + ], + [ + -36.56907002093621, + 3.1910338044902886, + -7.801029466581413 + ], + [ + -30.545323816499423, + 3.0785269241109887, + -10.136534711944961 + ], + [ + -29.433238438487802, + 3.297176785057985, + -11.001787876296575 + ], + [ + -29.265595879466076, + 2.083238554541282, + -11.9265812048458 + ], + [ + -28.682065986929295, + 2.2539262889486196, + -12.97977807128 + ], + [ + -28.18177362060562, + 3.7115922237171333, + -10.218913735749222 + ], + [ + -30.31355024954207, + 3.0240674344001945, + -9.154997563960722 + ], + [ + -29.669835479858598, + 4.169814083314606, + -11.610576725922915 + ], + [ + -27.597191553382277, + 2.8549672115325535, + -9.88341103310632 + ], + [ + -27.45803697934762, + 4.1824318342027595, + -10.884209903533323 + ], + [ + -28.3081283505973, + 4.379843655137677, + -9.367108452578895 + ], + [ + -29.671489867069724, + 0.9081065519053482, + -11.434130217100678 + ], + [ + -29.825392536533194, + -0.3669488485002663, + -12.179097651947203 + ], + [ + -30.83418821926385, + -0.3449025161389745, + -13.342997225844492 + ], + [ + -30.794430119924932, + -1.231987588918443, + -14.124166817509849 + ], + [ + -30.16072108595005, + -1.593817878556365, + -11.249670455192659 + ], + [ + -29.90109962537133, + -2.976005015219016, + -11.855447326752367 + ], + [ + -31.230038732148948, + -3.6630330242532523, + -12.358437860233542 + ], + [ + -31.21143181413561, + -4.940248887181525, + -12.718468095599071 + ], + [ + -32.372812936672844, + -3.1042474988577595, + -12.398089720774802 + ], + [ + -29.825005503148166, + 0.804028887558129, + -10.441304859644562 + ], + [ + -28.91006178124892, + -0.5158215919142144, + -12.751904473349455 + ], + [ + -29.561253645697693, + -1.3346508636057095, + -10.37699104814408 + ], + [ + -31.18047793569611, + -1.5610538920834145, + -10.866106863092094 + ], + [ + -29.281829640254603, + -2.9347876663824906, + -12.751496936896658 + ], + [ + -29.446400051192924, + -3.6990728142517924, + -11.178303399467577 + ], + [ + -30.3178204404633, + -5.407740206366611, + -12.663571746646165 + ], + [ + -32.09873990799989, + -5.305869419157034, + -13.033273764518611 + ], + [ + -31.712879832136565, + 0.6248360834914912, + -13.449699234551426 + ], + [ + -32.761939316558625, + 0.8248581960316415, + -14.49922383729929 + ], + [ + -32.3478002546924, + 1.940439784229369, + -15.508765731265115 + ], + [ + -33.11249071540436, + 2.532738271398344, + -16.289980620706814 + ], + [ + -34.170085502825174, + 1.3007810239307886, + -14.10988229875877 + ], + [ + -34.71070414807619, + 0.527559635848494, + -12.918138733356223 + ], + [ + -36.40890445820467, + 0.9996706116628786, + -12.37059471070105 + ], + [ + -36.61184984895149, + -0.14526235466064286, + -10.959321088105094 + ], + [ + -31.689246724198558, + 1.3273249154108129, + -12.724404736470467 + ], + [ + -32.82932341685742, + -0.06261944975647982, + -15.12846216991783 + ], + [ + -34.20417727599186, + 2.3594173673464383, + -13.85253532784097 + ], + [ + -34.89065963170167, + 1.1332368979816678, + -14.910384563586161 + ], + [ + -34.64090975559534, + -0.529859878801247, + -13.173273804362012 + ], + [ + -34.0218209196269, + 0.5187009565790888, + -12.073476477664805 + ], + [ + -35.71025881054022, + -0.09242689476715116, + -10.349039235445968 + ], + [ + -37.37629053975342, + 0.26271867202089183, + -10.298052272366673 + ], + [ + -36.85710079117135, + -1.1847111206322865, + -11.177256551727591 + ], + [ + -31.018714388205485, + 2.2557678491639166, + -15.530695940432041 + ], + [ + -30.509677408573523, + 3.295504980870163, + -16.51571023560117 + ], + [ + -29.376437635448923, + 2.6878615244268076, + -17.338183284860396 + ], + [ + -28.579257027361965, + 1.904199799191531, + -16.867830308911124 + ], + [ + -30.119018548812235, + 4.63198130713684, + -15.78989909856238 + ], + [ + -31.25698184308454, + 5.38403602103125, + -15.116511652393704 + ], + [ + -31.183425596630656, + 5.594112812347021, + -13.7300412128243 + ], + [ + -32.362183372261555, + 5.837753297122646, + -15.834608498172248 + ], + [ + -32.17506309181355, + 6.268768924050136, + -13.07456205495778 + ], + [ + -33.382065152802056, + 6.56983767779866, + -15.134241164992133 + ], + [ + -33.334989284475256, + 6.764231353638195, + -13.770706128744662 + ], + [ + -34.33358872097117, + 7.345743698918909, + -12.98563872732169 + ], + [ + -30.39809880429437, + 1.7887020907787416, + -14.885106360025665 + ], + [ + -31.309080796769457, + 3.4401874577214357, + -17.24242834597151 + ], + [ + -29.431627592759575, + 4.362583174459019, + -14.988013789365908 + ], + [ + -29.46817632722343, + 5.24507959059639, + -16.413293237897815 + ], + [ + -30.280008189334957, + 5.2737586031461205, + -13.232436760826626 + ], + [ + -32.43233045133767, + 5.65345756833355, + -16.89645234133671 + ], + [ + -32.1250276116387, + 6.419269154597032, + -12.006270602342852 + ], + [ + -34.31329288064674, + 6.765253792240458, + -15.645151360917065 + ], + [ + -35.1018787654054, + 7.612898320327872, + -13.495492153453148 + ], + [ + -29.195885941748774, + 3.17310288506404, + -18.574441145020987 + ], + [ + -28.173375494116492, + 2.6363850578746764, + -19.52528252978566 + ], + [ + -26.86927150635537, + 3.420353319568761, + -19.486497076095716 + ], + [ + -26.86202241829817, + 4.475767908216994, + -18.87653991096057 + ], + [ + -28.815520019347204, + 2.766995930779501, + -20.83964059892186 + ], + [ + -29.522491929820863, + 4.155053504042854, + -20.73331794088249 + ], + [ + -30.007945778962895, + 4.165486280223348, + -19.29127051548719 + ], + [ + -27.86613808060665, + 1.6172541615633094, + -19.290600839461703 + ], + [ + -28.048032333541546, + 2.731588335641902, + -21.612818067803026 + ], + [ + -29.51369410996027, + 1.970142015868845, + -21.095912037523096 + ], + [ + -28.698440811147417, + 4.861048529636548, + -20.8363267457222 + ], + [ + -30.276218069422583, + 4.310862220202949, + -21.50514354730768 + ], + [ + -29.809392960874103, + 5.166120013439809, + -18.907331604468414 + ], + [ + -31.060988835614214, + 3.8902348816694428, + -19.23266053040398 + ], + [ + -25.830987418354944, + 3.038024892052306, + -20.289954334026007 + ], + [ + -24.66280064441427, + 3.843755291103065, + -20.414762173658165 + ], + [ + -24.225452934881467, + 4.007221760199116, + -21.885831251106666 + ], + [ + -23.341808483586213, + 4.8274973239764165, + -22.11420508495875 + ], + [ + -23.53715345365915, + 3.237944029025215, + -19.501783841608905 + ], + [ + -23.77316503170797, + 2.816373276247063, + -18.018220718056835 + ], + [ + -22.565179532757476, + 2.2009401644831854, + -17.369406182561587 + ], + [ + -24.07433962563445, + 3.930630182064874, + -17.050199299599846 + ], + [ + -25.916711421567534, + 2.257128238846164, + -20.92473881455335 + ], + [ + -24.945446458217095, + 4.861510187982532, + -20.14571724369888 + ], + [ + -23.101816201333726, + 2.3610119032734787, + -19.980923526925974 + ], + [ + -22.679227614561093, + 3.9081377035463163, + -19.555670325181794 + ], + [ + -24.62424599542683, + 2.1441077977032847, + -18.12693631390161 + ], + [ + -22.905189508063636, + 1.794867551647883, + -16.416727518885136 + ], + [ + -22.30887830591794, + 1.3484103701200354, + -17.998376043162448 + ], + [ + -21.687082773313183, + 2.8466987271414297, + -17.363099910311657 + ], + [ + -24.761557345347278, + 4.622309116008182, + -17.537449830334282 + ], + [ + -24.473398157400094, + 3.4645905695975046, + -16.149277877645073 + ], + [ + -23.228647139469654, + 4.4965866313290235, + -16.65956381526701 + ], + [ + -24.82936755722878, + 3.276768208118085, + -22.82611880456928 + ], + [ + -24.687220505314865, + 3.4271033655624024, + -24.289990212975223 + ], + [ + -25.606909571668783, + 4.489465853781127, + -24.906363037904658 + ], + [ + -26.765007842030993, + 4.711872396103956, + -24.50870462459748 + ], + [ + -24.86824198662393, + 2.069577682132575, + -25.027505548547175 + ], + [ + -23.659700760643414, + 1.189999703814678, + -24.870889822709465 + ], + [ + -23.44804812629368, + 0.6759920135905944, + -23.460338196736227 + ], + [ + -22.54286531922686, + 1.1889671188751407, + -22.669470292563354 + ], + [ + -24.152350592354466, + -0.28332995619417467, + -23.05327331646928 + ], + [ + -25.496526644953935, + 2.5951144407674605, + -22.493935468122952 + ], + [ + -23.70570289119575, + 3.8168983265815655, + -24.55977201519274 + ], + [ + -25.670890590005108, + 1.5285777103696887, + -24.526327940634715 + ], + [ + -25.198105664419387, + 2.190190705506609, + -26.059364625578855 + ], + [ + -23.639531341217648, + 0.37011872524032086, + -25.588866466936455 + ], + [ + -22.78675989986607, + 1.81399086082574, + -25.062477711481872 + ], + [ + -21.936574895685776, + 1.9552282659286249, + -22.925112783599463 + ], + [ + -22.560387230090186, + 0.750252714638389, + -21.759896404247915 + ], + [ + -25.07059297246053, + 5.249951003219309, + -25.872904744320522 + ], + [ + -25.663966468103922, + 6.337252017727195, + -26.648673421234086 + ], + [ + -26.0098505246534, + 7.685518778150424, + -25.88457778051674 + ], + [ + -25.98527774283876, + 8.825800843955108, + -26.403928251159744 + ], + [ + -26.88905860847205, + 5.850310950474636, + -27.351274422174157 + ], + [ + -26.675523380460255, + 4.570004747358837, + -28.185521835991956 + ], + [ + -25.620889689358034, + 4.83252366336464, + -29.209449665946217 + ], + [ + -25.896091199224024, + 5.660506541033044, + -30.075959381139448 + ], + [ + -24.541466084639374, + 4.165311841270977, + -29.27948750870705 + ], + [ + -24.08460468192368, + 5.055396546958349, + -25.973266103333337 + ], + [ + -25.001068807330334, + 6.559241779734293, + -27.484965797566108 + ], + [ + -27.66849398014146, + 5.666897172540928, + -26.61171878298307 + ], + [ + -27.268491099422043, + 6.67467665890473, + -27.955053314295856 + ], + [ + -26.437768096583035, + 3.7095243221318697, + -27.560107823079854 + ], + [ + -27.63932862319633, + 4.333168552456897, + -28.636172134038603 + ], + [ + -26.113878571713038, + 7.585489941399885, + -24.548976371798496 + ], + [ + -26.045659368368934, + 8.718817083246734, + -23.7013966766934 + ], + [ + -24.714709729225582, + 9.450741073745064, + -23.793166485073677 + ], + [ + -23.752840039050334, + 8.94058791851495, + -24.347660714912877 + ], + [ + -26.494594178184787, + 8.33171168209276, + -22.295279757268425 + ], + [ + -25.450398654856176, + 7.642955673771951, + -21.37078922766418 + ], + [ + -27.780828123943312, + 7.539796301728529, + -22.26423499632001 + ], + [ + -25.53611494564525, + 8.086613636943298, + -19.950651683291603 + ], + [ + -26.122086108883217, + 6.668943978344714, + -24.124742360185433 + ], + [ + -26.722006463861298, + 9.48252174355082, + -24.085330961023917 + ], + [ + -26.72310225433103, + 9.297670307674082, + -21.844941633968123 + ], + [ + -25.69910403307459, + 6.582319233621092, + -21.406769643380887 + ], + [ + -24.46517995028498, + 7.78361278643149, + -21.815376800640948 + ], + [ + -28.404425172746194, + 8.042731508719157, + -23.00334414930926 + ], + [ + -27.57350871780488, + 6.5185912599320375, + -22.584011609207682 + ], + [ + -28.26265426765805, + 7.555421661131049, + -21.286636940531746 + ], + [ + -25.040589636287976, + 7.417365132763678, + -19.247329429488538 + ], + [ + -25.059666435235982, + 9.058433723519272, + -19.82157004379298 + ], + [ + -26.590085245695278, + 8.132819276403268, + -19.676591264585422 + ], + [ + -24.666892481273795, + 10.750907561344206, + -23.470122774929827 + ], + [ + -23.56032988772015, + 11.698462292084798, + -23.673307171074693 + ], + [ + -22.757951300596382, + 11.81015785572589, + -22.359973119111324 + ], + [ + -23.2733415264925, + 11.805620881989284, + -21.246947994936257 + ], + [ + -24.115117667048114, + 13.101685907867136, + -24.058538658869153 + ], + [ + -25.051947710185704, + 12.981099811311253, + -25.258269629518175 + ], + [ + -25.628365918164217, + 14.365204605718759, + -25.51464107117204 + ], + [ + -26.53673474776833, + 14.81428461543203, + -24.692622268526108 + ], + [ + -25.19783346391574, + 15.039756522342941, + -26.458213022593476 + ], + [ + -25.481131394797767, + 11.150669347516725, + -23.025931720690465 + ], + [ + -22.846719233025183, + 11.400581439459131, + -24.44150667696345 + ], + [ + -24.725550996861692, + 13.378031549871707, + -23.198826999209157 + ], + [ + -23.347431795752595, + 13.838892237647997, + -24.293671505621152 + ], + [ + -24.488167237155544, + 12.678209009534498, + -26.140601374200557 + ], + [ + -25.824385187634608, + 12.22215846611374, + -25.133986296818314 + ], + [ + -26.810270592123597, + 14.248549824612951, + -23.901913485124357 + ], + [ + -26.99629208661772, + 15.677475673686217, + -24.945241108701712 + ], + [ + -21.468089614783246, + 12.148613130624256, + -22.516261125761755 + ], + [ + -20.548522422469, + 12.649106972769175, + -21.57621708813948 + ], + [ + -20.177374015631546, + 11.691913221617938, + -20.40336135162982 + ], + [ + -20.9772409577877, + 11.10009219766647, + -19.61730737142763 + ], + [ + -21.025133450149426, + 14.006818802463613, + -20.941043925478727 + ], + [ + -19.919395031301587, + 14.688460667380127, + -20.11935458675549 + ], + [ + -19.13047366944014, + 15.596027121947486, + -20.698527885206563 + ], + [ + -19.844079536278745, + 14.504048645956118, + -18.903484644950485 + ], + [ + -18.445300955582923, + 16.60838338690951, + -19.914039697928512 + ], + [ + -19.318702445064567, + 17.853179751027483, + -19.692165854546776 + ], + [ + -20.625126074155375, + 17.50010126265431, + -19.132880939745124 + ], + [ + -19.369145421900573, + 18.79138814416342, + -20.988504089849013 + ], + [ + -20.092632438124813, + 20.055175329709073, + -20.628357530450298 + ], + [ + -17.89696029565551, + 19.083332608996102, + -21.454372462426495 + ], + [ + -17.85041520126312, + 19.839943418570442, + -22.589246565571003 + ], + [ + -17.167942731631037, + 17.640756033851403, + -21.66881448904203 + ], + [ + -17.198128812123077, + 16.933628130676652, + -20.44667408334121 + ], + [ + -15.62158318072449, + 17.71731717297382, + -22.03244367814569 + ], + [ + -14.76623919919454, + 18.453413649554363, + -21.13579006912472 + ], + [ + -20.921536484155308, + 17.444358846643922, + -17.791675624428024 + ], + [ + -20.131011958783922, + 17.792696654047518, + -16.929995639721486 + ], + [ + -22.3288771326812, + 16.931399058426223, + -17.494376931525412 + ], + [ + -21.079040010739693, + 12.035095909198674, + -23.44138699975753 + ], + [ + -21.417469140283693, + 17.216962257600812, + -19.69696573301508 + ], + [ + -19.66352768778956, + 12.939047145746429, + -22.142623149551667 + ], + [ + -21.393923200151807, + 14.650592975697236, + -21.739571607815865 + ], + [ + -21.80907536406347, + 13.923008495602403, + -20.188371417811155 + ], + [ + -19.25308359033529, + 15.864866035343994, + -21.664340566020503 + ], + [ + -20.208261702026608, + 20.6293393853407, + -21.40533283946496 + ], + [ + -17.65159701219081, + 20.771178936536444, + -22.38925606338965 + ], + [ + -14.98490688741113, + 19.39621287006321, + -21.23601093744879 + ], + [ + -18.170214988308615, + 16.183646781779885, + -18.941851995206775 + ], + [ + -18.8036978215313, + 18.40801581463893, + -18.898229058366724 + ], + [ + -19.810681209297982, + 18.389938163565944, + -21.90898913638101 + ], + [ + -17.332488375260883, + 19.635368283519824, + -20.692769703717264 + ], + [ + -17.74285445885206, + 17.171617495834198, + -22.476767280562733 + ], + [ + -15.622861654670206, + 18.18685532058214, + -23.02387665514129 + ], + [ + -15.271336224775213, + 16.708505882157965, + -22.283506179850747 + ], + [ + -22.499054631828717, + 17.043083695242558, + -16.41642693499027 + ], + [ + -23.041343623342478, + 17.63479935338387, + -17.942735770408426 + ], + [ + -22.42399350727833, + 15.952065218854841, + -17.979421757473176 + ], + [ + -18.831523244002053, + 11.556693765249975, + -20.326862704424386 + ], + [ + -18.225825867110615, + 10.68268202853642, + -19.307903503630804 + ], + [ + -18.610055196448645, + 11.007957211315386, + -17.834183914376702 + ], + [ + -18.699082209334705, + 10.050193704301819, + -17.106201339909052 + ], + [ + -16.729879554690047, + 10.640128290007738, + -19.503069145120477 + ], + [ + -16.348434976237897, + 9.937992384771974, + -20.813659029032458 + ], + [ + -14.859644194282456, + 10.176562432616606, + -21.07517236242221 + ], + [ + -16.51606483966318, + 8.399579751633496, + -20.682668179271968 + ], + [ + -18.28133891001012, + 11.87753655961501, + -21.110735979841262 + ], + [ + -18.604210806571093, + 9.688615707242661, + -19.54613007699132 + ], + [ + -16.357836858814203, + 11.664667964573823, + -19.501636231148897 + ], + [ + -16.263118337775712, + 10.060386870825141, + -18.706742444565823 + ], + [ + -16.874653715580326, + 10.332302465878229, + -21.682973786309557 + ], + [ + -14.668549606651318, + 9.747666609691976, + -22.058856628827222 + ], + [ + -14.628543492022418, + 11.241170773566637, + -21.111212209057992 + ], + [ + -14.30197648106505, + 9.633250266686389, + -20.31233794628877 + ], + [ + -16.084770538688304, + 7.869550702170386, + -21.53187601947128 + ], + [ + -16.053385593351116, + 8.098893046507726, + -19.742661550056937 + ], + [ + -17.559345556149943, + 8.08814651435921, + -20.630901507281738 + ], + [ + -18.913168530202324, + 12.24036723908381, + -17.42006822353174 + ], + [ + -19.071591897145716, + 12.475028605615364, + -15.968703362664947 + ], + [ + -20.3863573538409, + 11.82247004576459, + -15.483202599067143 + ], + [ + -20.508839226990155, + 11.4581954644529, + -14.376466644477153 + ], + [ + -19.018333105089578, + 13.968904281531763, + -15.58330495526291 + ], + [ + -17.74142753071643, + 14.562043548841416, + -16.20019922133655 + ], + [ + -20.068752239735147, + 14.712368559948459, + -16.178237769390257 + ], + [ + -18.9563420327368, + 12.994620976460567, + -18.090394612007195 + ], + [ + -18.244136201466432, + 11.980903541328814, + -15.45953207525834 + ], + [ + -18.977114016746835, + 14.188653654219934, + -14.516481602244433 + ], + [ + -19.979250615389976, + 14.675804282361582, + -17.13335620663911 + ], + [ + -16.770231026776045, + 14.206231793304028, + -15.856288365833828 + ], + [ + -17.81484018529666, + 14.588041586888266, + -17.287416721611237 + ], + [ + -17.62553146321676, + 15.61866906381897, + -15.958930299029486 + ], + [ + -21.444618765064792, + 11.749391441789726, + -16.327832054556666 + ], + [ + -22.690865234036046, + 11.207794006858876, + -15.922449899872495 + ], + [ + -22.7635004053116, + 9.67385512797091, + -15.994610580342185 + ], + [ + -23.3610431396756, + 9.100028242931785, + -15.133039762899774 + ], + [ + -23.88595866033461, + 12.082656474928513, + -16.42301553286808 + ], + [ + -23.62086619346468, + 13.494747209001162, + -15.910057378937354 + ], + [ + -24.150636023734755, + 12.205323351113122, + -17.990409221004597 + ], + [ + -21.33010255045631, + 12.157282005093975, + -17.244680089102744 + ], + [ + -22.84476801466535, + 11.405174608294487, + -14.861573851964941 + ], + [ + -24.81015415639437, + 11.754001000862218, + -15.947678308499869 + ], + [ + -23.456611035660767, + 13.413862169224899, + -14.835544655476802 + ], + [ + -22.740548148526443, + 13.900521090252482, + -16.40855010739364 + ], + [ + -24.384236077052176, + 14.188984580912575, + -16.26133449917871 + ], + [ + -24.386013799936876, + 11.17432124019075, + -18.25446993467714 + ], + [ + -24.95564959725278, + 12.8969991631065, + -18.238679162329372 + ], + [ + -23.24404052234995, + 12.559692765782586, + -18.48092224434 + ], + [ + -22.03106905518296, + 9.107394483792973, + -16.93464063851742 + ], + [ + -21.714108299462005, + 7.70212911275604, + -17.195548190544 + ], + [ + -20.792347852462335, + 7.078628882371561, + -16.16266511782582 + ], + [ + -21.28148709510721, + 6.18320603254665, + -15.515183568528508 + ], + [ + -21.1037264963339, + 7.617995684077016, + -18.57277457177001 + ], + [ + -21.9446939665058, + 7.783543323045535, + -19.861743375932136 + ], + [ + -21.20063024769593, + 7.439076733555851, + -21.18980372314041 + ], + [ + -20.776600654140047, + 5.9809497258069655, + -21.201478209703954 + ], + [ + -20.517917415018374, + 5.598828907960893, + -22.63725361152927 + ], + [ + -21.54304901100764, + 9.730219592504966, + -17.562350866939862 + ], + [ + -22.697311760723945, + 7.235250086001088, + -17.1369272733125 + ], + [ + -20.22103734768387, + 8.252391519719197, + -18.65338026334138 + ], + [ + -20.665315675190094, + 6.6203750227873, + -18.598271512409166 + ], + [ + -22.791466638809144, + 7.104505164371119, + -19.76184559438337 + ], + [ + -22.286405513214763, + 8.817121823148113, + -19.916908261447833 + ], + [ + -21.796980453846416, + 7.6157338313523155, + -22.084933871813963 + ], + [ + -20.393649952341374, + 8.159621997044724, + -21.322831637427374 + ], + [ + -19.911360024271303, + 5.828824520321206, + -20.556247677998982 + ], + [ + -21.52892341605805, + 5.326273313172038, + -20.76158135420958 + ], + [ + -20.590633796933194, + 4.593925517970632, + -22.707831486505487 + ], + [ + -21.195911313657085, + 6.025543658615277, + -23.252349541716885 + ], + [ + -19.61245205759349, + 5.9278340404194125, + -22.940543296370073 + ], + [ + -19.645508950735135, + 7.6007515936354935, + -15.815493431673922 + ], + [ + -18.83616523083242, + 6.884823694093939, + -14.80816194920849 + ], + [ + -19.409690864565686, + 7.108173455539543, + -13.375385159589188 + ], + [ + -19.16450690513692, + 6.304757592118563, + -12.4585839527261 + ], + [ + -17.322937395337583, + 7.24978354341539, + -14.91501545060545 + ], + [ + -16.52496380952245, + 6.433726124238035, + -16.037387669355446 + ], + [ + -17.0751450610333, + 6.635663992084801, + -17.457072531412013 + ], + [ + -15.011821820995754, + 6.710538497757227, + -15.963289826969637 + ], + [ + -19.25477356330102, + 8.40874267467973, + -16.27871436599572 + ], + [ + -18.914850775059726, + 5.801046970813928, + -14.893829765465549 + ], + [ + -17.181174412332556, + 8.314944469503132, + -15.097863427870564 + ], + [ + -16.87394322341604, + 7.040090751941079, + -13.944171764330457 + ], + [ + -16.65811801579875, + 5.371278172639961, + -15.833488384203365 + ], + [ + -17.104002885481357, + 7.698803455592497, + -17.69581589268768 + ], + [ + -16.445652209116552, + 6.123854642416518, + -18.18500979699311 + ], + [ + -18.070385201975302, + 6.19160329737241, + -17.477282411373743 + ], + [ + -14.805799742037992, + 7.7686563048015955, + -16.1246541082885 + ], + [ + -14.611567530630335, + 6.490779368975524, + -14.97353960934459 + ], + [ + -14.391629250642158, + 6.102302261070804, + -16.621707506875243 + ], + [ + -20.403704184058927, + 8.053210333661127, + -13.217124149617803 + ], + [ + -21.316467126872364, + 8.087471392686723, + -12.08446428616808 + ], + [ + -22.305550721472628, + 6.834399519790281, + -12.11538085832282 + ], + [ + -22.2534000552709, + 6.124625373805628, + -11.13692894086119 + ], + [ + -22.028541858959947, + 9.402048801165392, + -11.958261828023327 + ], + [ + -21.132643766862024, + 10.390207612703023, + -11.231737332284666 + ], + [ + -21.92839924173779, + 11.663050014022303, + -11.03261782559186 + ], + [ + -22.115525861649672, + 12.497818059621068, + -12.048562800308384 + ], + [ + -22.446697583782196, + 11.92061244426958, + -9.930731049611207 + ], + [ + -20.409596915659684, + 8.730140395644924, + -13.966677820706057 + ], + [ + -20.822939899199365, + 7.864973143084683, + -11.138404981291284 + ], + [ + -22.413145819888914, + 9.695525362926503, + -12.935017713456233 + ], + [ + -22.83562365843883, + 9.221274631897984, + -11.24830461454344 + ], + [ + -20.786168172939927, + 9.997453823637159, + -10.275807188344942 + ], + [ + -20.297444127656377, + 10.601750159511198, + -11.899414760916278 + ], + [ + -21.751294187969325, + 12.24376860353317, + -12.955697650114057 + ], + [ + -22.696394364804778, + 13.293172267833825, + -11.824732267948942 + ], + [ + -23.18766702443846, + 6.625552776747156, + -13.085057678583947 + ], + [ + -24.237349244714487, + 5.59167066701383, + -13.083402173557772 + ], + [ + -23.678732391297718, + 4.1553473575800695, + -13.208742961492147 + ], + [ + -24.13259671609265, + 3.185956928537564, + -12.631903332557577 + ], + [ + -25.305380822117847, + 5.834782761763705, + -14.135556239688889 + ], + [ + -26.231757107205883, + 6.923408653773379, + -13.727091244689573 + ], + [ + -26.68395911284789, + 7.532672792474443, + -15.060276262107347 + ], + [ + -27.413112280019185, + 6.303981007073332, + -12.925564862749356 + ], + [ + -23.236692612329087, + 7.250151153019715, + -13.877252498626051 + ], + [ + -24.75334669405682, + 5.642561963075849, + -12.124621671023887 + ], + [ + -24.778533058550323, + 6.0853371949043265, + -15.056291113044736 + ], + [ + -25.906446652078458, + 4.931144890940232, + -14.236829107714074 + ], + [ + -25.831559093717416, + 7.786834638759842, + -13.195643324217777 + ], + [ + -27.12071985080293, + 6.773285008436858, + -15.708867551798534 + ], + [ + -27.444694072739278, + 8.254000884908407, + -14.761836578721582 + ], + [ + -25.82034038914289, + 8.08486924741959, + -15.430870512453248 + ], + [ + -27.954396024200918, + 7.167831577250354, + -12.539728548342007 + ], + [ + -28.036887190266707, + 5.6187851924046015, + -13.499596178292006 + ], + [ + -26.874023297609977, + 5.850358169967336, + -12.093870380593083 + ], + [ + -22.497288185668836, + 4.016574341703631, + -13.768878580687344 + ], + [ + -21.55344614357713, + 2.8204345428629978, + -13.69920913500838 + ], + [ + -21.13520629601664, + 2.552395434014329, + -12.244357059302146 + ], + [ + -21.185764629368876, + 1.4292061416404707, + -11.790057097998817 + ], + [ + -20.37207846135538, + 3.153645917487353, + -14.727140874378383 + ], + [ + -19.55008143719866, + 1.8922009748771131, + -15.254318003371033 + ], + [ + -18.887488174127984, + 2.214652939309488, + -16.564578578640894 + ], + [ + -18.890193276229837, + 1.3204163328972598, + -17.47066987265949 + ], + [ + -18.272091038751668, + 3.194327266545173, + -16.802226160003833 + ], + [ + -22.071469890291493, + 4.882866276726361, + -14.066057051058566 + ], + [ + -22.03180373057331, + 1.9043030186611105, + -14.045587857875484 + ], + [ + -20.92927631724165, + 3.6457436655377364, + -15.524301127780364 + ], + [ + -19.688042112270264, + 3.8348323679577447, + -14.220994801559945 + ], + [ + -18.887837783678854, + 1.5677295966443339, + -14.451666251960054 + ], + [ + -20.22958626318714, + 1.0418388869360697, + -15.311394986104135 + ], + [ + -19.15292714740047, + 0.40467380853476875, + -17.135277179130178 + ], + [ + -18.168660701572147, + 1.3932226443016162, + -18.173653422023058 + ], + [ + -20.62922726310885, + 3.549312485838442, + -11.475192954750646 + ], + [ + -20.369491940093663, + 3.3424692541632623, + -10.053837056083523 + ], + [ + -21.668491585536458, + 3.165380937032637, + -9.135022931881938 + ], + [ + -21.489581957668076, + 2.5932192220377317, + -8.060355651066004 + ], + [ + -19.49951073121489, + 4.540839100863678, + -9.61559030303984 + ], + [ + -20.540578006659977, + 4.513640282824781, + -11.762096296960024 + ], + [ + -19.79812820354865, + 2.4152764662354826, + -10.009576375876517 + ], + [ + -18.68126015536146, + 4.7150181509027504, + -10.314321765256787 + ], + [ + -20.183450414775326, + 5.381856119492227, + -9.729699140843335 + ], + [ + -19.0968322485403, + 4.345079571929517, + -8.62179716140972 + ], + [ + -22.884803314730952, + 3.645434982738351, + -9.487960900325392 + ], + [ + -24.14350169535547, + 3.29397756686663, + -8.802998771275568 + ], + [ + -24.655527915876952, + 1.9076214563154394, + -9.31109213705806 + ], + [ + -25.494692403998435, + 1.3318834501141268, + -8.608102316668932 + ], + [ + -25.10245709096464, + 4.409367545387369, + -8.826358768469062 + ], + [ + -24.642372311595935, + 5.784900245773002, + -8.309053306185392 + ], + [ + -25.539392899833288, + 6.8516248785322205, + -8.968220260969712 + ], + [ + -24.654188910062697, + 6.023046488914559, + -6.835284558690035 + ], + [ + -22.864980541648368, + 4.2812353056055485, + -10.272476507524877 + ], + [ + -23.854676037816503, + 3.01997085072567, + -7.788305727438268 + ], + [ + -25.33482851920361, + 4.568067187183175, + -9.879410428043297 + ], + [ + -26.063827209486316, + 4.129238100066942, + -8.395779379776702 + ], + [ + -23.638691961391725, + 5.995512061258125, + -8.678331645826704 + ], + [ + -25.476797793085233, + 6.7106930342787905, + -10.047255909612197 + ], + [ + -26.571122421830747, + 6.808461579279594, + -8.619254894645016 + ], + [ + -25.061542632497535, + 7.804799899635327, + -8.74191173402951 + ], + [ + -25.66720233560518, + 5.892182933187229, + -6.454785934076188 + ], + [ + -23.93203188565662, + 5.304277614936183, + -6.448035547987353 + ], + [ + -24.524062995312068, + 7.086726440003986, + -6.635908302944218 + ], + [ + -24.085584697590626, + 1.3915695718133776, + -10.401675884273606 + ], + [ + -24.28228148705306, + 0.0016186237600832182, + -10.862740209928289 + ], + [ + -23.45779784381053, + -1.0739418005112213, + -10.090265981294305 + ], + [ + -22.90609146279269, + -2.0304159422034616, + -10.683431767485404 + ], + [ + -24.223993119743188, + -0.013363241434026785, + -12.439015853717748 + ], + [ + -25.598937372392875, + 0.514147641385815, + -12.910445085454027 + ], + [ + -25.74317303524883, + 0.7140008271664406, + -14.431891484125922 + ], + [ + -26.717173080013264, + 1.4643453466449756, + -14.938277996988509 + ], + [ + -25.057447607233602, + 0.017431497376344196, + -15.204471067121142 + ], + [ + -23.595291875999287, + 2.0426530103219562, + -10.998167395212354 + ], + [ + -25.32127734018342, + -0.13864016227275222, + -10.56456818392474 + ], + [ + -23.437358565550284, + 0.6206114510893457, + -12.848142771291307 + ], + [ + -24.166756774897173, + -1.0172830921962088, + -12.859694663044259 + ], + [ + -26.360689981920746, + -0.16907823507184094, + -12.534896299293537 + ], + [ + -25.95025826800133, + 1.3757106515316764, + -12.34265763485899 + ], + [ + -27.368180839394345, + 1.8373135829039597, + -14.26212450789645 + ], + [ + -26.99738681646833, + 1.444298623214216, + -15.908422363814447 + ], + [ + -23.203329277004094, + -0.927452397576694, + -8.787182829498953 + ], + [ + -22.2971286110628, + -1.78136433771067, + -7.870721161377518 + ], + [ + -22.84463902012542, + -1.7686055137100283, + -6.42286066260059 + ], + [ + -23.452771526991768, + -0.7750002166161742, + -5.959602724370915 + ], + [ + -20.82205258298353, + -1.1741594176716248, + -7.86910096038294 + ], + [ + -20.158297930885443, + -1.1650041043783474, + -9.26726548571661 + ], + [ + -19.64116867534162, + -2.5318479303025185, + -9.763941145954233 + ], + [ + -20.47741879946244, + -3.422038001800047, + -10.303787091508934 + ], + [ + -18.449582810522536, + -2.734738383121851, + -9.679611077646829 + ], + [ + -23.646454227821096, + -0.12483013138904209, + -8.363463995760824 + ], + [ + -22.094142472917397, + -2.782841777895868, + -8.25011218934988 + ], + [ + -20.915437986311794, + -0.16711176027397023, + -7.462612192534965 + ], + [ + -20.194167532747016, + -1.719532753482568, + -7.164522913420684 + ], + [ + -20.947423874767924, + -0.8235215136566794, + -9.937167238352092 + ], + [ + -19.320513353756667, + -0.4684231236784271, + -9.298840954383678 + ], + [ + -21.38943093632305, + -3.083060190532052, + -10.57477310092207 + ], + [ + -20.23726585044429, + -4.38310726354635, + -10.500693905530325 + ], + [ + -22.54766969215708, + -2.890787684548471, + -5.729265595816192 + ], + [ + -23.21196599277956, + -3.02959640772724, + -4.3575724684965875 + ], + [ + -22.236617293731552, + -3.4079248368951482, + -3.2580431924509683 + ], + [ + -21.27789607658643, + -4.0965579184374405, + -3.5737308787990685 + ], + [ + -24.206876721056084, + -4.095499577410976, + -4.539309669236542 + ], + [ + -25.386992545813346, + -3.839851292714883, + -5.476926022207137 + ], + [ + -26.45485712514, + -3.249119243923573, + -4.9980430771130075 + ], + [ + -25.33176208399404, + -4.443808897021455, + -6.579647103923983 + ], + [ + -27.90257086008966, + -3.3657554884516685, + -5.37935992447205 + ], + [ + -28.243877993896582, + -3.926738281232673, + -6.839952842982002 + ], + [ + -27.52981317821546, + -3.1288437813857826, + -7.864627607972425 + ], + [ + -29.781990914517394, + -3.997261178945621, + -6.952659848084897 + ], + [ + -30.190238907265293, + -4.445265676907809, + -8.238237426230485 + ], + [ + -30.49863134237865, + -4.748963502741617, + -5.768734809286204 + ], + [ + -31.895894379362332, + -4.69457406178239, + -5.773167139001268 + ], + [ + -29.922169559865647, + -4.374548828055424, + -4.341193196327534 + ], + [ + -28.440632619228275, + -4.2597652656892535, + -4.361658038143568 + ], + [ + -30.363716222913776, + -5.453819406854393, + -3.2234735913159422 + ], + [ + -31.764507050020804, + -5.57556999073438, + -3.181552176217676 + ], + [ + -27.29650981979716, + -3.6600710742566207, + -9.1380561423685 + ], + [ + -27.728350342067465, + -4.718727417664013, + -9.533726548005315 + ], + [ + -26.69348965930068, + -2.6223807709736064, + -10.075913387854982 + ], + [ + -21.925321406332426, + -3.618815286411575, + -6.049821166168222 + ], + [ + -27.15991525486318, + -2.1980648485971273, + -7.712985971336554 + ], + [ + -23.694855230210038, + -2.08991386885846, + -4.089402452839777 + ], + [ + -23.73646436135255, + -4.971214728055401, + -4.986449369351611 + ], + [ + -24.591689813736252, + -4.317191583443446, + -3.543883321993098 + ], + [ + -26.462955491781027, + -2.871345546233954, + -4.061389431201518 + ], + [ + -29.377832589382834, + -4.698900694142424, + -8.709829060830305 + ], + [ + -32.123097478768486, + -3.7507235246344237, + -5.707925831409025 + ], + [ + -32.12697172948989, + -4.931450842033428, + -3.8143663662877896 + ], + [ + -28.3438554360382, + -2.369543607068124, + -5.260845656195489 + ], + [ + -27.926956289555577, + -4.9743007755617725, + -6.914692292382605 + ], + [ + -30.09210676835965, + -2.945064149944585, + -6.963623388190989 + ], + [ + -30.197238217751746, + -5.786467074394409, + -5.95888923518735 + ], + [ + -30.33262175847411, + -3.376028654941962, + -4.146531838986722 + ], + [ + -30.013986038619716, + -5.28456211088087, + -2.197583110724935 + ], + [ + -29.969894652663896, + -6.438055488304258, + -3.5055965709810706 + ], + [ + -27.210684445546587, + -1.6561634137917878, + -10.027520842096047 + ], + [ + -25.639316450852075, + -2.425574218081479, + -9.844833733063338 + ], + [ + -26.645689463369543, + -2.89449597570038, + -11.137552744615915 + ], + [ + -22.538310080277377, + -2.9700990664378537, + -2.0534893542542614 + ], + [ + -21.965850570931295, + -3.4784118321838946, + -0.8242556206613315 + ], + [ + -22.743840406379913, + -4.6340769160277375, + -0.17124129354912107 + ], + [ + -23.666147107667957, + -5.162257380888207, + -0.7712356409671927 + ], + [ + -23.289345138260405, + -2.294786369639965, + -2.0517332541083864 + ], + [ + -20.949321793375333, + -3.829570321349763, + -1.0016109911562128 + ], + [ + -21.875749594986445, + -2.6833372336117947, + -0.08409471493891839 + ], + [ + -22.373466293225132, + -4.927677575298588, + 1.0695753859292152 + ], + [ + -22.91360102603448, + -5.836034273442124, + 2.0695803046721073 + ], + [ + -24.482936560456395, + -6.005295862096801, + 2.050727705525348 + ], + [ + -24.96735540155135, + -7.076285078461183, + 2.3527795512473078 + ], + [ + -22.421747202426403, + -5.543258199196686, + 3.517666892025136 + ], + [ + -21.1266859121888, + -5.1626175758614465, + 3.555683973813698 + ], + [ + -21.66950409412222, + -4.307233343652399, + 1.4431924420774385 + ], + [ + -22.609572977467867, + -6.849673659825612, + 1.8084266874134174 + ], + [ + -22.88373966826147, + -4.600067173971553, + 3.8093104578993997 + ], + [ + -22.52353207126176, + -6.400912869492743, + 4.182621976501171 + ], + [ + -20.883259703814193, + -4.730989266260082, + 4.377901360940245 + ], + [ + -25.173070212801974, + -4.897743148633026, + 1.7239795294987934 + ], + [ + -26.709398953460344, + -4.777229247169288, + 1.80457077762507 + ], + [ + -27.443428637027363, + -5.600556517003724, + 0.7858596077512611 + ], + [ + -28.66518187306526, + -5.807747846096163, + 0.7292965716140211 + ], + [ + -27.04996946190696, + -3.287515130510343, + 1.8605065091786188 + ], + [ + -26.76737683927497, + -2.742021111822396, + 0.6298020054848243 + ], + [ + -24.57338271483901, + -4.111945619401496, + 1.516616042354958 + ], + [ + -27.029339484733022, + -5.036341335313352, + 2.813828142348451 + ], + [ + -28.120177033558633, + -3.108686911659035, + 1.9642809443217901 + ], + [ + -26.43433033124723, + -2.892807976397293, + 2.668775009359296 + ], + [ + -25.861343286000412, + -2.4257621204429256, + 0.6559661851569075 + ], + [ + -26.657939744085493, + -6.216596457785357, + -0.11032200526479492 + ], + [ + -27.05225132038133, + -7.087950244376771, + -1.2747310545648054 + ], + [ + -27.270759605280187, + -8.580599774457937, + -0.8182449243316464 + ], + [ + -27.91490523582833, + -9.305483767862825, + -1.5034768742651996 + ], + [ + -26.039214475486858, + -7.019704418894435, + -2.450351494507368 + ], + [ + -24.777974742362147, + -7.797506244110025, + -2.1069524379038076 + ], + [ + -26.58180466207626, + -7.3961304098233995, + -3.805944650758698 + ], + [ + -25.658845530158615, + -6.1142085976185285, + -0.003424581921152856 + ], + [ + -27.990569008808368, + -6.729747855680046, + -1.6982260738737716 + ], + [ + -25.763881985488904, + -5.9699514864452965, + -2.5518947300174304 + ], + [ + -24.426177843885863, + -7.407424063697249, + -1.1518724744060036 + ], + [ + -24.95351410103956, + -8.870965313113231, + -2.0364277294985675 + ], + [ + -23.998896845887895, + -7.456099946039785, + -2.7885549371803675 + ], + [ + -27.52207670405437, + -6.867134725787309, + -3.961333836919414 + ], + [ + -25.807639143346172, + -7.193424542293712, + -4.546000583039093 + ], + [ + -26.901214402775324, + -8.437852516319879, + -3.8358259447784766 + ], + [ + -26.72832077455728, + -8.981746925912148, + 0.3437439312130913 + ], + [ + -26.845200232367528, + -10.355169968632197, + 0.9428784075322251 + ], + [ + -28.09741433582775, + -10.536536527898932, + 1.8086202591044256 + ], + [ + -28.643568336961216, + -9.473209747395401, + 2.086135438995395 + ], + [ + -25.605868823481295, + -10.595199528069372, + 1.7987520592729567 + ], + [ + -24.23882471395052, + -10.47607528456848, + 1.0238528020428375 + ], + [ + -23.057441389760353, + -10.56961436790084, + 2.024662097391713 + ], + [ + -24.010586675260107, + -11.590556775659422, + 0.03366266727793783 + ], + [ + -26.167008281989695, + -8.237688696521161, + 0.7328555915523352 + ], + [ + -27.011412794835675, + -11.041753099801326, + 0.11277160460297743 + ], + [ + -25.618851506154005, + -9.881452310554323, + 2.6224629080737207 + ], + [ + -25.593680653898783, + -11.615804765235453, + 2.1812590673803784 + ], + [ + -24.167077699450235, + -9.445196490668366, + 0.6770954335942887 + ], + [ + -22.127748126412044, + -10.419252673882113, + 1.4758746669991172 + ], + [ + -23.043437946954363, + -9.727106227936702, + 2.7160970915573834 + ], + [ + -23.17117863933211, + -11.487837598556212, + 2.600883758257885 + ], + [ + -24.700148934157042, + -11.49775213104823, + -0.8053780364472991 + ], + [ + -23.040958992426603, + -11.399773634914595, + -0.4262513429538511 + ], + [ + -24.117336992048052, + -12.625858592123677, + 0.35747926338468566 + ], + [ + -28.519776602821764, + -11.797676299903458, + 2.2275083548710737 + ], + [ + -29.601688334103226, + -12.024951132899275, + 3.0912705920670462 + ], + [ + -29.46692628790191, + -11.435506693332457, + 4.505731439846541 + ], + [ + -28.385036423362134, + -11.034820809980488, + 4.916087108059277 + ], + [ + -30.02984804751978, + -13.479454337266247, + 3.1617028404039482 + ], + [ + -28.938589122091823, + -14.259550015193327, + 3.6060187409217894 + ], + [ + -27.969932474446562, + -12.628199274084125, + 2.0601499972116866 + ], + [ + -30.45172665425135, + -11.535514456920964, + 2.6158846577574186 + ], + [ + -30.89612982490551, + -13.62912373888787, + 3.8061026187635454 + ], + [ + -30.430135075158574, + -13.831908435653304, + 2.211100143825123 + ], + [ + -29.123489709192942, + -14.517663469603349, + 4.511991459414349 + ], + [ + -30.621183005523815, + -11.125027992249443, + 5.129719121546637 + ], + [ + -30.78715216162486, + -10.411208189398508, + 6.396221208853351 + ], + [ + -29.87759698612776, + -10.92544719660026, + 7.614654639746522 + ], + [ + -29.637893728310882, + -10.15916692760345, + 8.546731479245876 + ], + [ + -32.30667699748555, + -10.413828285877742, + 6.774442777771203 + ], + [ + -32.8154236095872, + -11.800419713404949, + 7.3149390277119 + ], + [ + -34.29483763308337, + -11.798490348347855, + 7.739653843774914 + ], + [ + -35.234887958400165, + -12.040592102051448, + 6.960555680524159 + ], + [ + -34.62472474188535, + -11.460890487730467, + 8.936802227227856 + ], + [ + -31.43553737796228, + -11.430357817409458, + 4.616203284940504 + ], + [ + -30.47217558859355, + -9.38582636883865, + 6.202615766782358 + ], + [ + -32.4573829392733, + -9.714614525776994, + 7.596935292266912 + ], + [ + -32.76910648988653, + -10.085546665315633, + 5.843588143560519 + ], + [ + -32.63187162418152, + -12.610873232456925, + 6.609546175613803 + ], + [ + -32.307566639549414, + -11.919384737459382, + 8.272034420441319 + ], + [ + -29.460164084267298, + -12.231356511096692, + 7.611059753238007 + ], + [ + -28.539588414160157, + -12.895998578153751, + 8.508067761952956 + ], + [ + -27.103922291407937, + -12.681142861981755, + 8.11017517115477 + ], + [ + -26.28714836458443, + -12.947866654300299, + 8.95529167624245 + ], + [ + -28.932982086119836, + -14.443617061150007, + 8.582785474485709 + ], + [ + -28.98556503877172, + -15.106268104638843, + 7.164880139931238 + ], + [ + -29.6683167979198, + -14.562792816824754, + 6.2541882293276 + ], + [ + -28.404791728660026, + -16.2516912414917, + 7.012516520201162 + ], + [ + -29.741745196495774, + -12.758651512908102, + 6.796949685686946 + ], + [ + -28.613956411840835, + -12.520034635814511, + 9.528471620165337 + ], + [ + -28.1859493859608, + -14.880340393038068, + 9.245595723856953 + ], + [ + -29.905784801747313, + -14.505726694043801, + 9.070530879326585 + ], + [ + -26.738023557048578, + -12.132734112789876, + 6.909384212317544 + ], + [ + -25.38172209048259, + -11.838059502742908, + 6.4184887330677185 + ], + [ + -25.166674487096152, + -10.345219533715976, + 6.241447170531913 + ], + [ + -24.010090409306827, + -9.946992185934334, + 6.483912173195713 + ], + [ + -25.31670744160304, + -12.388741811971727, + 4.979085251012915 + ], + [ + -25.3264431252952, + -13.940656878559935, + 4.808470365325259 + ], + [ + -25.427628606249044, + -14.447240084044438, + 3.3151586181814823 + ], + [ + -25.57368579440768, + -16.002161588415788, + 3.429917669544092 + ], + [ + -25.423443458020383, + -16.756532398914942, + 2.2009086423885824 + ], + [ + -27.491584237159156, + -11.925862003077839, + 6.2695027443001194 + ], + [ + -24.590367062466814, + -12.336935394336308, + 6.977935123454473 + ], + [ + -26.11993523804538, + -11.984695149519496, + 4.362909522858062 + ], + [ + -24.403910190326382, + -11.98608988065098, + 4.540029765026607 + ], + [ + -24.516648299944073, + -14.440465452695094, + 5.339995595742669 + ], + [ + -26.19954010587926, + -14.269140645380048, + 5.372299648478225 + ], + [ + -26.267049174426905, + -13.961199309103108, + 2.817933668182463 + ], + [ + -24.5127927132406, + -14.156208789566449, + 2.7989429737198086 + ], + [ + -24.776052534453274, + -16.376904848332174, + 4.071364410619366 + ], + [ + -26.584598141104134, + -16.219686571778425, + 3.7746461662809025 + ], + [ + -24.783228249541875, + -17.526960958882, + 2.3299948386878717 + ], + [ + -26.27425127383871, + -17.12788366023176, + 1.8030136405749446 + ], + [ + -24.918667900691677, + -16.238028027620544, + 1.4963124007566697 + ], + [ + -26.14834204378228, + -9.556566591029195, + 5.720517442822135 + ], + [ + -25.855642165558816, + -8.251995032078014, + 5.119920938040613 + ], + [ + -25.2813298913122, + -7.271746461176974, + 6.141417423959859 + ], + [ + -24.26478557982318, + -6.618683706412412, + 5.846085570471663 + ], + [ + -27.165587416057235, + -7.785369663754921, + 4.522167465596253 + ], + [ + -28.35529383120637, + -8.056820088268353, + 5.244297182544084 + ], + [ + -27.00800682542095, + -10.009147867589604, + 5.4443927361352475 + ], + [ + -25.1438110206729, + -8.571749046404761, + 4.358898796076138 + ], + [ + -27.079377971496612, + -6.7148467886614185, + 4.33603207724819 + ], + [ + -27.217989305483936, + -8.317278127076236, + 3.5722053467564647 + ], + [ + -28.748085019625755, + -8.905130372178462, + 5.025932448900392 + ], + [ + -25.856505463555376, + -7.20771760956336, + 7.364362112125457 + ], + [ + -25.397783369189717, + -6.443349534899028, + 8.513540901281823 + ], + [ + -24.182993571717446, + -7.173330111565576, + 9.144675058542356 + ], + [ + -23.22318446009081, + -6.4702783042689305, + 9.40657068260731 + ], + [ + -26.500849454850762, + -6.383861169215692, + 9.590830648466072 + ], + [ + -27.892602285612433, + -5.860512312116526, + 9.174993199572688 + ], + [ + -27.906738576801754, + -4.510757162063896, + 8.51194795152336 + ], + [ + -29.306889444573432, + -4.097387966875232, + 7.946115642902544 + ], + [ + -30.306884357518175, + -3.9817181609725196, + 9.023684797644426 + ], + [ + -26.69000517593137, + -7.751619824030456, + 7.536259857460912 + ], + [ + -25.108427076833014, + -5.436917169930268, + 8.21110584755421 + ], + [ + -26.765821757315997, + -7.389746802702859, + 9.916530471986562 + ], + [ + -26.103690624872804, + -5.9806718722631445, + 10.522390814240525 + ], + [ + -28.25726159552873, + -6.545621882918425, + 8.409651122416872 + ], + [ + -28.58690210303746, + -5.774218494085545, + 10.010817271312252 + ], + [ + -27.532163958046656, + -3.770802345612907, + 9.219239708351836 + ], + [ + -27.215635630634047, + -4.669524316026951, + 7.684140270025674 + ], + [ + -29.155325090834175, + -3.150471284651701, + 7.427968686859065 + ], + [ + -29.605188585314398, + -4.801717432180965, + 7.169560300023025 + ], + [ + -30.52405024901418, + -4.87743330335968, + 9.4367625294039 + ], + [ + -30.099558835184393, + -3.311425754784864, + 9.75019997152614 + ], + [ + -31.15674471882086, + -3.5942631014263213, + 8.639338439953972 + ], + [ + -24.16489084589299, + -8.486638447397468, + 9.114334444757315 + ], + [ + -23.13322994263251, + -9.293319870445828, + 9.775566552168543 + ], + [ + -21.720132396428447, + -9.07184093749612, + 9.20677608140531 + ], + [ + -20.769375338773326, + -8.896647253729611, + 9.984626247627956 + ], + [ + -23.612029244280752, + -10.755997900706006, + 9.768401761942547 + ], + [ + -22.54264112965845, + -11.661037136804566, + 10.485395800201479 + ], + [ + -22.24541903024829, + -11.372550231519995, + 11.997306955264648 + ], + [ + -21.109973585697553, + -12.162982685667203, + 12.48357093454502 + ], + [ + -20.584048334547074, + -12.227502463907399, + 13.644290044914047 + ], + [ + -19.59708282432741, + -13.07577762588079, + 13.927898897369753 + ], + [ + -20.944913015661555, + -11.570339027909029, + 14.681241018477497 + ], + [ + -25.039692398509537, + -8.982406437834982, + 9.01929220244288 + ], + [ + -22.943028291936372, + -8.937361383261702, + 10.788096841965777 + ], + [ + -24.560279382822323, + -10.84270303564034, + 10.298884319872403 + ], + [ + -23.755869934703075, + -11.162352464644414, + 8.767260345668426 + ], + [ + -22.95520049294825, + -12.669483939966028, + 10.454887387106586 + ], + [ + -21.58094318133472, + -11.712828725177815, + 9.974949141904624 + ], + [ + -22.01299930399309, + -10.30992198731343, + 12.067334577061512 + ], + [ + -23.13582566275722, + -11.693950293947637, + 12.537657224167985 + ], + [ + -20.716909108931237, + -12.874027075029858, + 11.883554805925142 + ], + [ + -19.317986687752175, + -13.82655116957244, + 13.312635952494768 + ], + [ + -19.082402840132616, + -13.09651127585721, + 14.796678224408588 + ], + [ + -21.83283307430623, + -11.106876975353089, + 14.811251519939944 + ], + [ + -20.49927806157805, + -11.783836695861226, + 15.56210854709155 + ], + [ + -21.661681695046674, + -8.989807020145406, + 7.890220911504845 + ], + [ + -20.443105064841404, + -8.49415376136784, + 7.175963960732263 + ], + [ + -19.852474384437574, + -7.167804260188461, + 7.733709597885139 + ], + [ + -18.631688943057977, + -7.090685072515953, + 8.048505118501442 + ], + [ + -20.69868194333698, + -8.382837514643313, + 5.665088493262241 + ], + [ + -19.51603269284757, + -8.153220438712083, + 4.636476173279602 + ], + [ + -18.239038049254045, + -8.800477927580744, + 5.0221821328505145 + ], + [ + -19.977086909337814, + -8.579480555407827, + 3.264338632229208 + ], + [ + -22.486252652959816, + -9.23782564945492, + 7.3623296641410745 + ], + [ + -19.643573633089655, + -9.216450438767765, + 7.34068584056811 + ], + [ + -21.096363655418916, + -9.375571543804199, + 5.454310494720318 + ], + [ + -21.60965449004139, + -7.789936296015867, + 5.58325127266049 + ], + [ + -19.37181741914393, + -7.075186932573104, + 4.564731368986384 + ], + [ + -17.86348311670384, + -8.345523188585616, + 5.9387385961839705 + ], + [ + -18.395155757275887, + -9.875757873880957, + 5.108772589951003 + ], + [ + -17.489781005790032, + -8.627640535524336, + 4.249626704187226 + ], + [ + -20.95946000252713, + -8.111116260973404, + 3.203716826067239 + ], + [ + -19.356953731606367, + -8.186715839517205, + 2.4585638962386365 + ], + [ + -20.14282802807633, + -9.654022941036942, + 3.1869699378986396 + ], + [ + -20.698602501028606, + -6.165360576499751, + 7.844225057619701 + ], + [ + -20.33462538454064, + -4.852836240344175, + 8.36146496591001 + ], + [ + -19.96828640566983, + -4.961018439582148, + 9.824011862988714 + ], + [ + -18.875519672281026, + -4.4979587283235105, + 10.173349406850242 + ], + [ + -21.501195122418796, + -3.8836627868218443, + 8.051061200253791 + ], + [ + -21.558276896305294, + -3.335887403222131, + 6.667644774357077 + ], + [ + -22.472042042441327, + -2.541408121477417, + 6.340198280615544 + ], + [ + -20.885485728827593, + -3.7413869431233024, + 5.775261521349634 + ], + [ + -21.681793492623513, + -6.392064873145756, + 7.799025519411059 + ], + [ + -19.443591239847144, + -4.534727883874581, + 7.820199965793469 + ], + [ + -22.43426318869794, + -4.364419271261937, + 8.344931969993869 + ], + [ + -21.328882280659524, + -3.0530596175523357, + 8.735537751868414 + ], + [ + -23.188393769354175, + -2.2411584893419274, + 6.9857941298220565 + ], + [ + -22.509752101665182, + -2.196862702751986, + 5.3915317320437275 + ], + [ + -20.654058556972284, + -5.66795473307991, + 10.671166305814246 + ], + [ + -20.269654404694464, + -5.9103624378766995, + 12.121313603333725 + ], + [ + -18.978927860880887, + -6.603322151779025, + 12.236657139339478 + ], + [ + -18.169251739405013, + -6.178894619692528, + 13.080904151470563 + ], + [ + -21.337476730666275, + -6.73729595012469, + 12.825322761350241 + ], + [ + -21.09197906178036, + -6.9246566532581255, + 14.344092082984304 + ], + [ + -22.557308466199462, + -6.15403414215163, + 12.608462000660687 + ], + [ + -21.487385007836437, + -6.122989472042008, + 10.326774699438952 + ], + [ + -20.252532140284654, + -4.9833907230283785, + 12.694488740057183 + ], + [ + -21.290872185149645, + -7.75656967564538, + 12.441904425580995 + ], + [ + -23.151136069088032, + -6.874329259402316, + 12.384547223719776 + ], + [ + -21.96506198149322, + -7.413363573440165, + 14.776514988368723 + ], + [ + -20.22770307977699, + -7.535909474064965, + 14.603885135396984 + ], + [ + -20.931148762892533, + -5.947999105264728, + 14.80057418626179 + ], + [ + -18.654376115094838, + -7.595448961678414, + 11.3670458202337 + ], + [ + -17.362700507179806, + -8.173472527911713, + 11.32648463505349 + ], + [ + -16.253467092164822, + -7.137117053345889, + 11.027511006165454 + ], + [ + -15.37950688336427, + -6.928645724781916, + 11.836849161290148 + ], + [ + -17.203971113526023, + -9.409713968732433, + 10.441411096347979 + ], + [ + -17.943251880139517, + -10.71963420840217, + 10.933453909604259 + ], + [ + -15.714843122681907, + -9.678392101707516, + 10.149087261251179 + ], + [ + -18.504458218071612, + -11.57413063609971, + 9.763624210563997 + ], + [ + -19.313594562732067, + -7.753108213659857, + 10.618262555329649 + ], + [ + -17.097717181718014, + -8.441420905090524, + 12.349268993400718 + ], + [ + -17.562822107812345, + -9.13829554420579, + 9.448607607622936 + ], + [ + -17.20767672221057, + -11.341993366087024, + 11.44306227962266 + ], + [ + -18.68014447190703, + -10.481817330978288, + 11.700615370784263 + ], + [ + -15.109270685745681, + -9.731745445533534, + 11.053815839193385 + ], + [ + -15.562057938570572, + -10.691122220173725, + 9.776077501623133 + ], + [ + -15.307790859558983, + -8.928371728436616, + 9.470943490654621 + ], + [ + -17.587797513259723, + -11.707866385763168, + 9.189214267152602 + ], + [ + -19.031636860750112, + -12.454923248062471, + 10.130217681730999 + ], + [ + -19.294035297936187, + -11.044336513368876, + 9.230723759007713 + ], + [ + -16.374615973944433, + -6.425193444834036, + 9.919281193986901 + ], + [ + -15.422666398301347, + -5.364074273175163, + 9.442795058814061 + ], + [ + -15.106662704882904, + -4.323592361288604, + 10.554894442814106 + ], + [ + -13.899104983317182, + -4.008611808405703, + 10.785999841822477 + ], + [ + -15.980354405084721, + -4.808954892607517, + 8.18363304220283 + ], + [ + -15.776817246925877, + -5.755473135971158, + 6.969054844427095 + ], + [ + -16.66958256945114, + -5.323954484861105, + 5.834334552585458 + ], + [ + -14.37445138455948, + -5.7863016110480885, + 6.493207566301029 + ], + [ + -17.138666372411905, + -6.660847981687255, + 9.30219115099586 + ], + [ + -14.46684392633188, + -5.858461971499622, + 9.269351207813687 + ], + [ + -17.03062520213911, + -4.661129392663639, + 8.43498907543526 + ], + [ + -15.449741622047876, + -3.8676932324394784, + 8.040184061480199 + ], + [ + -16.034655891263878, + -6.7949474385176245, + 7.171827110100159 + ], + [ + -17.664861746420964, + -5.613657389643635, + 6.171364713508867 + ], + [ + -16.517459395552713, + -4.259439802408991, + 5.656101987624347 + ], + [ + -16.393801962731498, + -5.822677010664165, + 4.905182555699476 + ], + [ + -13.924061789498053, + -4.824053422959253, + 6.249633751456811 + ], + [ + -13.74647580387031, + -6.250939858240372, + 7.253377001412781 + ], + [ + -14.195825838520816, + -6.565276508950092, + 5.751997361976312 + ], + [ + -16.080060198439217, + -3.770227126338199, + 11.216005602859877 + ], + [ + -15.919106579846828, + -2.8290977587984685, + 12.329922753327288 + ], + [ + -15.263689048424597, + -3.43736014181556, + 13.549059028417181 + ], + [ + -14.48278483325515, + -2.80436703730156, + 14.256895552422758 + ], + [ + -17.210949219255784, + -2.1560697439841476, + 12.71129237902056 + ], + [ + -17.85499975584557, + -1.2184634969410695, + 11.615576916130564 + ], + [ + -17.066449890455196, + -0.5171367133224685, + 10.866537550500771 + ], + [ + -19.00744417546639, + -0.988336470000867, + 11.4984648096757 + ], + [ + -17.022255296779885, + -4.099462892847839, + 11.06117723455399 + ], + [ + -15.252390816664427, + -2.04608208207695, + 11.968707619577787 + ], + [ + -17.971893237815827, + -2.9179178196888955, + 12.880551302532405 + ], + [ + -17.090605896709945, + -1.5944257807444089, + 13.637669332596495 + ], + [ + -16.064978296303337, + -0.6181035009052742, + 10.949966940108139 + ], + [ + -17.489890916169557, + -0.12234532753687777, + 10.038928137345126 + ], + [ + -15.510536849261578, + -4.725456390495623, + 13.805870696800692 + ], + [ + -14.752135542747471, + -5.502359874618691, + 14.76075342532458 + ], + [ + -13.365513654020933, + -5.796242289870776, + 14.358899104445939 + ], + [ + -12.443335696980343, + -5.747375578338733, + 15.215029830486426 + ], + [ + -15.567381154006627, + -6.839300981181282, + 15.137198242028198 + ], + [ + -14.904317964338329, + -7.485525885110405, + 16.39367850302532 + ], + [ + -16.82865208328826, + -6.370678345390104, + 15.594723160951425 + ], + [ + -16.063262440124934, + -5.183681372043026, + 13.095502253788059 + ], + [ + -14.779070211439969, + -4.897489099957426, + 15.66712414780614 + ], + [ + -15.62425990852508, + -7.5183485057054895, + 14.286457552265498 + ], + [ + -17.445844403677846, + -6.505253899584886, + 14.871835687387955 + ], + [ + -15.357443947306527, + -8.463766261718604, + 16.554388743143427 + ], + [ + -13.825821619901886, + -7.6076518834695435, + 16.293524746473285 + ], + [ + -14.987035637451653, + -6.84010644426337, + 17.26814133690737 + ], + [ + -13.02717622537181, + -5.893736883765172, + 13.106981562008752 + ], + [ + -11.662291699517652, + -6.1082359171576, + 12.570796757485091 + ], + [ + -10.898621475542225, + -4.851519948204697, + 12.517428496083017 + ], + [ + -9.732346053466605, + -4.86673867362876, + 12.871677665365869 + ], + [ + -11.532925058579337, + -6.905644758668416, + 11.283256245093723 + ], + [ + -12.083364532925621, + -8.273569267073242, + 11.315669193614774 + ], + [ + -11.25682663915679, + -9.448099123616316, + 10.243657944103086 + ], + [ + -11.524860926803568, + -8.695165971060192, + 8.691136417545259 + ], + [ + -13.770720884857038, + -6.014828736209807, + 12.434240414138765 + ], + [ + -11.22164402625941, + -6.774578276195598, + 13.312358997772014 + ], + [ + -11.986201016509836, + -6.276348628237827, + 10.517341236544704 + ], + [ + -10.51109366161553, + -7.090583609143209, + 10.95195956480443 + ], + [ + -12.040251161004363, + -8.589704160942972, + 12.35792516548353 + ], + [ + -13.158137946038924, + -8.23132538207517, + 11.139076140925182 + ], + [ + -10.827494554629132, + -9.038819292592962, + 7.927146083361239 + ], + [ + -12.547591420925079, + -8.833710304104216, + 8.34052588135314 + ], + [ + -11.437885044378325, + -7.613472759115098, + 8.79348949493496 + ], + [ + -11.545216415290072, + -3.7289463628937085, + 12.366008440232134 + ], + [ + -10.883511419776443, + -2.442205430727256, + 12.741297175729612 + ], + [ + -10.61169027083381, + -2.347831225788468, + 14.226687375727805 + ], + [ + -9.480731930082177, + -2.0619240267559036, + 14.59839135545362 + ], + [ + -11.78345181685632, + -1.3070026798986802, + 12.310278416568543 + ], + [ + -11.353718623735336, + -0.07686888899535971, + 12.844146611403685 + ], + [ + -12.445722580532173, + -3.7230821701928676, + 11.908674814495951 + ], + [ + -9.969411518157079, + -2.261204334724269, + 12.175821458886386 + ], + [ + -11.6853539060576, + -1.3080655087281698, + 11.22470227515576 + ], + [ + -12.780702505432897, + -1.59371748835391, + 12.644021944658103 + ], + [ + -10.62250723562658, + 0.15251392483746695, + 12.265948173985368 + ], + [ + -11.63079539639201, + -2.5420914382684714, + 15.091874974000476 + ], + [ + -11.575675819108794, + -2.4133988084741134, + 16.546692706788267 + ], + [ + -10.437074072567977, + -3.344368570452275, + 17.216066860376714 + ], + [ + -9.629033865963185, + -2.746327451507881, + 17.961001515748944 + ], + [ + -12.907167145102825, + -2.76732919893459, + 17.251671221107937 + ], + [ + -12.662705992146522, + -2.5764984484533215, + 18.77847018147747 + ], + [ + -14.039892586063509, + -2.0393228653553876, + 16.947829022780674 + ], + [ + -12.538411792491452, + -2.6701321658929515, + 14.667683194403747 + ], + [ + -11.394744069988684, + -1.372061384745642, + 16.813112055561497 + ], + [ + -13.150289698941965, + -3.7937385312653475, + 16.976945926610338 + ], + [ + -14.127126107820656, + -2.0817470429619505, + 15.992744934962538 + ], + [ + -12.106430778296856, + -1.6668073118363367, + 19.004561731370174 + ], + [ + -13.633962562051922, + -2.638859203194656, + 19.269257926469084 + ], + [ + -12.078849781187976, + -3.3946331350657317, + 19.20021128588935 + ], + [ + -10.363008055139975, + -4.626359065555619, + 16.896948996148378 + ], + [ + -9.3117693926766, + -5.581233598152181, + 17.496082403112524 + ], + [ + -7.92598267343764, + -5.240911006951592, + 17.09371293280986 + ], + [ + -7.031227123170388, + -5.469261741942233, + 17.877127214383663 + ], + [ + -9.665596257994263, + -7.045530749695104, + 17.052353495052984 + ], + [ + -10.956764468419742, + -7.535428693775657, + 17.73246256040646 + ], + [ + -8.608295543806301, + -8.072551593968512, + 17.569346841257413 + ], + [ + -11.555687063407087, + -8.655574963015624, + 16.83195959269991 + ], + [ + -11.087509580144014, + -5.017553440631161, + 16.3120002132502 + ], + [ + -9.279052131051847, + -5.671829853431234, + 18.581818542747683 + ], + [ + -9.815828382136603, + -7.1641336275575895, + 15.979290925442111 + ], + [ + -10.653395994101995, + -7.723534762455017, + 18.762357935040164 + ], + [ + -11.756722047654698, + -6.795678755288861, + 17.701840917144185 + ], + [ + -7.565753942012315, + -7.853217440621108, + 17.33892190562331 + ], + [ + -8.686062524375316, + -8.227709383568083, + 18.64543772423356 + ], + [ + -8.875609308197479, + -9.085351175820676, + 17.267886728991876 + ], + [ + -11.697897375739053, + -8.263749954054106, + 15.824809168336113 + ], + [ + -10.891229906729738, + -9.51856153354936, + 16.7889484971844 + ], + [ + -12.436784817424668, + -9.03374300200585, + 17.350373482490575 + ], + [ + -7.748397622441583, + -4.6260956510302265, + 15.918301871261962 + ], + [ + -6.483687936587598, + -4.150636725378575, + 15.47840812315422 + ], + [ + -6.033120412411219, + -2.8965779260603313, + 16.230587250290526 + ], + [ + -4.952785644207196, + -2.826674930530473, + 16.77662560871913 + ], + [ + -6.54283525001052, + -3.8755363511525616, + 13.95119079302717 + ], + [ + -5.177726746122427, + -3.8003110163566873, + 13.39699154424257 + ], + [ + -4.520392864082183, + -2.601958730624631, + 13.449769587679262 + ], + [ + -4.456587833192694, + -4.975314628801726, + 12.972289300401242 + ], + [ + -3.126824468143866, + -2.5447636322871716, + 13.2035210405655 + ], + [ + -3.1122808756929876, + -4.9795487733950665, + 12.55223634207852 + ], + [ + -2.441274807293918, + -3.7398923095940404, + 12.709787022782162 + ], + [ + -1.119572720414937, + -3.718898367042158, + 12.464455553184287 + ], + [ + -8.54806638357523, + -4.38613087205411, + 15.34993061819195 + ], + [ + -5.691287039253766, + -4.862648528975967, + 15.709146756084092 + ], + [ + -7.13733367855037, + -4.640071840381921, + 13.451034180880011 + ], + [ + -7.041729554036218, + -2.935424739290198, + 13.715834773349838 + ], + [ + -5.118172972629076, + -1.771929805020477, + 13.796340361270232 + ], + [ + -5.037190842133491, + -5.881599913166326, + 12.883134280252841 + ], + [ + -2.5246144415804452, + -1.6669973605383603, + 13.385920900567434 + ], + [ + -2.6209270633196318, + -5.827463740395217, + 12.098349325545435 + ], + [ + -0.8754938266834085, + -4.61526053355243, + 12.222460754778023 + ], + [ + -6.9536859567801015, + -1.9590936301864161, + 16.27436791440238 + ], + [ + -6.778783490991443, + -0.6855903998716748, + 16.866228679903635 + ], + [ + -6.605210093490604, + -0.7617289050222418, + 18.418612034722415 + ], + [ + -5.650201363412009, + -0.14760613418078705, + 18.936896239957793 + ], + [ + -7.984824039219784, + 0.2488528484772896, + 16.58475212506006 + ], + [ + -8.17838494233138, + 0.3470812957272411, + 15.239819221086053 + ], + [ + -7.760117615107213, + -2.074683631244028, + 15.677373079231312 + ], + [ + -5.851014541960395, + -0.23815024313990563, + 16.509656669445853 + ], + [ + -8.907414065385233, + -0.17440807433476024, + 16.98196099550586 + ], + [ + -7.901862977866673, + 1.2439398766667082, + 17.02180945846771 + ], + [ + -9.130932460181954, + 0.46209790677768225, + 15.207794295307869 + ], + [ + -7.386252444613957, + -1.5315539042628785, + 19.147690435649594 + ], + [ + -7.222371123687655, + -1.8326646092135945, + 20.582499605365513 + ], + [ + -6.0731742572095735, + -2.794898553405872, + 20.977011044069883 + ], + [ + -5.82963443932328, + -3.006771051297335, + 22.147317681460155 + ], + [ + -8.510983224828435, + -2.491826093167532, + 21.137114095671773 + ], + [ + -9.710237438845079, + -1.4984423081773457, + 21.300801061480552 + ], + [ + -8.932725796557666, + -3.5967173443154934, + 20.360930287738988 + ], + [ + -8.111291718058638, + -2.0212264825828186, + 18.643075672693058 + ], + [ + -7.023831569320971, + -0.8924973876180928, + 21.097053099248313 + ], + [ + -8.235822336983697, + -2.834071610403484, + 22.134737881843783 + ], + [ + -9.379736758328196, + -3.273877282482374, + 19.575080861517545 + ], + [ + -9.267768219283779, + -0.6881683988073135, + 21.880263011385217 + ], + [ + -9.986618231604172, + -1.1167389535735524, + 20.31793785290886 + ], + [ + -10.569423778062347, + -1.9986346870320943, + 21.74768327786303 + ], + [ + -5.421122565842601, + -3.564935503778514, + 20.063993670081047 + ], + [ + -4.534770458267776, + -4.667922365468826, + 20.351302048736237 + ], + [ + -3.305514414785525, + -4.212693675367291, + 21.086719427575712 + ], + [ + -2.5957555521933626, + -3.3664903174165772, + 20.60569711913451 + ], + [ + -5.735600492112963, + -3.467895934086499, + 19.10912031772024 + ], + [ + -5.106524701933836, + -5.421094347194639, + 20.893455248669092 + ], + [ + -4.217610359394159, + -5.127477297686653, + 19.415183807303094 + ], + [ + -3.0347685309162644, + -4.801197237273783, + 22.21768951111461 + ], + [ + -1.9751418637254101, + -4.572325526888477, + 23.22262796671954 + ], + [ + -1.1398776241809438, + -5.851692803562656, + 23.385746748054434 + ], + [ + -1.732499249449501, + -6.928267968840316, + 23.448281039101694 + ], + [ + -2.5569172770227127, + -3.9930387416645203, + 24.51071016673369 + ], + [ + -1.5190287738309085, + -3.4114093232614096, + 25.41925840376284 + ], + [ + -2.273009596952747, + -2.600232682556765, + 26.502873173390093 + ], + [ + -1.2744688650378089, + -2.248489413144526, + 27.585577838089904 + ], + [ + -1.8198877247778007, + -1.4467031100263696, + 28.6781135709377 + ], + [ + -3.7438524792995698, + -5.483929052959809, + 22.44390918587209 + ], + [ + -1.2825631821497097, + -3.8190044720534786, + 22.847205619490968 + ], + [ + -3.2943457137293524, + -3.2216667674528168, + 24.288703622761997 + ], + [ + -2.9765607486595544, + -4.819880156389559, + 25.083714472451696 + ], + [ + -0.8064977407518025, + -4.1924158300807335, + 25.68464288255433 + ], + [ + -0.9407044854293224, + -2.6405887634561935, + 24.909871628267688 + ], + [ + -2.632863173529502, + -1.7179499248677672, + 25.973552783725115 + ], + [ + -3.109793204996016, + -3.2158712576504485, + 26.832847734789443 + ], + [ + -0.948543175339273, + -3.151345235510391, + 28.1020326744733 + ], + [ + -0.2780308351925396, + -1.9547513880767298, + 27.255534600884083 + ], + [ + -1.8945872806157376, + -0.46013937100092406, + 28.47510561489338 + ], + [ + -2.7119041067562137, + -1.8470917252083865, + 28.93128503510044 + ], + [ + -1.3024513504707937, + -1.480765925231374, + 29.54482928953458 + ], + [ + 0.20038516212050136, + -5.827631545203985, + 23.58206426590219 + ], + [ + 1.1076185057615222, + -6.941014109919365, + 23.742833769513037 + ], + [ + 1.6192929280480766, + -6.932958698611003, + 25.15433287135573 + ], + [ + 1.8954312696037523, + -5.859786458757668, + 25.635876418441832 + ], + [ + 2.1662460732337654, + -7.001158475331863, + 22.634455646891283 + ], + [ + 1.594521549509697, + -7.275598166903819, + 21.259730007549713 + ], + [ + 2.991889924863238, + -5.674296193876387, + 22.585876450907563 + ], + [ + 0.6123502151082616, + -4.905620999039087, + 23.56525094624116 + ], + [ + 0.5211233042486179, + -7.848851393643201, + 23.601568722423867 + ], + [ + 2.804341677254328, + -7.830171986721098, + 22.940511333755445 + ], + [ + 2.365926410633801, + -7.393180167139008, + 20.498668829769837 + ], + [ + 0.973336409077644, + -8.156655364123196, + 21.42087264083129 + ], + [ + 1.029606497185015, + -6.400803211001431, + 20.937694614765917 + ], + [ + 2.9433515721321046, + -5.259616950448105, + 23.59274743383704 + ], + [ + 4.03965575258318, + -5.891542152963979, + 22.378296402745594 + ], + [ + 2.6152769570330316, + -5.010050614460511, + 21.80803324728257 + ], + [ + 1.598851170763729, + -8.09768641285956, + 25.811220847078133 + ], + [ + 2.0244005696673217, + -8.278111704222226, + 27.183417733248234 + ], + [ + 2.424150954943146, + -9.752241046827749, + 27.64171690806909 + ], + [ + 1.628655451417964, + -10.68581490529175, + 27.316085118090577 + ], + [ + 1.0390206376490183, + -7.666669224957104, + 28.189831382862735 + ], + [ + 1.9810586258351663, + -6.8467093683665325, + 29.495380815610297 + ], + [ + 1.2568749818909777, + -8.894817010582813, + 25.29378735440186 + ], + [ + 2.9801815991303453, + -7.7569763096238376, + 27.238207889971733 + ], + [ + 0.44511800062346507, + -6.965220929193549, + 27.60387259569243 + ], + [ + 0.3668002853987311, + -8.37054795874161, + 28.68052392335182 + ], + [ + 3.4656937534035364, + -9.870960217325148, + 28.41951947343426 + ], + [ + 3.851899727479234, + -10.993447949013046, + 29.16937441554274 + ], + [ + 2.731302366908088, + -11.396555685023657, + 30.095682002146596 + ], + [ + 2.3603664537324516, + -10.518101413558895, + 30.914597544301056 + ], + [ + 5.210796695145815, + -10.566015540118372, + 29.79273408009741 + ], + [ + 5.749071672902131, + -11.599674430431662, + 30.875573069320946 + ], + [ + 6.999264324309582, + -11.557745862376578, + 31.112444719922934 + ], + [ + 5.028794187727516, + -12.541524578161614, + 31.30391091634939 + ], + [ + 4.0177839985486274, + -9.029845247517528, + 28.50796113211854 + ], + [ + 4.0639839924621475, + -11.786341280193028, + 28.452125176081044 + ], + [ + 5.988042813180838, + -10.564784711358243, + 29.02854314206333 + ], + [ + 5.0857836017494655, + -9.614480323216299, + 30.309507294026872 + ], + [ + 7.444666610200702, + -10.672900959403933, + 30.91555888940437 + ], + [ + 7.47547100774177, + -12.230243535946443, + 31.696461658115606 + ], + [ + 2.2418152499606956, + -12.66275535737816, + 30.039243468045196 + ], + [ + 1.259804374004333, + -13.135357698843336, + 31.050727211584785 + ], + [ + 1.468606613806349, + -12.930655344333047, + 32.58397299951331 + ], + [ + 0.5447146016410974, + -12.886117606623486, + 33.37365778508993 + ], + [ + 1.2807722843441527, + -14.646904391854264, + 30.7585252510381 + ], + [ + 1.2650252645344329, + -14.621462060895055, + 29.21109954802626 + ], + [ + 2.3265534344907612, + -13.631972518199518, + 29.021450365940886 + ], + [ + 0.24576074315603225, + -12.802639787429882, + 30.82911250359479 + ], + [ + 2.209909887763984, + -15.121184781407123, + 31.074532125078242 + ], + [ + 0.4116315557053623, + -15.10355356917421, + 31.231984625711338 + ], + [ + 1.544170687498258, + -15.612192578687996, + 28.852440605256568 + ], + [ + 0.3404994756499597, + -14.300316437386755, + 28.73129021152094 + ], + [ + 3.3075204799940416, + -14.107144224457556, + 29.01741366257164 + ], + [ + 2.1687259554425293, + -13.207930546929447, + 28.029794178356926 + ], + [ + 2.7741968879588583, + -12.717597871321061, + 32.93621629989785 + ], + [ + 3.2152425485455054, + -12.572159492342848, + 34.29996205268457 + ], + [ + 3.3530250174466203, + -11.136889841010657, + 34.74176160639945 + ], + [ + 3.574517592552854, + -10.920004076896305, + 35.96848810515714 + ], + [ + 4.575662326528811, + -13.194267333058292, + 34.564715862324285 + ], + [ + 4.750774169730333, + -14.659482728124544, + 34.1443765800641 + ], + [ + 3.8367328543920607, + -15.499043747354222, + 34.29230088832692 + ], + [ + 5.902576648999182, + -15.030044136108927, + 33.74975895274055 + ], + [ + 3.3550668820263763, + -12.584945438283512, + 32.12068177614481 + ], + [ + 2.486921126711849, + -13.01676340634316, + 34.97817762882247 + ], + [ + 5.361644391519023, + -12.538209847822827, + 34.19065624640915 + ], + [ + 4.760074345605596, + -13.163177394674676, + 35.63855423882417 + ], + [ + 3.400064923497808, + -10.149740199788084, + 33.83881871447341 + ], + [ + 3.918488413071786, + -8.808431875516362, + 34.11424017800707 + ], + [ + 3.0997257449941844, + -7.758264894457682, + 33.45632668342287 + ], + [ + 3.436697675627179, + -7.389981729435135, + 32.32342097398897 + ], + [ + 5.455462989589829, + -8.69672460456303, + 33.92397598937203 + ], + [ + 6.051256607874497, + -7.5449912264130035, + 34.68417384302977 + ], + [ + 7.339445719323704, + -7.343114236589884, + 34.51212623917294 + ], + [ + 5.425405099712378, + -6.760384330836246, + 35.38381530333158 + ], + [ + 3.428807180877053, + -10.485423963635583, + 32.8866708283143 + ], + [ + 3.707066438633761, + -8.636957995092132, + 35.16969964643174 + ], + [ + 5.894648827926918, + -9.603256913215887, + 34.3404035451898 + ], + [ + 5.715445701214711, + -8.560216563361223, + 32.87427025908443 + ], + [ + 7.877268754006982, + -7.836088081839534, + 33.813686720694555 + ], + [ + 7.740842562207023, + -6.487920443326601, + 34.86937403675107 + ], + [ + 2.0551635994071407, + -7.224964041467331, + 34.147286030255124 + ], + [ + 1.312951424038015, + -6.012249615323412, + 33.86490251651851 + ], + [ + 2.1282681659977274, + -4.791585924168771, + 33.55835816383997 + ], + [ + 1.6870321872438938, + -3.9523175877450853, + 32.82530557104319 + ], + [ + 0.28240510288771586, + -5.814657501780005, + 35.00206657123962 + ], + [ + 0.050365025028595425, + -7.229634478563469, + 35.43953299920456 + ], + [ + 1.416232986899797, + -7.894265618795771, + 35.32142023682914 + ], + [ + 0.6687465238609945, + -6.072994175610063, + 32.98774388508926 + ], + [ + 0.6818194254429326, + -5.16395611189418, + 35.77998776513804 + ], + [ + -0.6419464094843812, + -5.280279576063606, + 34.78271838616381 + ], + [ + -0.20899349147080457, + -7.208073511855446, + 36.498005157960506 + ], + [ + -0.5831466815777241, + -7.812895896292787, + 34.771270303902355 + ], + [ + 2.078079141859271, + -7.751044604755748, + 36.1755513611942 + ], + [ + 1.3495834369794646, + -8.968455224082732, + 35.14886387013415 + ], + [ + 3.3088333289907452, + -4.683881383270176, + 34.086698182078585 + ], + [ + 4.316796924880233, + -3.5511318021604836, + 33.88142051472004 + ], + [ + 5.066310380941446, + -3.6757748726511466, + 32.552478206809376 + ], + [ + 5.879212226376286, + -2.843298923667035, + 32.226796318130205 + ], + [ + 5.223202782215931, + -3.387617723327992, + 35.06293178502768 + ], + [ + 4.568260982385021, + -3.1034789138092265, + 36.430167919681125 + ], + [ + 4.199944532569792, + -1.5925141717775446, + 36.46022288171601 + ], + [ + 3.7206881096388553, + -1.1231967070049436, + 37.61803547730279 + ], + [ + 4.198635990652776, + -0.8686216901584203, + 35.448520633679294 + ], + [ + 3.6240765715588346, + -5.420951908229057, + 34.70106048345493 + ], + [ + 3.7930117032261506, + -2.5967725864243363, + 33.82712042075659 + ], + [ + 5.696984904273943, + -4.364635856538371, + 35.158154401857246 + ], + [ + 5.9429842790497895, + -2.5974865373490843, + 34.849140587781626 + ], + [ + 3.660382377109638, + -3.6900519399274003, + 36.57083368302753 + ], + [ + 5.259755349598992, + -3.3493176415797166, + 37.23608366502879 + ], + [ + 3.6334378486008596, + -1.7113317812586928, + 38.434478486818605 + ], + [ + 3.5943634041360992, + -0.1333581156730279, + 37.77412044828635 + ], + [ + 4.957185432827642, + -4.735449361979647, + 31.761963072078853 + ], + [ + 5.763060635881743, + -5.047713818422949, + 30.554520817303782 + ], + [ + 4.963393048780927, + -4.851480143343082, + 29.260747329051902 + ], + [ + 5.387658662289757, + -5.282948843254246, + 28.17644416727971 + ], + [ + 6.235755573616856, + -6.484882786044153, + 30.76993228272192 + ], + [ + 7.51427721854523, + -6.835112885349417, + 30.012028945299413 + ], + [ + 8.129907890163881, + -8.113581040443592, + 30.65623709854694 + ], + [ + 8.165553614279245, + -9.177127918417227, + 30.01245984829437 + ], + [ + 8.503827732750253, + -8.073370325337805, + 31.815036211775112 + ], + [ + 4.1781996557104435, + -5.366057101624818, + 31.886925423565206 + ], + [ + 6.654592708272326, + -4.420764613852668, + 30.54016914709801 + ], + [ + 6.353953783014337, + -6.674222415189831, + 31.83683369900565 + ], + [ + 5.394815084508468, + -7.037836704091205, + 30.35140997985816 + ], + [ + 7.2200935440459375, + -6.953276348759175, + 28.969147832915475 + ], + [ + 8.171359419595198, + -5.984093139143312, + 30.19121943954331 + ], + [ + 3.767540225546623, + -4.2068872387401655, + 29.41124094955153 + ], + [ + 2.953798891487022, + -4.054737447898702, + 28.147825304966698 + ], + [ + 3.2931184713123685, + -2.929407571042759, + 27.233765130521885 + ], + [ + 3.773045611907803, + -1.9241564738789805, + 27.720264767183806 + ], + [ + 1.408316792388972, + -3.982369087533044, + 28.490006691499048 + ], + [ + 0.9000334775810116, + -5.109506963642531, + 29.82069733554342 + ], + [ + 3.5501627207382547, + -3.7621073248125185, + 30.291590234684072 + ], + [ + 3.1195836696749595, + -4.930875232514978, + 27.520928424108273 + ], + [ + 1.2197447923031328, + -2.950018879606276, + 28.78460945981489 + ], + [ + 0.8726860109742489, + -4.271558431551995, + 27.58580885696081 + ], + [ + 2.868401193301723, + -3.062573955087629, + 25.99183005790115 + ], + [ + 3.1175965319732577, + -2.126919707238642, + 24.859903058806744 + ], + [ + 1.9513351547302757, + -2.0594869545913497, + 23.858654739729023 + ], + [ + 1.235622647292273, + -3.054471909652179, + 23.585804195448688 + ], + [ + 4.463275607260832, + -2.406570518610337, + 24.179252366395612 + ], + [ + 5.6000637786656275, + -1.8478287005138725, + 25.05728822245571 + ], + [ + 6.856350125086148, + -2.322369187520323, + 24.25262432537879 + ], + [ + 5.5328426175182885, + -0.3149422358255496, + 25.212756582007103 + ], + [ + 2.4016892564420753, + -3.9311281330788006, + 25.77299079198408 + ], + [ + 3.115134605715026, + -1.1518448902991096, + 25.34705988833399 + ], + [ + 4.5452378006473495, + -3.4779142714137095, + 23.995937753619444 + ], + [ + 4.653890123290666, + -1.8844534658806538, + 23.241618380892415 + ], + [ + 5.591244313383838, + -2.4209847565616656, + 25.984388743177625 + ], + [ + 7.778370410599652, + -2.1005759132369803, + 24.79001332180555 + ], + [ + 6.715975627431098, + -3.362607001946685, + 23.958856693392857 + ], + [ + 6.912889374053841, + -1.7294722615740312, + 23.339730234867147 + ], + [ + 6.4824043354788845, + 0.16641700446324847, + 25.446696715557156 + ], + [ + 5.047346982693507, + 0.08758652481434304, + 24.323734513653946 + ], + [ + 4.859652643308621, + -0.2057644028522958, + 26.063047767801915 + ], + [ + 1.8166401000967007, + -0.9223169850627713, + 23.107885054655213 + ], + [ + 1.0361890969453391, + -0.8124091767811414, + 21.80566045087471 + ], + [ + 2.0201650864310556, + -0.8851190492009238, + 20.59713017829254 + ], + [ + 3.2337267242886827, + -0.7864580167637172, + 20.700799151303055 + ], + [ + 0.2841886443536556, + 0.5721125442834989, + 21.69801715059512 + ], + [ + -0.6787451350889483, + 0.6551740221855802, + 22.951103891214167 + ], + [ + -1.4065192795271455, + 2.025357993072191, + 23.168082505258326 + ], + [ + -1.8076421441053916, + -0.482326727694236, + 22.963148473113712 + ], + [ + 2.462818118083196, + -0.1713865999724602, + 23.30450227826325 + ], + [ + 0.30924540920649224, + -1.6192289900162677, + 21.712417239341207 + ], + [ + 1.0422068822154613, + 1.35274763662202, + 21.762182520261522 + ], + [ + -0.14722795879167727, + 0.7438888636072534, + 20.711877471524325 + ], + [ + -0.145975352117374, + 0.6163293065158229, + 23.901233428569853 + ], + [ + -1.869616154778782, + 1.9363043713025831, + 24.150789635864957 + ], + [ + -0.7706421448618038, + 2.902453826073412, + 23.28834931629966 + ], + [ + -2.23545134466251, + 2.2522137042898294, + 22.497631296185546 + ], + [ + -1.4101358907568549, + -1.4889885559828926, + 23.092451860990277 + ], + [ + -2.5662199917909647, + -0.2898299779007978, + 23.721832282186142 + ], + [ + -2.351159381179732, + -0.5080485219526985, + 22.018672790374378 + ], + [ + 1.485920050777166, + -1.0449723490570122, + 19.43578200518383 + ], + [ + 2.2538918326267345, + -1.062933122129472, + 18.190737413262354 + ], + [ + 2.842722118838446, + 0.32555759729651434, + 17.798134952336678 + ], + [ + 3.945096097952527, + 0.388877034568873, + 17.283665650373468 + ], + [ + 1.3294192857639107, + -1.6863421330394175, + 17.037298737622802 + ], + [ + 1.9694426338106161, + -1.719890021627748, + 15.68514004985749 + ], + [ + 3.187485712375486, + -2.6372012526596507, + 15.614432553709493 + ], + [ + 1.0953169814131023, + -2.189949534874472, + 14.49393513700394 + ], + [ + 0.48408568467068985, + -1.0550471741657788, + 19.308003760707344 + ], + [ + 3.0765145693488516, + -1.751199081872116, + 18.384854010172635 + ], + [ + 1.118928328935321, + -2.722378778468581, + 17.302673902058793 + ], + [ + 0.4774785138137718, + -1.017257140987411, + 16.916379380904708 + ], + [ + 2.276044969435439, + -0.7347548185978781, + 15.333566284887214 + ], + [ + 3.924492602728903, + -2.307713583814987, + 16.346798253505042 + ], + [ + 2.816614331979512, + -3.647042396708855, + 15.789862785536105 + ], + [ + 3.592664087377028, + -2.7126931239308476, + 14.605359004688415 + ], + [ + 0.6623294297532021, + -3.1761149813814313, + 14.661563617634334 + ], + [ + 0.29893337631436434, + -1.4502264256448925, + 14.412191563473476 + ], + [ + 1.7048078413013903, + -2.051846567501883, + 13.600879473035523 + ], + [ + 2.175896359846383, + 1.4259913136994626, + 18.136579281456676 + ], + [ + 2.71765564189718, + 2.8039461594265447, + 17.90754826771154 + ], + [ + 2.178086232688598, + 3.744387917494066, + 18.910001689971093 + ], + [ + 0.9717363940961032, + 3.680634187718084, + 19.110337272533982 + ], + [ + 2.4433054743168925, + 3.293323518356175, + 16.49883391308967 + ], + [ + 3.161312298642687, + 4.601275758838426, + 16.075932925961737 + ], + [ + 4.690407097840267, + 4.391062772456934, + 15.870517928729644 + ], + [ + 5.485034253747744, + 4.764784374258539, + 16.653045554582494 + ], + [ + 5.123280323602367, + 3.879446983684346, + 14.800422764218577 + ], + [ + 1.3324124266259503, + 1.2773927409040269, + 18.67188759161769 + ], + [ + 3.790087977867628, + 2.8271168815675196, + 18.101073213092565 + ], + [ + 2.636724190433894, + 2.4421057234513484, + 15.846056065009584 + ], + [ + 1.3770219990348374, + 3.466472715161899, + 16.3533682560897 + ], + [ + 2.772394972796494, + 4.905936706225816, + 15.104324355176521 + ], + [ + 2.980151534349598, + 5.377454950577601, + 16.81945649541803 + ], + [ + 2.876660906664432, + 4.565582895525921, + 19.688953106817376 + ], + [ + 4.288530562053132, + 4.639816620975097, + 19.925723285567393 + ], + [ + 4.785554440032581, + 3.53803288073928, + 20.85203083200288 + ], + [ + 4.193887962124513, + 3.411912347443973, + 21.996874878519083 + ], + [ + 4.610765640193195, + 6.0424252126211115, + 20.456677917789605 + ], + [ + 3.348849619016485, + 6.762586866512265, + 20.20561385000365 + ], + [ + 2.245943423563985, + 5.69096467479946, + 20.281352450371017 + ], + [ + 4.810356308690387, + 4.495965363292839, + 18.97962570843511 + ], + [ + 4.773383313417231, + 6.250836833892663, + 21.514136977180417 + ], + [ + 5.466838229432311, + 6.478591276446565, + 19.941899537251803 + ], + [ + 3.260113399239134, + 7.574414824021176, + 20.927530398392182 + ], + [ + 3.429996092022083, + 7.1609734337403665, + 19.194273758782977 + ], + [ + 2.044156204547805, + 5.495642218855579, + 21.334556325582877 + ], + [ + 1.39732111539913, + 6.013934687798439, + 19.67833535645802 + ], + [ + 5.7175166566644355, + 2.6794724547196154, + 20.51066901851066 + ], + [ + 5.873349277445372, + 1.3582090002208815, + 21.10791682287155 + ], + [ + 6.663433706217519, + 0.40398119906462426, + 20.17550745890659 + ], + [ + 7.762575472059406, + 0.7253832614914408, + 19.873160594811296 + ], + [ + 6.3020884967524164, + 2.8930505128825246, + 19.71520394618713 + ], + [ + 6.433988650037628, + 1.4336598958992397, + 22.03962997137254 + ], + [ + 4.87450834519445, + 1.0771693113738223, + 21.441734497093407 + ], + [ + 6.122761630889081, + -0.8105126409787857, + 19.914436033658088 + ], + [ + 6.806914023938993, + -2.004525611429216, + 19.435734985290257 + ], + [ + 7.323094091600979, + -1.846784798505837, + 17.993888916971294 + ], + [ + 8.257684975501961, + -2.5123277432397373, + 17.64328612313261 + ], + [ + 5.700354957405047, + -3.148457041580869, + 19.536964310161164 + ], + [ + 6.179950967868594, + -4.617506386283736, + 19.356334574328425 + ], + [ + 6.962498188888962, + -5.040171187390683, + 20.619427110283567 + ], + [ + 4.967359537366267, + -5.529625424337354, + 19.269826995601242 + ], + [ + 5.193162418239898, + -0.9868017389271841, + 20.267804911714716 + ], + [ + 7.688668211930977, + -2.2091750879125556, + 20.042968265964298 + ], + [ + 5.116895290752366, + -3.08086877680266, + 20.455175075566267 + ], + [ + 5.015860789710607, + -2.999146859323133, + 18.701934824649346 + ], + [ + 6.79480652237747, + -4.663628903826805, + 18.457487701057048 + ], + [ + 7.3413523533198255, + -6.059317303207962, + 20.542550682206212 + ], + [ + 7.871328207279627, + -4.438683045479195, + 20.637860597630535 + ], + [ + 6.518656019162595, + -4.887728323499488, + 21.60323003391803 + ], + [ + 4.23294030865277, + -5.26825187371233, + 20.031674896861603 + ], + [ + 4.523842841052138, + -5.511384651380496, + 18.274305864229238 + ], + [ + 5.300281623673291, + -6.555042757077672, + 19.430395154700427 + ], + [ + 6.780939319056466, + -0.9255531788486167, + 17.155136466203658 + ], + [ + 7.1665968956909465, + -0.6574769968445224, + 15.809131139685778 + ], + [ + 8.59222435583543, + -0.010742067973530334, + 15.713085820460815 + ], + [ + 9.51613504328772, + -0.6003067277651049, + 15.097117279669117 + ], + [ + 6.0739186398937, + 0.3064926783384525, + 15.169982140900327 + ], + [ + 6.434839826192243, + 0.7110598039904374, + 13.706357345863145 + ], + [ + 5.946763066974785, + 1.8061584738155432, + 13.07929572456159 + ], + [ + 7.172608940604994, + 0.00697529285186449, + 13.004589048759307 + ], + [ + 5.95964205987631, + -0.43165767544289935, + 17.473943763525142 + ], + [ + 7.186261350287547, + -1.6173897712634187, + 15.293108759685747 + ], + [ + 5.067922208863385, + -0.11311352647030137, + 15.169744935020672 + ], + [ + 6.079894763413331, + 1.2222130563686235, + 15.761185758964388 + ], + [ + 5.474777646405423, + 2.527492615027498, + 13.605608862220455 + ], + [ + 6.0969432879569245, + 1.934597445178042, + 12.088814170096782 + ], + [ + 8.867605235953747, + 1.0403825948543926, + 16.512248749605472 + ], + [ + 10.202774993091312, + 1.478582413937744, + 16.806430014046963 + ], + [ + 11.177625016001784, + 0.36693728752942967, + 17.34390179812407 + ], + [ + 12.262115507212124, + 0.20630430506841435, + 16.737614398298714 + ], + [ + 10.169810234708995, + 2.6582892439531918, + 17.77604205140885 + ], + [ + 11.55251479343692, + 3.2031483360740083, + 18.27582712666305 + ], + [ + 11.461294433872434, + 4.5878630814492, + 18.793060807795268 + ], + [ + 11.709484695033021, + 5.586501498416283, + 18.091162116253614 + ], + [ + 10.988579689948814, + 4.750264185131442, + 19.949791660860896 + ], + [ + 8.090921029322192, + 1.5634581837736974, + 16.89073836052413 + ], + [ + 10.70180383774853, + 1.776375851965355, + 15.884265286774037 + ], + [ + 9.717783044691865, + 3.447309796244298, + 17.175027650668877 + ], + [ + 9.571421418812788, + 2.522898665704659, + 18.67698688224798 + ], + [ + 12.013820411310617, + 2.5113105729279823, + 18.980562065292897 + ], + [ + 12.220208566970912, + 3.1975879481257863, + 17.41428286805447 + ], + [ + 10.684822941684612, + -0.4766132666384806, + 18.237705194836323 + ], + [ + 11.519031456880606, + -1.5246196632233335, + 18.842292661886795 + ], + [ + 12.050815903406802, + -2.593717173051658, + 17.788375461960715 + ], + [ + 13.274083318207767, + -2.8242431266564267, + 17.709441597496955 + ], + [ + 10.777218740104221, + -2.188572364711348, + 19.91697247476081 + ], + [ + 10.50804882968415, + -1.257011090782278, + 21.08659537754646 + ], + [ + 11.580387284798958, + -3.4575579871351465, + 20.419751604616426 + ], + [ + 9.741548512870596, + -1.9146897460801284, + 22.25742188323723 + ], + [ + 9.804613337073853, + -0.2541232121550081, + 18.68023069942019 + ], + [ + 12.394042181093967, + -1.041454204168062, + 19.277041301076004 + ], + [ + 9.834950283230139, + -2.6143665303799537, + 19.57210945742986 + ], + [ + 11.35882462937854, + -0.671916844541375, + 21.43580258524185 + ], + [ + 9.825731004708382, + -0.49011184643126526, + 20.71998011057715 + ], + [ + 11.814744317659704, + -4.205226751620842, + 19.66201379355472 + ], + [ + 12.55637359233338, + -3.1764388836867283, + 20.815379093643564 + ], + [ + 11.07416860782977, + -3.9987772758806557, + 21.219081661850737 + ], + [ + 9.249779687272389, + -1.2123953043244526, + 22.930508035166643 + ], + [ + 9.04576505085762, + -2.651154612752478, + 21.8554240630325 + ], + [ + 10.495403466641848, + -2.5173306680034813, + 22.764003521136996 + ], + [ + 11.15211739089798, + -3.1669879607594, + 16.878245950842178 + ], + [ + 11.593021845694388, + -3.8486469964005323, + 15.686925477608714 + ], + [ + 12.609531023873968, + -3.044948011145223, + 14.824969070988244 + ], + [ + 13.669256671793478, + -3.5305362984684905, + 14.477890945285296 + ], + [ + 10.374596630470014, + -4.349721130988797, + 14.837314976714223 + ], + [ + 9.726243433266026, + -5.622475727466281, + 15.392491416842391 + ], + [ + 10.760309061812306, + -7.003368815882709, + 15.03770211506758 + ], + [ + 10.090452626342083, + -7.910127465905532, + 13.484842727541407 + ], + [ + 10.177535920582802, + -2.9149861135822164, + 16.960624875245173 + ], + [ + 12.047302312433406, + -4.761637838972263, + 16.071860363124326 + ], + [ + 9.632695610378127, + -3.5801245706782368, + 14.624234087867144 + ], + [ + 10.825749638600326, + -4.663148904024979, + 13.895867554505156 + ], + [ + 9.725598738375032, + -5.4604800870312715, + 16.47038676964407 + ], + [ + 8.693331475883712, + -5.707379887534415, + 15.054874434361679 + ], + [ + 10.602259706104993, + -8.857929611178122, + 13.318030717908957 + ], + [ + 9.02137991239555, + -8.11416250361816, + 13.544451734190117 + ], + [ + 10.146325331239419, + -7.214443850688781, + 12.647582552558992 + ], + [ + 12.280797405708734, + -1.7819900935498794, + 14.472672590236437 + ], + [ + 13.017540842986117, + -0.9418837086917051, + 13.545422172430518 + ], + [ + 14.459000515641826, + -0.6120556497436738, + 14.01295751173293 + ], + [ + 15.347654166735737, + -0.2041763059469872, + 13.255697279899774 + ], + [ + 12.182970944453412, + 0.33966885976317407, + 13.389881924426215 + ], + [ + 11.394348573345972, + -1.4162410738225404, + 14.78974721379578 + ], + [ + 13.18645476529761, + -1.482697826872787, + 12.614246768256955 + ], + [ + 12.609405064546838, + 0.9398305388076764, + 12.586104650426844 + ], + [ + 11.150060565776103, + 0.0199232097622416, + 13.25218994283971 + ], + [ + 12.202430010036469, + 0.9798748149577889, + 14.271843677803101 + ], + [ + 14.723621692306013, + -0.8454910655618662, + 15.295462346724163 + ], + [ + 16.014750891738238, + -0.5328282190391427, + 15.99967896148468 + ], + [ + 16.649496479305096, + -1.7717030734067691, + 16.654127107938265 + ], + [ + 17.743309086337195, + -1.5790688114749827, + 17.278031574606377 + ], + [ + 15.743431507418109, + 0.5493711390384455, + 17.04435517765827 + ], + [ + 15.506942134467405, + 1.936625541901691, + 16.38597647234789 + ], + [ + 14.41953106198329, + 2.0590286133171674, + 15.717748107489918 + ], + [ + 16.24743580400436, + 2.910438017898983, + 16.462832560804042 + ], + [ + 13.962309252936656, + -1.2004734555880106, + 15.85625826154787 + ], + [ + 16.790708403370207, + -0.2459045570116043, + 15.289986329981952 + ], + [ + 14.928274791766286, + 0.2716076439607171, + 17.712533681272248 + ], + [ + 16.558280731195143, + 0.5596653299103025, + 17.76823855004225 + ], + [ + 13.72844847560982, + 1.3287686221318324, + 15.813799642157765 + ], + [ + 14.22838336039904, + 3.0283936765164867, + 15.508243379481963 + ], + [ + 16.05913115465995, + -2.9657917511430156, + 16.575616389085166 + ], + [ + 16.595696101064153, + -4.2209449890337964, + 17.13880057822146 + ], + [ + 17.77537955588602, + -4.743223017306775, + 16.325996202135663 + ], + [ + 17.596434084337318, + -4.9491476152148834, + 15.10333447984866 + ], + [ + 15.480574691090435, + -5.291875278593238, + 17.299343827006624 + ], + [ + 15.956626880677053, + -6.529633596836476, + 17.71828300441041 + ], + [ + 15.25254105464573, + -3.0452465476073343, + 15.972963018092342 + ], + [ + 17.042253565002873, + -4.085435971809773, + 18.123849121697823 + ], + [ + 14.685465535884711, + -5.02613919318398, + 17.99596483082966 + ], + [ + 14.985603597823163, + -5.5495044405202805, + 16.363003953801336 + ], + [ + 15.890294811239725, + -6.539402958656723, + 18.675941148940318 + ], + [ + 18.916199408321912, + -5.1505941661913255, + 16.960203127746986 + ], + [ + 20.05759527957716, + -5.810385113300015, + 16.34112043546265 + ], + [ + 20.219902441306647, + -7.224846968344934, + 16.92380903011313 + ], + [ + 21.17379243759312, + -7.8692260193776065, + 16.60380290480034 + ], + [ + 21.300825918887792, + -4.92404050362947, + 16.457068001822496 + ], + [ + 21.307678510660903, + -3.754147132977039, + 15.492986397199727 + ], + [ + 22.24826262490329, + -2.657550902794611, + 16.015020043842657 + ], + [ + 21.66367449478075, + -4.198352217873719, + 14.010751695942698 + ], + [ + 18.843531324441027, + -4.93440420666775, + 17.944113739643047 + ], + [ + 19.922500717728006, + -6.029220144902268, + 15.281894351663682 + ], + [ + 21.263652826657133, + -4.468301764958028, + 17.44652318477271 + ], + [ + 22.22126577616788, + -5.482652175438204, + 16.287232348808324 + ], + [ + 20.309235182588132, + -3.3173621425778492, + 15.513708364414773 + ], + [ + 21.78866472019351, + -2.052495542843701, + 16.79654244652986 + ], + [ + 23.21891435302784, + -3.072265658403353, + 16.286948102394692 + ], + [ + 22.426586792191163, + -1.9718163566409856, + 15.186726104143215 + ], + [ + 20.888485013292854, + -4.888746079176855, + 13.678276580199029 + ], + [ + 21.674058036431934, + -3.353058518084026, + 13.322659845066777 + ], + [ + 22.551607053000456, + -4.817782986523696, + 14.137156314945104 + ], + [ + 19.218822699480533, + -7.754486554554205, + 17.736967785689814 + ], + [ + 19.353753462842256, + -8.911635735346294, + 18.643543065836806 + ], + [ + 18.356065759966192, + -9.975733637482676, + 18.190078367569555 + ], + [ + 17.1572666323166, + -9.8057458052254, + 18.239751757885674 + ], + [ + 19.182798575918483, + -8.50532643968188, + 20.08152412039603 + ], + [ + 18.894158783588498, + -9.677560102051018, + 21.006344095111512 + ], + [ + 18.341294209055327, + -9.382149492307917, + 22.079542492549184 + ], + [ + 19.282328077325236, + -10.845061668812889, + 20.772527250101874 + ], + [ + 18.390439780154665, + -7.200529319848215, + 17.901322851780378 + ], + [ + 20.401331589084943, + -9.205205955605322, + 18.576494475194114 + ], + [ + 20.1383665449983, + -8.15240170734279, + 20.46938419574969 + ], + [ + 18.505532060222308, + -7.662821421667672, + 20.22149829928545 + ], + [ + 18.82140809181829, + -11.10093668512269, + 17.711581813478887 + ], + [ + 17.9585730113662, + -12.101097052680927, + 17.188947183860456 + ], + [ + 16.829329417353392, + -12.59547967783675, + 18.16629553424695 + ], + [ + 15.733075463811051, + -13.03097452242713, + 17.763431377285787 + ], + [ + 18.79892708819146, + -13.191368602547755, + 16.579998373026623 + ], + [ + 19.696425315813173, + -14.007026412133996, + 17.497222576126855 + ], + [ + 19.191573297653992, + -14.882399319017281, + 18.45919999539076 + ], + [ + 21.10219253215068, + -13.899066261584835, + 17.318904534800204 + ], + [ + 20.063073475289908, + -15.539920998770185, + 19.3971523792791 + ], + [ + 21.967044520952495, + -14.60351709269412, + 18.16829032345004 + ], + [ + 21.497877943289556, + -15.37047404433838, + 19.23322496220049 + ], + [ + 22.379824154507688, + -15.883813149472644, + 20.143871204262034 + ], + [ + 19.81801569184176, + -11.253076329626879, + 17.650516435924004 + ], + [ + 17.42096850699257, + -11.526193875403237, + 16.43491510329839 + ], + [ + 18.106637868588425, + -13.927173176809788, + 16.170818506825007 + ], + [ + 19.420521335035097, + -12.752836881162409, + 15.799350063622255 + ], + [ + 18.136093550655207, + -15.04603632462829, + 18.619146909473116 + ], + [ + 21.503711159802684, + -13.424298847842806, + 16.43585315375899 + ], + [ + 19.591339075315172, + -16.061918832036895, + 20.216533157594963 + ], + [ + 23.019282125417693, + -14.472587195530764, + 17.963223429567464 + ], + [ + 23.28324775700513, + -15.55914128351776, + 20.147595636847452 + ], + [ + 17.021683673069035, + -12.51161317587679, + 19.487773220485675 + ], + [ + 16.001019919909883, + -12.78404623413087, + 20.485053645756015 + ], + [ + 14.903796485392366, + -11.689409417773618, + 20.54462981639421 + ], + [ + 13.752774161855076, + -12.093606714309999, + 20.660429251199847 + ], + [ + 16.724232122893046, + -12.966383719826013, + 21.796695617170077 + ], + [ + 17.62186774534449, + -14.166592395035536, + 21.78077524672501 + ], + [ + 18.74950824375284, + -14.012416458689131, + 22.33102198790854 + ], + [ + 17.224423309568973, + -15.26676911154459, + 21.416173706621194 + ], + [ + 17.900609332939233, + -12.166781318245228, + 19.846494579866217 + ], + [ + 15.538248669961927, + -13.726931308262806, + 20.193661827504233 + ], + [ + 17.423438016772387, + -12.153823665058383, + 21.99407303057437 + ], + [ + 15.996864627873338, + -13.092942887086565, + 22.598580981963913 + ], + [ + 19.05158337147474, + -13.156293495077762, + 22.77363794966411 + ], + [ + 19.41214685696199, + -14.774292436821383, + 22.35449125084943 + ], + [ + 15.254088537476365, + -10.418167015793756, + 20.38170610546281 + ], + [ + 14.328486492806977, + -9.28763089718484, + 20.408092817318064 + ], + [ + 13.522678427646282, + -9.186894158287544, + 19.07891486032123 + ], + [ + 12.298458807392906, + -8.814330019422698, + 19.1647388621147 + ], + [ + 15.176578147538843, + -8.060006038172503, + 20.717399915957177 + ], + [ + 14.269423700654114, + -6.871784870208899, + 21.06879253908202 + ], + [ + 15.08833136073224, + -5.555379560045878, + 21.237287205447505 + ], + [ + 14.991174671494402, + -4.940482643182577, + 22.331906828448993 + ], + [ + 15.794048106693339, + -5.0805977072854205, + 20.298396614650507 + ], + [ + 16.25255523999997, + -10.322835933201247, + 20.263062594439813 + ], + [ + 13.593468666787413, + -9.510947878156173, + 21.181382686286636 + ], + [ + 15.816904146015114, + -8.31088671508087, + 21.563061208328 + ], + [ + 15.783010666370771, + -7.910570002308191, + 19.824085129782823 + ], + [ + 13.512410150213409, + -6.748267262668207, + 20.294338252370473 + ], + [ + 13.741319346293045, + -7.043575628551082, + 22.00671374341773 + ], + [ + 14.180001872530859, + -9.30547049957562, + 17.959215006371952 + ], + [ + 13.63290512537534, + -9.33961760742875, + 16.588401158713353 + ], + [ + 12.617373920957458, + -10.447244857447117, + 16.542499221690335 + ], + [ + 11.43920384752773, + -10.13905610663818, + 16.255721622020843 + ], + [ + 14.784784480863483, + -9.686367122805166, + 15.60949811303905 + ], + [ + 15.735720984480967, + -8.63487565448844, + 15.058497277388408 + ], + [ + 15.129520954687468, + -7.509688216598079, + 14.191292929812805 + ], + [ + 14.086989506898982, + -7.830591108499277, + 13.114562116879965 + ], + [ + 13.432580350358046, + -7.02435924624092, + 12.274535139986765 + ], + [ + 13.681246686504505, + -5.729308073603022, + 12.303296036244136 + ], + [ + 12.582198683060717, + -7.426909714188923, + 11.451196607851232 + ], + [ + 15.175334153733532, + -9.42748801017467, + 18.079737845267942 + ], + [ + 13.132053748175307, + -8.388755951224198, + 16.406444531239163 + ], + [ + 15.407711892288923, + -10.465901630232224, + 16.048116475380485 + ], + [ + 14.31675114329233, + -10.085989201718291, + 14.709861449221771 + ], + [ + 16.36071815868144, + -8.221940800583866, + 15.85030958803548 + ], + [ + 16.429757020420258, + -9.029567393973707, + 14.316451912130406 + ], + [ + 14.590143176214522, + -6.848176684833902, + 14.869210303123507 + ], + [ + 15.971484277474755, + -7.020747930658729, + 13.701252878834767 + ], + [ + 13.757124349262595, + -8.784630909733153, + 13.147693866639443 + ], + [ + 14.24554379195304, + -5.3660196382256515, + 13.058075781638143 + ], + [ + 13.309603478148746, + -5.136968025475596, + 11.574520522603823 + ], + [ + 12.409886634107483, + -8.420677108776829, + 11.504438392938185 + ], + [ + 11.986976250651038, + -6.843994832901899, + 10.880216161199286 + ], + [ + 12.973907722906, + -11.712044335257758, + 16.95516953003985 + ], + [ + 11.933008329291093, + -12.759422634540954, + 17.052886654148317 + ], + [ + 10.856166601559595, + -12.415326776605525, + 18.118789075373908 + ], + [ + 9.640848474179624, + -12.481633871180975, + 17.749033186493225 + ], + [ + 12.546551980184992, + -14.075028725521747, + 17.200573648252153 + ], + [ + 11.632577039483188, + -15.354342929047107, + 17.231168853443485 + ], + [ + 11.235820950677446, + -15.885100953819006, + 15.82403425542855 + ], + [ + 12.428686058683418, + -16.40856766452805, + 17.978420068408564 + ], + [ + 13.915919449675544, + -11.952192528792295, + 17.22910187406866 + ], + [ + 11.46489691516206, + -12.790695206995508, + 16.069019765106507 + ], + [ + 13.322650792221227, + -14.214208375376643, + 16.44797763844791 + ], + [ + 13.034999776800646, + -14.052218198354012, + 18.174735955415727 + ], + [ + 10.74554051549854, + -15.1932690443291, + 17.84380160785247 + ], + [ + 10.546343054620298, + -16.72201299853259, + 15.934905691008595 + ], + [ + 10.787312977946753, + -15.085844308193032, + 15.234010678817897 + ], + [ + 12.119269584178568, + -16.1849096105268, + 15.260358365076973 + ], + [ + 12.118365873712225, + -17.430488023102384, + 17.760520509288344 + ], + [ + 13.47239372017095, + -16.34015793667436, + 17.67167126839291 + ], + [ + 12.4270056563107, + -16.238727344404992, + 19.055105665314514 + ], + [ + 11.137167814126844, + -11.921653614571426, + 19.324536055898175 + ], + [ + 10.178356875254643, + -11.687780540397341, + 20.42657348625389 + ], + [ + 9.05236155795261, + -10.696135291274743, + 20.01738575862611 + ], + [ + 7.902551319630197, + -10.94343196966281, + 20.282931075915343 + ], + [ + 10.919690388369316, + -11.23115321672691, + 21.672214285463554 + ], + [ + 10.142349778722826, + -10.535330674738248, + 22.676174069650564 + ], + [ + 9.447105623729458, + -11.141581351268826, + 23.714192819932045 + ], + [ + 9.793039377762462, + -9.129286377193637, + 22.7443698977427 + ], + [ + 8.9283778629706, + -8.889274768968562, + 23.845667421581144 + ], + [ + 10.055883282134031, + -8.007788303633731, + 21.908438084795804 + ], + [ + 8.830387753328408, + -10.131742158438328, + 24.45148654712708 + ], + [ + 8.332918894688365, + -7.6683909803438155, + 24.032642536559965 + ], + [ + 9.534601837247756, + -6.694789821332449, + 22.143396001963712 + ], + [ + 8.69202032054719, + -6.550241978571933, + 23.267628934174816 + ], + [ + 12.096692097774097, + -11.880233143867542, + 19.6371103221194 + ], + [ + 9.615157952718256, + -12.54146760257538, + 20.803569294979237 + ], + [ + 11.429378435122356, + -12.053196974896139, + 22.174771750166084 + ], + [ + 11.727769611751638, + -10.532492041763874, + 21.45546504079695 + ], + [ + 9.321472974402514, + -12.19183184448815, + 23.932340683705316 + ], + [ + 8.362218590956932, + -10.266743078311151, + 25.336183183843424 + ], + [ + 10.765136459228298, + -8.093940072942871, + 21.09853868461988 + ], + [ + 7.594735381432735, + -7.494260320528667, + 24.801514829142164 + ], + [ + 9.705434088005314, + -5.781440735006186, + 21.59292905988903 + ], + [ + 8.088693282502303, + -5.654531128865926, + 23.27757233192319 + ], + [ + 9.36746300249248, + -9.584808530588646, + 19.300774870186086 + ], + [ + 8.432470148985361, + -8.673529297066352, + 18.737025640559402 + ], + [ + 7.610317164746373, + -9.232191310317717, + 17.62520723311658 + ], + [ + 6.40043783779327, + -8.9462245991146, + 17.53054819063213 + ], + [ + 9.021695949271749, + -7.312096883542154, + 18.38709087050034 + ], + [ + 10.33879527015124, + -9.396186559683258, + 19.098203976287685 + ], + [ + 7.724224569118177, + -8.426935837900146, + 19.528027870748392 + ], + [ + 9.853817366596113, + -7.375399881796909, + 17.68590088248742 + ], + [ + 8.257861674217285, + -6.599120007172473, + 18.076740952075006 + ], + [ + 9.442061791579258, + -6.876067405026163, + 19.293335141837872 + ], + [ + 8.274611967788045, + -9.933063606319081, + 16.723302436347172 + ], + [ + 7.5080577921783975, + -10.52239877763833, + 15.618177488465964 + ], + [ + 6.474016151274484, + -11.562422543372577, + 16.107034352904947 + ], + [ + 5.312064231859129, + -11.444554104231258, + 15.743469280353317 + ], + [ + 8.605591044965466, + -11.14998876243186, + 14.783176056568019 + ], + [ + 8.282251528738506, + -11.912858301129518, + 13.58695259792458 + ], + [ + 8.39578432963734, + -11.511835247185047, + 12.307040518495564 + ], + [ + 7.879235215149378, + -13.308738310187664, + 13.448525416635208 + ], + [ + 7.6613129898801295, + -13.656059922888858, + 12.058640356638838 + ], + [ + 7.793053864182601, + -14.326868621546282, + 14.441914323065028 + ], + [ + 8.022606800021094, + -12.470934168281417, + 11.425870208826856 + ], + [ + 7.397691734713737, + -14.972767281707661, + 11.693316088741351 + ], + [ + 7.573537175316249, + -15.632229253342416, + 14.016092906989037 + ], + [ + 7.256319772616372, + -15.993938372298658, + 12.672715540077647 + ], + [ + 9.274972919516166, + -9.918319417284465, + 16.584881375953753 + ], + [ + 7.071772253452651, + -9.723496473329476, + 15.018586695774296 + ], + [ + 9.325023275506572, + -10.38443746874384, + 14.492577087244722 + ], + [ + 9.193684512529936, + -11.836499308265104, + 15.39223258990065 + ], + [ + 8.72194372941664, + -10.514224732232606, + 12.052495394992365 + ], + [ + 7.899921961145821, + -12.318895987149972, + 10.434945348367663 + ], + [ + 8.0885159762521, + -14.196435114421888, + 15.47249026920539 + ], + [ + 7.402432431437075, + -15.18143217116733, + 10.633675559532156 + ], + [ + 7.623706965573096, + -16.359037928879502, + 14.813360900086062 + ], + [ + 7.34109718202549, + -17.034456186609418, + 12.39607257411893 + ], + [ + 6.85584903245503, + -12.39973810011469, + 17.043663059285798 + ], + [ + 6.0537628089337545, + -13.452390153318106, + 17.684394973385263 + ], + [ + 4.924344698965462, + -12.92683563859299, + 18.46464521422962 + ], + [ + 3.7581254968270827, + -13.240612679777655, + 18.120910786691343 + ], + [ + 7.009586473991451, + -14.242905339138474, + 18.57660142706834 + ], + [ + 6.493889616213386, + -15.567992011570936, + 19.0618992583894 + ], + [ + 7.2360559817451735, + -16.068651317062177, + 20.338722135313553 + ], + [ + 7.152262022050926, + -15.498169601373661, + 21.417627424696846 + ], + [ + 7.941583183936077, + -17.112959178588653, + 20.286905586149434 + ], + [ + 7.79919458908325, + -12.331941835422356, + 17.39806833218105 + ], + [ + 5.642854143998978, + -14.028099574165367, + 16.855053700379763 + ], + [ + 7.948804836254478, + -14.485621336490908, + 18.079549504276795 + ], + [ + 7.35255838976915, + -13.710669071074449, + 19.46384082738117 + ], + [ + 5.457639890140065, + -15.467838296823174, + 19.384790092826943 + ], + [ + 6.588275583382552, + -16.29540478441959, + 18.2556369847897 + ], + [ + 5.103679187449714, + -11.978181200989354, + 19.422005159908696 + ], + [ + 4.020410518412606, + -11.407194509899568, + 20.26524073659921 + ], + [ + 2.905102829189483, + -10.71668786815519, + 19.549894318800867 + ], + [ + 1.6666414969443786, + -10.85044156903075, + 19.863848590625512 + ], + [ + 4.545968469365302, + -10.400993169225671, + 21.349787343825525 + ], + [ + 5.168376318609761, + -9.223370240788881, + 20.92225027092633 + ], + [ + 6.031662398442576, + -11.771116310869104, + 19.76269726231779 + ], + [ + 3.5852704695538335, + -12.25716176873533, + 20.790888185508585 + ], + [ + 3.76567258790828, + -10.288531166876624, + 22.102511354928243 + ], + [ + 5.292744392868624, + -10.887069846591203, + 21.977603658593498 + ], + [ + 6.0411373119392895, + -9.061867868442903, + 21.288047538107573 + ], + [ + 3.325983381076171, + -9.990377143632031, + 18.46295149790219 + ], + [ + 2.3141320405313595, + -9.315072837074581, + 17.678834763175466 + ], + [ + 1.4519619346533434, + -10.305151647819514, + 16.891663266695115 + ], + [ + 0.2606276875657362, + -10.209274223989155, + 16.854566744529013 + ], + [ + 2.9047042055789207, + -8.269591122374209, + 16.79066647298754 + ], + [ + 1.9634235446505395, + -7.290240892565691, + 16.159874926876128 + ], + [ + 1.9527265439138592, + -6.898927883392787, + 14.847037208359017 + ], + [ + 0.9544792135320866, + -6.432631100299886, + 16.75811390601241 + ], + [ + 0.29033984421492287, + -5.66240975975947, + 15.765700652569901 + ], + [ + 0.38045024799004395, + -6.334408311584184, + 18.03451691202566 + ], + [ + 0.9256509985317419, + -6.011685713117203, + 14.62924998731452 + ], + [ + -0.7436368915362597, + -4.800382018098162, + 16.032618013300265 + ], + [ + -0.6353489433028318, + -5.35300696067128, + 18.336748203383156 + ], + [ + -1.1779234602784265, + -4.5840070830412, + 17.305599350916676 + ], + [ + 4.314100815277268, + -9.838055645544387, + 18.319702336462623 + ], + [ + 1.6211378531655518, + -8.858724927922935, + 18.385664530475985 + ], + [ + 3.5524806733140917, + -7.66944932137028, + 17.42966244730418 + ], + [ + 3.596783168487094, + -8.655429792343853, + 16.042166475946644 + ], + [ + 2.558959896240071, + -7.4504944849394406, + 14.143719642684973 + ], + [ + 0.8825628807055864, + -5.507636360245101, + 13.755077450030283 + ], + [ + 0.8846504989743613, + -6.924040068146837, + 18.78586255677642 + ], + [ + -1.2599639345749902, + -4.314288560251754, + 15.21805132653631 + ], + [ + -0.9163357280116642, + -5.052744450492327, + 19.3353897414576 + ], + [ + -1.9979961466727374, + -3.930181011518613, + 17.563263251803566 + ], + [ + 2.0582575740321216, + -11.428599379111063, + 16.448666399027005 + ], + [ + 1.319737762931787, + -12.476493580620286, + 15.655828560544927 + ], + [ + 0.4600359872841863, + -13.331285032586266, + 16.59495800385326 + ], + [ + -0.6854288312317142, + -13.670854843609845, + 16.181129556693985 + ], + [ + 2.3711955414623027, + -13.354629413192129, + 15.004705309598593 + ], + [ + 2.8709092365385467, + -12.69461407593218, + 13.67958736697346 + ], + [ + 4.2567758181747894, + -13.116593218785624, + 13.176152605861084 + ], + [ + 4.714417315051402, + -12.185739359198635, + 12.059587932985908 + ], + [ + 5.0530289842305365, + -10.947830797114989, + 12.120901399735516 + ], + [ + 5.488273635071425, + -10.318524520347125, + 11.060389791048882 + ], + [ + 5.116221881721555, + -10.258690008465237, + 13.21012394154012 + ], + [ + 3.0663713073597076, + -11.470975946981184, + 16.403830472885364 + ], + [ + 0.7172239796965743, + -12.052759121418376, + 14.852382265926815 + ], + [ + 3.1460344541053304, + -13.527262317528084, + 15.75164741391469 + ], + [ + 1.763247567354936, + -14.249701824137333, + 14.87300279552653 + ], + [ + 2.1097265346057075, + -12.803133055518913, + 12.906978162995763 + ], + [ + 2.9669637501705264, + -11.6236314937114, + 13.858100412990837 + ], + [ + 5.023009639710796, + -13.00459560648875, + 13.943253128813438 + ], + [ + 4.293559100114658, + -14.14462323337409, + 12.815738358967321 + ], + [ + 4.710750611869476, + -12.543517943192285, + 11.115088826539141 + ], + [ + 5.490689681473883, + -10.946355675772793, + 10.269236974292957 + ], + [ + 5.852360047776708, + -9.376470665384204, + 11.05173334728568 + ], + [ + 4.905362296653632, + -10.724834596499022, + 14.080956001842178 + ], + [ + 5.6445189645943215, + -9.399509094896871, + 13.157108488145496 + ], + [ + 0.9176489398239343, + -13.589837120961533, + 17.86123493576732 + ], + [ + 0.1993219488934546, + -14.304585703916814, + 18.98011999987706 + ], + [ + -0.9743523289713695, + -13.574567663851099, + 19.659826275229445 + ], + [ + -1.7569310733631274, + -14.2959300977343, + 20.22428269329131 + ], + [ + 1.3263333432299653, + -14.70684739149624, + 19.939250108792923 + ], + [ + 2.3966438953450093, + -15.596643707058774, + 19.57608615327851 + ], + [ + 1.907246469235104, + -13.41447094946136, + 17.961451038591516 + ], + [ + -0.2910030982367095, + -15.198726212807742, + 18.595150853479993 + ], + [ + 1.7370231565339505, + -13.83374102026255, + 20.446312477475253 + ], + [ + 0.9073357923684231, + -15.133975410272683, + 20.850350647667014 + ], + [ + 3.07802816046876, + -15.081086456498838, + 19.138457403590607 + ], + [ + -1.1053076933597823, + -12.231724120701017, + 19.549807145727755 + ], + [ + -2.281481503824912, + -11.540820991315456, + 19.97618903968264 + ], + [ + -3.2551981929120455, + -11.303352991796316, + 18.938687061187267 + ], + [ + -4.296307572017636, + -11.895647771649749, + 18.9646211706589 + ], + [ + -1.8570562073608161, + -10.35824743077626, + 20.84577378115049 + ], + [ + -0.9368688666806516, + -10.53407643135364, + 22.028719601681978 + ], + [ + -1.4682363845629873, + -11.429644451850322, + 23.128101844307032 + ], + [ + -0.7111669316541896, + -11.553852790813153, + 24.093834881342634 + ], + [ + -2.6000916813830823, + -11.96947876555788, + 23.03540810199025 + ], + [ + -0.3049860631125241, + -11.710792433335598, + 19.220844101839482 + ], + [ + -2.8231011334490943, + -12.19249369787343, + 20.661808320971172 + ], + [ + -1.3022285861001626, + -9.668024886475564, + 20.210274281784983 + ], + [ + -2.7556894311237166, + -9.910552786344681, + 21.270187284173453 + ], + [ + -0.040751888536993144, + -11.066418065227822, + 21.709831132072356 + ], + [ + -0.4896369237585799, + -9.639294361751979, + 22.46166843744268 + ], + [ + -2.942654583419564, + -10.424550622914296, + 18.023847972181247 + ], + [ + -3.8580241959691093, + -9.904634349763796, + 17.048307319061326 + ], + [ + -3.9942242660767255, + -10.81568333947871, + 15.842831960095637 + ], + [ + -5.087846820493682, + -11.060148409279748, + 15.430647213151548 + ], + [ + -3.6276763043348366, + -8.436720028982563, + 16.603217087125927 + ], + [ + -4.008536700786917, + -7.563974242965855, + 17.762411123621547 + ], + [ + -2.2210054904175403, + -8.172421211272592, + 15.969245763633905 + ], + [ + -1.9587931530666374, + -10.197984472552719, + 17.99586276009412 + ], + [ + -4.873465724115171, + -9.955428475134227, + 17.441242227829804 + ], + [ + -4.365814947715281, + -8.154572243032021, + 15.852455270678508 + ], + [ + -3.258133104056192, + -7.6183578302689625, + 18.551104621233428 + ], + [ + -4.011672389081197, + -6.506557313680901, + 17.497910113569475 + ], + [ + -5.015736663009956, + -7.7253681275517465, + 18.146601455108705 + ], + [ + -1.4495317355685335, + -8.498016393919443, + 16.667040578001238 + ], + [ + -2.0576023909192878, + -8.768598916352175, + 15.071488494665587 + ], + [ + -2.069515679850732, + -7.137848370117126, + 15.661334034036859 + ], + [ + -2.855582351586363, + -11.38696349386197, + 15.357863550155292 + ], + [ + -2.967991195773424, + -12.512996980183516, + 14.313295059943647 + ], + [ + -3.802205397767331, + -13.675094451615564, + 14.765726570168942 + ], + [ + -4.563120555537928, + -14.208493646028728, + 13.953933791173027 + ], + [ + -2.029230305213895, + -11.351188289120046, + 15.937484736580783 + ], + [ + -3.3891976831879744, + -12.153133714123726, + 13.374580913600353 + ], + [ + -1.9893244480408372, + -12.908199938969915, + 14.041036024894186 + ], + [ + -3.78232480439064, + -13.889918948288255, + 16.067959016655912 + ], + [ + -4.6099454548897745, + -14.962496066436074, + 16.63430110979677 + ], + [ + -6.020758168406192, + -14.595643534969213, + 16.988644033524768 + ], + [ + -6.789928515271415, + -15.486791654851686, + 16.851237723805262 + ], + [ + -3.87927293397384, + -15.52007476306153, + 17.886471512084587 + ], + [ + -4.527458713412429, + -16.83521958594008, + 18.352859698032866 + ], + [ + -3.6393809769323315, + -17.5551646545548, + 19.434796414723234 + ], + [ + -4.386583696376136, + -18.800427750187396, + 19.891362947463467 + ], + [ + -3.6114389612541236, + -19.853981266433266, + 20.52582279524886 + ], + [ + -3.114990879717105, + -13.310947089763545, + 16.557404223518777 + ], + [ + -4.792739465225492, + -15.764329881729736, + 15.918937545744615 + ], + [ + -2.816842538643311, + -15.582338932476887, + 17.650964053403197 + ], + [ + -3.966957245365629, + -14.792763453585621, + 18.693581394801935 + ], + [ + -5.506222425123682, + -16.593544758889493, + 18.76724551038685 + ], + [ + -4.628014723227516, + -17.447554162397864, + 17.456738343072427 + ], + [ + -2.702344074541206, + -17.832876149654, + 18.952158536386204 + ], + [ + -3.404474974320658, + -16.935999251648923, + 20.300564605312463 + ], + [ + -5.212745722585984, + -18.45818711099821, + 20.51460251618162 + ], + [ + -4.890825402811223, + -19.285229111006288, + 19.05541094558598 + ], + [ + -2.6807825472499793, + -20.089090632779858, + 20.211656260407032 + ], + [ + -3.3196701340871853, + -19.483346492625515, + 21.41890961708364 + ], + [ + -4.136121216286328, + -20.714019155257574, + 20.597557460306653 + ], + [ + -6.306140778181273, + -13.35782472894607, + 17.343431747852616 + ], + [ + -7.6626955682038265, + -12.920446568060072, + 17.757464787823753 + ], + [ + -8.467162005883234, + -12.415706874009572, + 16.55066568941226 + ], + [ + -9.695704712731358, + -12.48781221009358, + 16.557349841066745 + ], + [ + -7.463134372068691, + -11.763765679757569, + 18.77859367280746 + ], + [ + -7.030629527058995, + -12.3990856125792, + 20.128712148648592 + ], + [ + -6.443912970443801, + -11.3500526798328, + 21.131138980355544 + ], + [ + -5.547780630420169, + -11.708698385419666, + 21.987366505795304 + ], + [ + -6.869179610932177, + -10.232696653343282, + 21.24581441495318 + ], + [ + -5.588676541895616, + -12.6576002375553, + 17.466032220632062 + ], + [ + -8.37098478092298, + -13.6599342627527, + 18.131076404174646 + ], + [ + -6.6860623523573475, + -11.105363610124243, + 18.39030577037072 + ], + [ + -8.408614605390792, + -11.256329401454536, + 18.970098783621243 + ], + [ + -7.837993049302231, + -13.019830722149948, + 20.517217026283557 + ], + [ + -6.123656205028162, + -12.901752331875798, + 19.792813733070567 + ], + [ + -5.138794973972518, + -12.625349714284994, + 22.09952882314179 + ], + [ + -5.177282107307387, + -10.971866689630474, + 22.570384363027095 + ], + [ + -7.831904547765154, + -11.942780630239099, + 15.504675048432956 + ], + [ + -8.547818419344155, + -11.667115573319393, + 14.247957537748972 + ], + [ + -8.951879809447407, + -13.01299599326444, + 13.596809395271721 + ], + [ + -9.889034538236178, + -13.095721422524775, + 12.742164719532854 + ], + [ + -7.597432923490129, + -10.832839234834694, + 13.39869185915006 + ], + [ + -7.3567205521529235, + -9.31429000812949, + 13.89019440859516 + ], + [ + -6.224361654048142, + -8.665002471318473, + 13.17363501680191 + ], + [ + -8.605544296643506, + -8.453840021914345, + 13.558451343023881 + ], + [ + -6.8269293480882025, + -12.006865676951463, + 15.582244536255336 + ], + [ + -9.386335194669979, + -11.026727935272959, + 14.521621433423677 + ], + [ + -6.624605972516823, + -11.30364333313986, + 13.257092676154858 + ], + [ + -7.979909249608798, + -10.882850531260033, + 12.379226933100757 + ], + [ + -7.253643915610205, + -9.263592663206907, + 14.974124490943836 + ], + [ + -5.281693904665788, + -9.208253759225045, + 13.239623655025396 + ], + [ + -6.417508504380283, + -8.622006196387133, + 12.101747075664553 + ], + [ + -6.055456042421991, + -7.675088343432378, + 13.597477132622803 + ], + [ + -8.578161751061003, + -7.430519468796149, + 13.932835532770559 + ], + [ + -8.82799728004902, + -8.426323155226271, + 12.491746621216398 + ], + [ + -9.392569107574412, + -8.915668514169113, + 14.154614273430406 + ], + [ + -8.322680375252586, + -14.12841875225945, + 14.01755304769364 + ], + [ + -8.478721580400434, + -15.403713445249196, + 13.274298002487974 + ], + [ + -9.92893129530139, + -15.772253390653532, + 12.982355958617811 + ], + [ + -10.236214666887935, + -15.954278681355618, + 11.7911385205967 + ], + [ + -7.530949784631982, + -16.589278614309364, + 13.70082661727203 + ], + [ + -7.736266287620836, + -17.849847069476596, + 12.879783508131418 + ], + [ + -7.2025588217425245, + -17.570494989688882, + 11.435803580952964 + ], + [ + -7.432018935076973, + -18.691225063565867, + 10.480938863468625 + ], + [ + -6.541993107111879, + -19.34134460003338, + 9.767551440196439 + ], + [ + -6.937292774354066, + -20.294908303902844, + 8.934207843214189 + ], + [ + -5.275007111022633, + -19.1108213781348, + 9.793262973878955 + ], + [ + -7.73049564864917, + -14.06861624036435, + 14.833543316448223 + ], + [ + -8.173454228172856, + -14.954246313744534, + 12.329370359623468 + ], + [ + -6.502686820426615, + -16.246266853487327, + 13.586300946078552 + ], + [ + -7.762122345782699, + -16.938075348352754, + 14.70730583684101 + ], + [ + -7.080045624338154, + -18.593753103808467, + 13.331534349843144 + ], + [ + -8.780320467606535, + -18.155933967494775, + 12.94581983256693 + ], + [ + -7.5451827512574, + -16.63044620706887, + 11.003354172405587 + ], + [ + -6.119564933808882, + -17.485707512499403, + 11.525443297776695 + ], + [ + -8.357041742171448, + -19.095338067454122, + 10.447392008588016 + ], + [ + -7.9450714757249665, + -20.354584376825755, + 8.96457899928622 + ], + [ + -6.230734201439739, + -20.76324137883796, + 8.38508259610008 + ], + [ + -4.825997388392273, + -18.538494590037317, + 10.493929176540863 + ], + [ + -4.80508452658908, + -19.729911854242346, + 9.1482821735175 + ], + [ + -10.808887215625607, + -15.892218999660713, + 13.971527886615869 + ], + [ + -12.055731530364204, + -16.535069075714887, + 13.674187213929356 + ], + [ + -13.007959897011085, + -15.51702461797936, + 12.960527408135446 + ], + [ + -13.774792718801818, + -15.945431075252372, + 12.056658175018937 + ], + [ + -12.66141944576771, + -16.92782286478075, + 15.014007972702432 + ], + [ + -12.074181530828962, + -15.78190177691397, + 15.928339617010558 + ], + [ + -10.655651790214824, + -15.580699908763336, + 15.425753997611437 + ], + [ + -11.986703586495876, + -17.461298546967214, + 13.103719584484997 + ], + [ + -13.75055382772827, + -16.896617414249704, + 15.044245664998542 + ], + [ + -12.330625362656345, + -17.8992753417524, + 15.381363166112186 + ], + [ + -12.56168188954923, + -14.825764025326748, + 15.737966211709324 + ], + [ + -12.151992213890242, + -16.00072705242269, + 16.993310117118902 + ], + [ + -10.226351749222953, + -14.594596120767505, + 15.602946447951728 + ], + [ + -10.020003214311803, + -16.346962226548044, + 15.86948142987805 + ], + [ + -12.684735929938272, + -14.263986306044671, + 13.029499018076027 + ], + [ + -13.35363407368149, + -13.224973271600447, + 12.321795098960846 + ], + [ + -13.00534700761232, + -13.097180934117318, + 10.846339687312222 + ], + [ + -13.902313676876055, + -12.895875261131494, + 10.031590395564084 + ], + [ + -13.141916015549791, + -11.922154687535283, + 13.088087009067396 + ], + [ + -13.926799214154917, + -11.783614256928672, + 14.364717144392483 + ], + [ + -13.145041171576791, + -10.807600611108455, + 15.235542854367246 + ], + [ + -15.297781716792699, + -11.197161425882825, + 14.077051346232528 + ], + [ + -11.753790770738924, + -14.033210206201716, + 13.346013958569356 + ], + [ + -14.406912839585837, + -13.47329316907826, + 12.452332467815115 + ], + [ + -12.091158212524158, + -11.82867648222657, + 13.362440016512634 + ], + [ + -13.441037904158234, + -11.115703508294303, + 12.418562190142849 + ], + [ + -13.969341956226616, + -12.705920998093234, + 14.944062118108807 + ], + [ + -13.650495813992872, + -10.518433901226501, + 16.156953605355977 + ], + [ + -12.18932953338946, + -11.241594578269712, + 15.529421344376917 + ], + [ + -13.079349950848961, + -9.890703428686095, + 14.649810370317574 + ], + [ + -15.216517423524271, + -10.357079821502225, + 13.387298615123076 + ], + [ + -15.984762066338618, + -11.85614495869072, + 13.546110746223642 + ], + [ + -15.775728860305895, + -10.88235960463345, + 15.004718482559193 + ], + [ + -11.739939519689884, + -13.234440584764911, + 10.424558738966462 + ], + [ + -11.319485432427228, + -13.458954053047137, + 9.099196545887793 + ], + [ + -11.936109469302872, + -14.767424146974122, + 8.4199297885295 + ], + [ + -12.301765521307084, + -14.663471019160852, + 7.239888140823395 + ], + [ + -9.736672419221362, + -13.566967276745117, + 9.148414802565222 + ], + [ + -8.997800571341902, + -13.008152287947155, + 7.9113725248636175 + ], + [ + -8.869484631864804, + -11.61596944809429, + 7.677816262144372 + ], + [ + -8.60215812854338, + -13.92949434658317, + 6.899244965713072 + ], + [ + -8.141019797593604, + -11.143054911636057, + 6.525901758384412 + ], + [ + -7.925979709200627, + -13.48980984518596, + 5.8027423452526445 + ], + [ + -7.69937463939214, + -12.100006711667675, + 5.629435419319979 + ], + [ + -7.009697692167411, + -11.618859593242519, + 4.512165585518948 + ], + [ + -11.016597758315557, + -13.383254572105557, + 11.113565258655795 + ], + [ + -11.61236186516642, + -12.586714803406664, + 8.514800274033956 + ], + [ + -9.37235183251164, + -12.992601074855486, + 10.000159970855142 + ], + [ + -9.428499980212973, + -14.60589133561632, + 9.265749420210582 + ], + [ + -9.322773865031849, + -10.894626526398156, + 8.3415872934538 + ], + [ + -8.758541984136466, + -14.987029909965486, + 7.0527388090617515 + ], + [ + -7.987043746181868, + -10.08158022792884, + 6.39955522083384 + ], + [ + -7.515575923432775, + -14.188762922467504, + 5.088998262300418 + ], + [ + -6.704331907076001, + -12.380565425103555, + 4.014015957475407 + ], + [ + -12.145706176745097, + -15.880987784785475, + 9.097965859113378 + ], + [ + -12.810291962980486, + -17.01642224283546, + 8.562027037113078 + ], + [ + -14.321291547367974, + -16.842882412044673, + 8.286585258075627 + ], + [ + -14.996207109368132, + -17.661328122918917, + 7.655518266823814 + ], + [ + -12.559543874695365, + -18.264785434749115, + 9.375326257133914 + ], + [ + -11.060667586034532, + -18.654771615201525, + 9.448027056696056 + ], + [ + -10.736741763269544, + -20.016975150358576, + 10.033225689741856 + ], + [ + -11.589458630492114, + -20.666192443296154, + 10.711009670683293 + ], + [ + -9.583449716598512, + -20.48080481251884, + 9.851208173777243 + ], + [ + -11.951415524238698, + -15.894426218261628, + 10.089011685944005 + ], + [ + -12.434720587407918, + -17.260628971279743, + 7.5683431489436845 + ], + [ + -12.962424497243713, + -18.15358782212195, + 10.382014634746849 + ], + [ + -13.097891300548374, + -19.048914671986495, + 8.842951900592752 + ], + [ + -10.660577999622364, + -18.59512676177792, + 8.435865893509064 + ], + [ + -10.534131279019286, + -17.84729175345842, + 9.956783861508022 + ], + [ + -14.910675192864543, + -15.730885993098468, + 8.72517627366552 + ], + [ + -16.30027697977218, + -15.477105805192082, + 8.472885305524354 + ], + [ + -16.42977398002884, + -14.442488476250105, + 7.435394962594699 + ], + [ + -17.009203189325866, + -14.639745760663459, + 6.377850457556376 + ], + [ + -16.96070991296806, + -15.011758875365558, + 9.77403365490414 + ], + [ + -18.491099126691005, + -15.118966635981451, + 9.662364699419092 + ], + [ + -19.133710401974472, + -14.74281069372148, + 11.050360235574706 + ], + [ + -18.671693018986893, + -14.911848672712381, + 12.183840340161616 + ], + [ + -20.348337826901094, + -14.425414532079799, + 10.946529683515433 + ], + [ + -14.393683446442141, + -15.1993396759691, + 9.410943749582234 + ], + [ + -16.840171320844746, + -16.4065508848729, + 8.291930127387838 + ], + [ + -16.599205232381145, + -15.665434312803995, + 10.567837827747558 + ], + [ + -16.58521745964179, + -14.024003575856455, + 10.04133260690794 + ], + [ + -18.92362036167986, + -14.487063677358833, + 8.886656132916697 + ], + [ + -18.805176580077116, + -16.118721150048714, + 9.362456197742937 + ], + [ + -15.61189654168353, + -13.414094754494727, + 7.580614724374696 + ], + [ + -15.378796224257558, + -12.432076818470534, + 6.571740160958239 + ], + [ + -15.142639399321753, + -13.020007112321025, + 5.135283403541455 + ], + [ + -15.756658300241979, + -12.58986407039913, + 4.187718144257314 + ], + [ + -14.30231986340059, + -11.468419069988045, + 7.06502220958644 + ], + [ + -13.47094464433283, + -10.840004890412843, + 6.016549603043158 + ], + [ + -12.285856307836676, + -11.439861032998124, + 5.570855322448286 + ], + [ + -13.791008605679032, + -9.60170764556284, + 5.480809686532292 + ], + [ + -11.404650093293101, + -10.700966508792305, + 4.746644469966645 + ], + [ + -12.95296724948033, + -8.88775047691496, + 4.591120620158611 + ], + [ + -11.74443541356972, + -9.44652331938886, + 4.254730486737456 + ], + [ + -10.781373230688267, + -8.735884003029696, + 3.549739094886626 + ], + [ + -14.980255832228584, + -13.342920539977513, + 8.365513491548947 + ], + [ + -16.29618749876065, + -11.855846031984868, + 6.451515054775674 + ], + [ + -14.783509184564885, + -10.72117879313032, + 7.69604554718666 + ], + [ + -13.662643208689243, + -12.008322847081558, + 7.7631737218621 + ], + [ + -12.024255558468466, + -12.458243441813636, + 5.817561595135713 + ], + [ + -14.675222915118129, + -9.067223573548802, + 5.795277084182547 + ], + [ + -10.43924636488353, + -11.090757567374055, + 4.459491392629084 + ], + [ + -13.173711818226346, + -7.900736640514367, + 4.212337133293627 + ], + [ + -10.989792335951718, + -7.81717218721019, + 3.3649883108472673 + ], + [ + -14.261493928749543, + -14.056688830654593, + 4.9957970289045885 + ], + [ + -13.960634696351674, + -14.580391248583396, + 3.629651651457234 + ], + [ + -15.126378563371718, + -15.135783019282485, + 2.8282343014687887 + ], + [ + -15.110787561281679, + -14.925667984080064, + 1.6398738066236083 + ], + [ + -12.738978149415942, + -15.583110054109738, + 3.7095037064801493 + ], + [ + -11.42931083302254, + -14.98267010688744, + 4.146609003497526 + ], + [ + -13.111788831376664, + -16.78776126407047, + 4.7207096018458055 + ], + [ + -13.769944449802729, + -14.366008507825882, + 5.822113948075774 + ], + [ + -13.533075914427732, + -13.706950828707136, + 3.1373214563904117 + ], + [ + -12.611113192458278, + -16.03529016010407, + 2.725996029149728 + ], + [ + -10.62885608467116, + -15.703743760402062, + 3.980983702554628 + ], + [ + -11.235272344703311, + -14.112239246744252, + 3.519876727917986 + ], + [ + -11.404236913246814, + -14.703302417350073, + 5.199900262641662 + ], + [ + -12.329112025305704, + -17.53001734786403, + 4.563951420896232 + ], + [ + -12.972328233063827, + -16.42966111923397, + 5.74071696385111 + ], + [ + -14.125179996758678, + -17.131903170767373, + 4.514068575768285 + ], + [ + -16.114630210129032, + -15.702563663328306, + 3.4818700020182307 + ], + [ + -17.33975357165424, + -16.167546885987917, + 2.8078966956174614 + ], + [ + -18.292279306914274, + -15.111325663526372, + 2.3740160897303815 + ], + [ + -18.752960488745266, + -15.029525892420452, + 1.2221102404081219 + ], + [ + -18.024231638187267, + -17.35824766268388, + 3.512722437806956 + ], + [ + -17.193293348879674, + -18.6269737730197, + 3.065719909786928 + ], + [ + -18.117741848518044, + -17.29155344631704, + 5.013801624116576 + ], + [ + -15.913866954888269, + -15.981450572576364, + 4.431614784050014 + ], + [ + -16.986954466750063, + -16.578813838142082, + 1.8621197227961725 + ], + [ + -19.020378727879795, + -17.506992967126052, + 3.0959868550286145 + ], + [ + -17.333532887493273, + -18.802378968894004, + 1.999106120047515 + ], + [ + -16.135893599149274, + -18.51001772374559, + 3.303054199491945 + ], + [ + -17.7391443818753, + -19.404685842174786, + 3.5998686251600813 + ], + [ + -17.136736207904264, + -17.249891024493536, + 5.487086847426827 + ], + [ + -18.717621472911215, + -16.40168220395617, + 5.2045227034305945 + ], + [ + -18.624298452766837, + -18.148018263445806, + 5.458735743901604 + ], + [ + -18.579874960612695, + -14.248798019632432, + 3.3609979010131084 + ], + [ + -19.53954995808187, + -13.234059706873381, + 3.2656976452692668 + ], + [ + -19.034159419294806, + -12.150268544574942, + 2.28363963979625 + ], + [ + -19.77100050989716, + -11.766637093206214, + 1.3340075594989496 + ], + [ + -19.94485246231817, + -12.73835727738441, + 4.672099402129421 + ], + [ + -20.503825039104697, + -13.671931916335893, + 5.718648498703619 + ], + [ + -20.982544909293782, + -12.773430823879437, + 6.864374056106777 + ], + [ + -21.667800307640363, + -14.410755416180791, + 5.066840460741381 + ], + [ + -18.08294012764952, + -14.430778042060524, + 4.2212519711029985 + ], + [ + -20.37635269582863, + -13.746911787818476, + 2.7915203390594012 + ], + [ + -19.049200960405933, + -12.331126226002993, + 5.141215639302566 + ], + [ + -20.72664809766066, + -12.00087699649714, + 4.490383186407545 + ], + [ + -19.747271933433378, + -14.362953679818816, + 6.090427464296462 + ], + [ + -21.127631254424276, + -13.223682345304155, + 7.846374066941913 + ], + [ + -20.335328852341327, + -11.898179673043444, + 6.920464502985269 + ], + [ + -21.91624680905738, + -12.225701098797458, + 6.736747979328828 + ], + [ + -22.349314153400353, + -14.665191213572598, + 5.878568947007912 + ], + [ + -22.242757382336343, + -13.830845411701944, + 4.344880173229974 + ], + [ + -21.309002337333045, + -15.333447718161779, + 4.610766527344749 + ], + [ + -17.738250521325295, + -11.747451930395357, + 2.325483450705819 + ], + [ + -17.052859266612767, + -10.79284783671153, + 1.4787348505620055 + ], + [ + -16.941249515460992, + -11.33768117274542, + 0.011333136920582977 + ], + [ + -17.233818418962763, + -10.692855682872676, + -0.9734832554190322 + ], + [ + -15.766163253499268, + -10.249485719582424, + 2.1574260025560066 + ], + [ + -15.195430302821512, + -9.163625484967497, + 1.3476172888745768 + ], + [ + -15.90747850466101, + -7.7652533793772704, + 1.2950418659467098 + ], + [ + -15.228927438208817, + -6.864128288004167, + 2.3565642854624014 + ], + [ + -15.673379262310343, + -5.471237546004545, + 2.207358647069755 + ], + [ + -17.205872164923743, + -12.272177567413905, + 3.0047048284822764 + ], + [ + -17.695170872009722, + -9.922548098465427, + 1.3441450425049846 + ], + [ + -16.085292129684188, + -9.82123848175587, + 3.1076154591464156 + ], + [ + -15.0525931444409, + -11.073374550160622, + 2.1685688320460224 + ], + [ + -14.230677544098619, + -8.98219336475222, + 1.821358311475599 + ], + [ + -14.955072905896616, + -9.597346281509829, + 0.376939307840232 + ], + [ + -15.85020792888285, + -7.305330057067636, + 0.30848747016379197 + ], + [ + -16.957497965300355, + -7.874993041386858, + 1.5661790729914753 + ], + [ + -15.449205951475586, + -7.260624514549306, + 3.347710049556188 + ], + [ + -14.147293540149773, + -6.906018612172602, + 2.2284396099849038 + ], + [ + -15.156843324539697, + -4.887214372492167, + 2.849390724135152 + ], + [ + -15.456666016191324, + -5.070409613930735, + 1.3059861141710714 + ], + [ + -16.62658083583799, + -5.261296169267013, + 2.4670395479557286 + ], + [ + -16.60634067927688, + -12.614628938223404, + -0.11890308825375413 + ], + [ + -16.586182198453773, + -13.278506908034956, + -1.4034301151475814 + ], + [ + -17.933592357738515, + -13.492106039359896, + -2.0829823517173076 + ], + [ + -17.96286064569327, + -13.394677786901525, + -3.2566690896366235 + ], + [ + -15.864730688969486, + -14.603418751271306, + -1.3189328553626176 + ], + [ + -15.574757692743002, + -15.169990224671778, + -2.694474811946603 + ], + [ + -16.255185040023594, + -16.21787271886876, + -3.0311735242184565 + ], + [ + -14.814256976520925, + -14.600891532802507, + -3.4224944719316457 + ], + [ + -16.182578093488214, + -12.999240681870333, + 0.7133230786343412 + ], + [ + -16.06497895268902, + -12.599751285829257, + -2.0785139864430526 + ], + [ + -14.88177227123396, + -14.52785039222681, + -0.8539790448142136 + ], + [ + -16.420904452614785, + -15.338689472095211, + -0.7374331365526651 + ], + [ + -16.788345360592597, + -16.809603986759726, + -2.410132170477472 + ], + [ + -16.021343153797567, + -16.63578161950022, + -3.920425831959763 + ], + [ + -19.010878929213618, + -13.599963165561348, + -1.3554274783425402 + ], + [ + -20.378157194694985, + -13.59053019384612, + -1.782584901168153 + ], + [ + -20.895400404784127, + -12.17901155709825, + -2.252474502355555 + ], + [ + -21.599923051106163, + -12.041731613776108, + -3.223587247355419 + ], + [ + -21.311301729051422, + -14.33216813155343, + -0.808351376527844 + ], + [ + -22.696117526445793, + -14.611776211235451, + -1.423209781628349 + ], + [ + -23.592533868321695, + -15.519277104854268, + -0.6482571934578251 + ], + [ + -23.287225806083285, + -16.721004608705016, + -0.5834569371252807 + ], + [ + -24.639281570402186, + -15.033392427409467, + -0.16943450077640226 + ], + [ + -18.818199990194195, + -13.522865051050871, + -0.3669779470099545 + ], + [ + -20.297017669250742, + -14.209734621126131, + -2.675950752712992 + ], + [ + -20.86820486709117, + -15.249927752644112, + -0.42171678369960414 + ], + [ + -21.443051183567558, + -13.729555307179453, + 0.09031567088775051 + ], + [ + -23.10242377589597, + -13.60862657661869, + -1.5524821445892958 + ], + [ + -22.553772189768722, + -15.003741707943846, + -2.4302843793231443 + ], + [ + -20.363339045953328, + -11.118887897223487, + -1.6372082893877105 + ], + [ + -20.672443416427313, + -9.690399121140501, + -2.069127964871821 + ], + [ + -19.987223815969976, + -9.437681957185475, + -3.3916258013228724 + ], + [ + -20.445057834459913, + -8.627443072191227, + -4.201253189778578 + ], + [ + -20.094988893138883, + -8.79540710040601, + -0.9635102418011369 + ], + [ + -20.249670699689457, + -7.281253579203053, + -1.178648358744378 + ], + [ + -18.99506836946797, + -6.239788643332105, + -0.3019823820275748 + ], + [ + -17.95230278106956, + -5.844249684684428, + -1.7914005616790145 + ], + [ + -19.73721168256669, + -11.279628513786406, + -0.8611743862239422 + ], + [ + -21.74203284389202, + -9.486414034626762, + -2.019477215826698 + ], + [ + -20.58320877711049, + -8.9546335712526, + -0.0020590178416200716 + ], + [ + -19.02691517165501, + -9.00880252449798, + -0.9212088332103924 + ], + [ + -20.328688841172422, + -6.913492560306395, + -2.20168785142924 + ], + [ + -21.147256300631323, + -7.0123381780332465, + -0.6217596343540017 + ], + [ + -17.556486286082524, + -6.811684212095429, + -2.100431823739246 + ], + [ + -18.557800315606332, + -5.467723401113943, + -2.615839625923827 + ], + [ + -17.12169399974612, + -5.228599207156634, + -1.4462053527813465 + ], + [ + -18.922225175982657, + -10.170099215772836, + -3.7712338542561654 + ], + [ + -18.32003069337502, + -10.16379912081294, + -5.156673699100875 + ], + [ + -19.057659984749694, + -10.993249705192454, + -6.1675891156707 + ], + [ + -19.142182126231887, + -10.595400113352412, + -7.326882699517331 + ], + [ + -16.84199498948378, + -10.447715491399151, + -5.022390489664953 + ], + [ + -18.580763410697003, + -10.866862245178083, + -3.1246844471254196 + ], + [ + -18.347817688657365, + -9.105156826180234, + -5.414754027853002 + ], + [ + -16.519283699642262, + -10.559546859862223, + -6.057501095913813 + ], + [ + -16.333298286868484, + -9.613623347960356, + -4.53905221132744 + ], + [ + -16.650471091542347, + -11.43549888845763, + -4.60321989621219 + ], + [ + -19.75364400882012, + -12.037346835098617, + -5.720272931606841 + ], + [ + -20.683185797664006, + -12.981542347713912, + -6.468410296922205 + ], + [ + -21.928739297378417, + -12.150548739581211, + -6.779698345403735 + ], + [ + -22.450865130546024, + -12.151161422255086, + -7.891715034174863 + ], + [ + -21.095484455763724, + -14.286300443173445, + -5.62922656833545 + ], + [ + -21.918472519917817, + -15.39718076501947, + -6.3571169149914075 + ], + [ + -22.427996528638207, + -16.372025240590688, + -5.301519627388428 + ], + [ + -23.773909757604766, + -15.993905591824387, + -4.772948486239298 + ], + [ + -24.521128117743128, + -16.829291003021922, + -4.077934069861106 + ], + [ + -25.575715032131626, + -16.39595966973343, + -3.4829040444688086 + ], + [ + -24.34546838441222, + -18.134456512947395, + -4.109546885485825 + ], + [ + -19.6579890107701, + -12.211553202199582, + -4.730019678475947 + ], + [ + -20.21956684199471, + -13.314390600536967, + -7.39704913874962 + ], + [ + -20.14197691895606, + -14.657661070340055, + -5.253710651257695 + ], + [ + -21.696728331024698, + -13.942826633761683, + -4.787423197300653 + ], + [ + -22.70843203161446, + -14.960560457479119, + -6.968205427738206 + ], + [ + -21.323829994619036, + -15.915043575603136, + -7.109658656431133 + ], + [ + -22.444441330350482, + -17.293203396855347, + -5.883973199588408 + ], + [ + -21.74203544029904, + -16.447440624088586, + -4.457795904857872 + ], + [ + -23.996353446919084, + -15.015917312673082, + -4.653963202536222 + ], + [ + -25.831301341807443, + -15.419315390027236, + -3.4522043813449614 + ], + [ + -26.240780861821076, + -16.953202756741348, + -2.965922155702358 + ], + [ + -23.62431978494835, + -18.38811806675642, + -4.769624291935151 + ], + [ + -25.06887252995329, + -18.71191266478081, + -3.7054088491357158 + ], + [ + -22.402485890840243, + -11.390963492210517, + -5.803823248606093 + ], + [ + -23.48777253812484, + -10.45094514860233, + -5.929025141784453 + ], + [ + -23.218894687296753, + -9.299356160636592, + -6.880338372088293 + ], + [ + -24.15569200868643, + -8.642088139315547, + -7.2869372163901565 + ], + [ + -23.783450897860053, + -9.884233187454981, + -4.624004033890525 + ], + [ + -21.878600827105142, + -11.546403037791322, + -4.954422249544254 + ], + [ + -24.347495065797375, + -11.036508223917963, + -6.254745529496828 + ], + [ + -24.754681753416975, + -9.39375143873741, + -4.689058425042124 + ], + [ + -23.823102729269575, + -10.608209473917555, + -3.8101315560415845 + ], + [ + -23.20399520202993, + -9.024158615718989, + -4.288447552426565 + ], + [ + -21.927211339415383, + -9.017640764751434, + -7.206639964682377 + ], + [ + -21.565937801401702, + -8.104671775829217, + -8.284256746204536 + ], + [ + -21.09963549982219, + -8.834152060019392, + -9.633983396960172 + ], + [ + -20.549883577711036, + -8.224355628855164, + -10.529936248471266 + ], + [ + -20.526297325300185, + -7.173801526005093, + -7.735528083278532 + ], + [ + -21.113189654724405, + -6.062172716663213, + -6.8410512072195475 + ], + [ + -20.832793281700127, + -6.07521661371689, + -5.578385984116542 + ], + [ + -21.762052674195278, + -5.1634667462425625, + -7.367981732297547 + ], + [ + -21.169250242974236, + -9.59410491699441, + -6.870068014013111 + ], + [ + -22.44047094669644, + -7.535877474078177, + -8.600120017066038 + ], + [ + -19.813571719441427, + -7.789162832920567, + -7.186486362994156 + ], + [ + -19.96924003070697, + -6.691750603075036, + -8.538901845796312 + ], + [ + -20.551636648890383, + -6.948911862756233, + -5.156833742015416 + ], + [ + -21.15208764181935, + -5.374273293354605, + -4.925063733946408 + ], + [ + -21.121030120414694, + -10.18891442751692, + -9.743938413361235 + ], + [ + -20.574607654120303, + -10.953781233682662, + -10.847272192189074 + ], + [ + -19.093281457409322, + -10.675998714222544, + -11.207759144640578 + ], + [ + -18.709634402160066, + -10.598259819488817, + -12.4118000335577 + ], + [ + -21.564003543805683, + -10.881093653936603, + -12.050338192001965 + ], + [ + -23.021880778967795, + -11.10086566076177, + -11.619270979568245 + ], + [ + -23.674892712038734, + -12.293047802699789, + -11.48647641715286 + ], + [ + -23.938460377699183, + -10.1112426547067, + -11.587918800583292 + ], + [ + -25.18215308925655, + -10.684240662039258, + -11.527696307012459 + ], + [ + -25.062468355018737, + -12.018375525858005, + -11.430286733168368 + ], + [ + -21.589386564872378, + -10.786307351606979, + -9.077705666229164 + ], + [ + -20.58013186488002, + -12.008677188398678, + -10.57293625909987 + ], + [ + -21.51773163342797, + -9.947050722495533, + -12.610271662213478 + ], + [ + -21.322717337889966, + -11.697427365682813, + -12.731131641888718 + ], + [ + -23.727864636782794, + -9.123462379598152, + -11.58161095313125 + ], + [ + -23.151902028532376, + -13.222368004383384, + -11.657488231226134 + ], + [ + -26.117306692175074, + -10.183701551620345, + -11.32435198172437 + ], + [ + -18.222558708970343, + -10.490262205540489, + -10.221450134616111 + ], + [ + -16.803367083107553, + -10.711103480216877, + -10.144025828719444 + ], + [ + -16.549685126503682, + -12.169690975580522, + -9.74768954944015 + ], + [ + -17.275254343775543, + -12.754379904915595, + -8.958560452115755 + ], + [ + -16.11351925176267, + -9.665191716913569, + -9.215716434198335 + ], + [ + -16.268731781723215, + -8.258037566168639, + -9.738158419566776 + ], + [ + -15.255815169178899, + -7.69603194454163, + -10.482986278457686 + ], + [ + -17.34218778741322, + -7.481370569752812, + -9.304176927232186 + ], + [ + -15.321821099232533, + -6.323192706458599, + -10.864803934040252 + ], + [ + -17.42858629288481, + -6.128777567213291, + -9.619525925554015 + ], + [ + -16.324628942323972, + -5.502082801562352, + -10.346986383788314 + ], + [ + -16.44608069736091, + -4.205850751363215, + -10.704351360767442 + ], + [ + -18.674120669026852, + -10.48829615757171, + -9.318018683079336 + ], + [ + -16.4262808050515, + -10.641124972523073, + -11.164323573359185 + ], + [ + -16.61156236437704, + -9.64976147938171, + -8.246276032861262 + ], + [ + -15.032639299262103, + -9.777941719143712, + -9.131528413713827 + ], + [ + -14.355251209611957, + -8.208547635381706, + -10.787468511173676 + ], + [ + -18.113206358208053, + -7.980842753782952, + -8.73632149638785 + ], + [ + -14.565759780768724, + -5.953344664033352, + -11.541549069705722 + ], + [ + -18.090182170589507, + -5.4228984440107695, + -9.139504272014516 + ], + [ + -17.16194853526982, + -3.7302942647762336, + -10.276587234188304 + ], + [ + -15.568090941499202, + -12.880748633230382, + -10.34802804511523 + ], + [ + -15.285718266273737, + -14.322906867084384, + -10.125884866621952 + ], + [ + -14.902759568758762, + -14.67200643027104, + -8.668927030602095 + ], + [ + -15.054155321489224, + -15.82704205096013, + -8.151392748142694 + ], + [ + -14.218681014384906, + -14.771830779301126, + -11.084904985501165 + ], + [ + -14.171718966423825, + -16.310024875944464, + -11.351781688182482 + ], + [ + -12.962568994160456, + -16.739873674085402, + -12.257624860452498 + ], + [ + -11.929916900793682, + -17.16248267033734, + -11.698391557029666 + ], + [ + -13.093205435201648, + -16.64488678647274, + -13.505752343588103 + ], + [ + -15.044315192169819, + -12.424805016594746, + -11.08142719978065 + ], + [ + -16.159605077778753, + -14.94823968207811, + -10.30858365248859 + ], + [ + -14.261553233131904, + -14.22445929797368, + -12.026523350501135 + ], + [ + -13.25770426193608, + -14.486646897043101, + -10.656777997218349 + ], + [ + -14.084814774346663, + -16.74493435492286, + -10.356090376738065 + ], + [ + -15.132296112488834, + -16.55272682452221, + -11.806193935780174 + ], + [ + -14.19432051740787, + -13.73430223204889, + -7.978806802116833 + ], + [ + -13.85278230976007, + -13.829576339055166, + -6.598287577969137 + ], + [ + -13.685347561158762, + -12.38449986250356, + -6.0084974529326125 + ], + [ + -14.110068626130241, + -11.462732438189505, + -6.671607444787831 + ], + [ + -12.664293364146175, + -14.762631953830692, + -6.423784636790109 + ], + [ + -11.433115758368011, + -14.335399349731574, + -7.2628813384590245 + ], + [ + -11.15330472131509, + -14.741045231035741, + -8.409886517938782 + ], + [ + -10.767800982890389, + -13.384518961827439, + -6.665849850719564 + ], + [ + -13.968915800380572, + -12.8341433841793, + -8.377566491561586 + ], + [ + -14.711265429761825, + -14.32968462038366, + -6.149959118315736 + ], + [ + -12.42913639381365, + -14.686464180399526, + -5.3621823569879155 + ], + [ + -12.977379595495211, + -15.801250061608698, + -6.530289899586749 + ], + [ + -13.100514250149962, + -12.271774055385379, + -4.816279439061668 + ], + [ + -12.913929447196447, + -11.005220041713756, + -4.203388438547476 + ], + [ + -11.502251636188351, + -10.406710240036034, + -4.459536713344292 + ], + [ + -11.363139979253974, + -9.207875222795963, + -4.364879249932812 + ], + [ + -13.218583365087504, + -11.072890647921383, + -2.7003451403851266 + ], + [ + -13.153375295977769, + -9.760401823946268, + -1.8702914945244447 + ], + [ + -13.966730749447757, + -8.674841296524676, + -2.2719286088943496 + ], + [ + -12.449341250187965, + -9.69412516838264, + -0.667262415126335 + ], + [ + -13.807555107996546, + -7.380646318655238, + -1.6694904821234624 + ], + [ + -12.416690426494002, + -8.506609561103346, + 0.07601207832620628 + ], + [ + -13.00264851874585, + -7.31094722548022, + -0.500473588363799 + ], + [ + -12.880653734329242, + -6.091768411761308, + 0.1292447881459233 + ], + [ + -13.006664472745513, + -13.067213336733744, + -4.200995759983264 + ], + [ + -13.638357692148178, + -10.260342300465993, + -4.532715522986464 + ], + [ + -14.212290630024086, + -11.49826881376174, + -2.5599995753228395 + ], + [ + -12.567847190485418, + -11.775205284790673, + -2.1793863288251174 + ], + [ + -14.64667426539388, + -8.783561641881931, + -3.103948718715006 + ], + [ + -11.901819069443855, + -10.559480518426199, + -0.3240744697523936 + ], + [ + -14.219232664572116, + -6.479885714936529, + -2.1002481793164396 + ], + [ + -11.836361300299847, + -8.505776780959366, + 0.9868446768733983 + ], + [ + -12.339390339281884, + -6.2077859248375376, + 0.9135735067128504 + ], + [ + -10.630681982319494, + -11.23439536172981, + -4.996302932675831 + ], + [ + -9.390597450918614, + -10.839889378265411, + -5.698651982444575 + ], + [ + -9.75556514535041, + -10.306953793416938, + -7.124273254858441 + ], + [ + -9.322187846471667, + -9.20531756531534, + -7.5006837031353255 + ], + [ + -11.082848753646887, + -12.113621535314905, + -5.202709423407437 + ], + [ + -8.937351260749523, + -10.022296740209697, + -5.138107098691464 + ], + [ + -8.672852515124452, + -11.653064457169364, + -5.5905536814396 + ], + [ + -10.702119246528188, + -10.897831988489372, + -7.846523035806108 + ], + [ + -11.1997783942713, + -10.41920740560812, + -9.197513306467995 + ], + [ + -12.010711230485512, + -9.123172818742091, + -8.98059556357133 + ], + [ + -11.593077134514445, + -8.155377706114109, + -9.635089012450612 + ], + [ + -12.074490923501116, + -11.548287134574423, + -9.75728274386869 + ], + [ + -12.386113053078159, + -11.358454627583455, + -11.29141908076617 + ], + [ + -11.507821945134149, + -10.806957489422757, + -12.004497483006624 + ], + [ + -13.46810673771451, + -11.556997374880723, + -11.780290627833025 + ], + [ + -11.056563524628096, + -11.737165105374118, + -7.41064726114253 + ], + [ + -10.391339325454387, + -10.259701520242743, + -9.91101549322371 + ], + [ + -11.552941018162153, + -12.500463131699746, + -9.66009017980681 + ], + [ + -12.990851130060777, + -11.554573961247115, + -9.167077288676111 + ], + [ + -12.877114007543643, + -8.95346127905367, + -7.962042197543779 + ], + [ + -13.414062954342805, + -7.690976727116549, + -7.445640491241793 + ], + [ + -12.320998902573939, + -6.600736396749028, + -7.16563133642896 + ], + [ + -12.467505851271502, + -5.509903286138439, + -7.766356202860232 + ], + [ + -14.163814820224351, + -7.951849204777716, + -6.10691592660557 + ], + [ + -14.952934590968924, + -6.673096171752377, + -5.663564716417455 + ], + [ + -16.349682512564925, + -6.534586960645072, + -6.012528810026514 + ], + [ + -14.361955790552214, + -5.646034742129871, + -4.9134382675757005 + ], + [ + -17.122769488108595, + -5.53839068901118, + -5.550996132280088 + ], + [ + -15.141620716871639, + -4.619744434140216, + -4.474262264553774 + ], + [ + -16.512465818161477, + -4.504178823316437, + -4.812574265129068 + ], + [ + -17.29507473689704, + -3.5622404805009467, + -4.286659952638967 + ], + [ + -13.132244375749492, + -9.788524348920873, + -7.454421676540973 + ], + [ + -14.01454819853589, + -7.310876201119299, + -8.27210335990443 + ], + [ + -14.936861077660756, + -8.714088109589397, + -6.204350355854357 + ], + [ + -13.469744460394523, + -8.113968942722465, + -5.282243900090838 + ], + [ + -16.857019606063176, + -7.3676496410942605, + -6.476228072186442 + ], + [ + -13.324291437955774, + -5.6529518124447975, + -4.614100289875331 + ], + [ + -18.185231491509494, + -5.498281827521879, + -5.7406475214866095 + ], + [ + -14.674800284235696, + -3.8573681635315893, + -3.86824188556047 + ], + [ + -16.963208383134486, + -2.9555039505124228, + -3.620824561248581 + ], + [ + -11.220776895235693, + -6.8994890538928075, + -6.472257608950427 + ], + [ + -10.235520797633619, + -5.826775740679267, + -6.174845529014787 + ], + [ + -9.424815995922796, + -5.372318562454325, + -7.4580864203673105 + ], + [ + -8.854732414579477, + -4.236802933706144, + -7.577151421373632 + ], + [ + -9.338291866812398, + -6.263363657989089, + -5.045854015269278 + ], + [ + -9.191899012210532, + -5.461121257498263, + -3.7856083331422847 + ], + [ + -9.072104430343225, + -4.131532343022172, + -3.7194831555048573 + ], + [ + -9.244417977843655, + -5.95218056695299, + -2.408192878066083 + ], + [ + -9.2773608808851, + -4.794876459395596, + -1.5826819509635366 + ], + [ + -9.318442441136256, + -7.164283481154257, + -1.7954621479924433 + ], + [ + -9.103489422891082, + -3.7355504577280954, + -2.413121174205529 + ], + [ + -9.471642166114718, + -4.800339091286617, + -0.2222369673249674 + ], + [ + -9.36309490634164, + -7.2194389705776985, + -0.40780805800463865 + ], + [ + -9.53295560426016, + -6.091978362894139, + 0.37145318816500367 + ], + [ + -11.179570208536472, + -7.8209130637144995, + -6.060699106245972 + ], + [ + -10.845204119691873, + -5.01113705303635, + -5.786103844856048 + ], + [ + -9.639491277622133, + -7.251366372030191, + -4.697669907546948 + ], + [ + -8.304839010975058, + -6.45170621437569, + -5.336715980904476 + ], + [ + -9.071862533940603, + -3.4067837641955236, + -4.520195051732561 + ], + [ + -9.060970878838667, + -2.774735049535522, + -2.104697930765178 + ], + [ + -9.372451324336938, + -8.092928561165365, + -2.3441914394646473 + ], + [ + -9.436924595639978, + -3.8237794944722907, + 0.23768153029450598 + ], + [ + -9.332962555619483, + -8.15297146320512, + 0.13441959908173698 + ], + [ + -9.506191899471077, + -6.2048524626340225, + 1.445204870567505 + ], + [ + -9.314941243543602, + -6.246980054997181, + -8.49972342029829 + ], + [ + -8.754053308508368, + -5.869265869478113, + -9.796652486847028 + ], + [ + -9.768748752847268, + -5.095848432696272, + -10.6435797363913 + ], + [ + -9.441196941557434, + -4.387537310497834, + -11.554632673822635 + ], + [ + -8.344781964808039, + -7.167835479687767, + -10.55489759833756 + ], + [ + -7.064470257887248, + -7.702851844164968, + -9.938454568349034 + ], + [ + -6.399473772370006, + -8.724642641817184, + -10.85477417443826 + ], + [ + -7.271726977994643, + -9.95369032951038, + -11.064889117789901 + ], + [ + -7.531089917771144, + -10.94833030910388, + -10.160940167890384 + ], + [ + -7.161018650092329, + -11.025597789398091, + -8.885706365723143 + ], + [ + -8.28349616496456, + -11.959112330813412, + -10.580232795757164 + ], + [ + -9.696946871438463, + -7.148296756047273, + -8.251123271718406 + ], + [ + -7.97024568903658, + -5.115301302713675, + -9.723976681631367 + ], + [ + -9.089047744140384, + -7.958970372569354, + -10.463941861458256 + ], + [ + -8.238572462264894, + -6.974685120408083, + -11.62237736582167 + ], + [ + -6.3809619199557845, + -6.871043407100387, + -9.768126509785922 + ], + [ + -7.406095052592815, + -8.230811040824108, + -9.04814621498716 + ], + [ + -6.2885189202778395, + -8.341481043913006, + -11.869158167478707 + ], + [ + -5.425384786299439, + -9.021108470636818, + -10.465723047609902 + ], + [ + -7.769931642986145, + -10.051266874590453, + -11.938028243455438 + ], + [ + -6.524410573976958, + -10.346156899182631, + -8.494314584840819 + ], + [ + -7.4024015138399815, + -11.833360968097395, + -8.329510647057301 + ], + [ + -8.588986762888675, + -12.060536679182917, + -11.537566236380977 + ], + [ + -8.436438875584948, + -12.69427768582716, + -9.904777816295127 + ], + [ + -11.008711564619203, + -5.007978810437834, + -10.254910968450002 + ], + [ + -11.950946556791834, + -4.15876667324153, + -10.91705078857155 + ], + [ + -11.666369225898277, + -2.6674609474836046, + -10.967858259855502 + ], + [ + -12.216549732057835, + -2.000130101048839, + -11.898808124523661 + ], + [ + -11.319587491068063, + -5.5743895034168816, + -9.47861622621598 + ], + [ + -12.175001068295632, + -4.55796494745158, + -11.906262450480023 + ], + [ + -12.894975035952088, + -4.279746915976148, + -10.385759644295998 + ], + [ + -10.866058968446511, + -2.0545197371299366, + -10.139098468673309 + ], + [ + -10.575962027768103, + -0.5937790719235494, + -10.176097554319561 + ], + [ + -9.582604407742156, + -0.34696995430979527, + -11.330163863764618 + ], + [ + -9.62807725044262, + 0.7257313101282321, + -11.875364854304415 + ], + [ + -10.053251636894448, + -0.229998002603228, + -8.746235159016896 + ], + [ + -9.91096420480652, + 1.3451828592574344, + -8.620191188567814 + ], + [ + -9.27480606023968, + 1.7665342950529634, + -7.627996522482645 + ], + [ + -10.515307434035371, + 2.1942906062529346, + -9.286992875188346 + ], + [ + -10.70953216651853, + -2.5483593381197096, + -9.272079885059826 + ], + [ + -11.523423137090836, + -0.10263883567296617, + -10.397901150115633 + ], + [ + -10.662338574811045, + -0.6290277402974951, + -7.935133010800665 + ], + [ + -9.049439338246293, + -0.6294611547527005, + -8.601693586573179 + ], + [ + -8.738240196812479, + -1.2970865864316963, + -11.656079041656763 + ], + [ + -7.794440405912192, + -1.1042162270364102, + -12.71612782441862 + ], + [ + -8.519919891729167, + -1.362993876294162, + -14.073473562460455 + ], + [ + -8.12157551090113, + -0.8321711686221391, + -15.121239024150224 + ], + [ + -6.600808827158935, + -2.052056713756585, + -12.568501749770425 + ], + [ + -5.868899292612565, + -1.8277652941631715, + -11.228142540074467 + ], + [ + -6.301742006528579, + -2.280868521727598, + -10.021684462865492 + ], + [ + -4.793590926846437, + -0.9227441068376478, + -11.264809928572006 + ], + [ + -5.756794744672097, + -1.94509929450075, + -8.75991721742226 + ], + [ + -4.251973229752623, + -0.5186059322280769, + -10.039238573466806 + ], + [ + -4.675181597956588, + -1.0806697977334778, + -8.80217367528428 + ], + [ + -3.9768509941049834, + -0.6215506702137716, + -7.689761307103559 + ], + [ + -8.936245897229984, + -2.2440228784032286, + -11.365899208975334 + ], + [ + -7.397975475454763, + -0.0897721031802905, + -12.758769039218153 + ], + [ + -6.924304420038603, + -3.09101101651774, + -12.63193659085517 + ], + [ + -5.926741993309509, + -1.922194913713227, + -13.415183971932576 + ], + [ + -7.131813416542173, + -2.971726968204777, + -10.031401465542446 + ], + [ + -4.550768818895488, + -0.4498948874256179, + -12.204943815610612 + ], + [ + -6.103703843709301, + -2.289869298499312, + -7.797011828638785 + ], + [ + -3.4343170350216687, + 0.1841234605675357, + -9.975903641683425 + ], + [ + -3.189012919313311, + -0.1054670784077274, + -7.8756890922150875 + ], + [ + -9.530505167060463, + -2.2045087483757015, + -14.054879147716091 + ], + [ + -10.340336626386906, + -2.352881955410524, + -15.305129516478322 + ], + [ + -11.172257547864616, + -1.104958177949598, + -15.554784065735522 + ], + [ + -11.739339505141391, + -0.5080852536448504, + -14.65432785343725 + ], + [ + -11.257498298859089, + -3.6139341176951234, + -15.10132384687284 + ], + [ + -12.560129558864233, + -3.7075020790643407, + -15.913193109188526 + ], + [ + -13.547031701702348, + -4.818161522952778, + -15.472823248094226 + ], + [ + -13.927456901165172, + -4.941704106092914, + -14.293253761846593 + ], + [ + -13.868695514608715, + -5.53725976264883, + -16.38196624188337 + ], + [ + -9.910535436690298, + -2.3699964849299278, + -13.133853943152682 + ], + [ + -9.682877370908892, + -2.547903533429846, + -16.152370552751 + ], + [ + -10.64021848896604, + -4.471510739242916, + -15.368954555142505 + ], + [ + -11.443895092598453, + -3.711327638460517, + -14.031803105302183 + ], + [ + -13.098053310280537, + -2.766201004278429, + -16.025851812015386 + ], + [ + -12.255307818223521, + -3.877465716209656, + -16.94580927411984 + ], + [ + -11.186999425986784, + -0.7003111742818113, + -16.82706921603549 + ], + [ + -11.821471057044764, + 0.4670058071904144, + -17.389196617001204 + ], + [ + -12.193513805720624, + 0.14182352681211619, + -18.801007906078393 + ], + [ + -11.456669572900926, + -0.5102579356746588, + -19.576458126213875 + ], + [ + -11.037456656388137, + 1.856723916353559, + -17.331479662676593 + ], + [ + -11.081887502207206, + 2.318917286506462, + -15.914233046554582 + ], + [ + -9.636879673803103, + 1.8586267448362435, + -17.932600256288094 + ], + [ + -10.685036661833529, + -1.2906057110586318, + -17.474900359342787 + ], + [ + -12.740715176441215, + 0.6142122829996204, + -16.822256719762088 + ], + [ + -11.558476595653563, + 2.6092543373686397, + -17.923376404033522 + ], + [ + -10.406978072110551, + 1.6539263415446612, + -15.37536107434667 + ], + [ + -10.851251189094752, + 3.371543973866693, + -15.75026204839421 + ], + [ + -12.082556737372656, + 2.183397342457681, + -15.50387453216581 + ], + [ + -9.68366596088955, + 1.3942349365666047, + -18.917616022388813 + ], + [ + -9.222650847532293, + 2.863687598176128, + -18.012398919527637 + ], + [ + -8.960451423818432, + 1.309575556885214, + -17.277555849372927 + ], + [ + -13.391145346980885, + 0.6149283802649457, + -19.12777300779166 + ], + [ + -13.868803672814435, + 0.43553016164896974, + -20.470153693143683 + ], + [ + -14.437527828718299, + 1.7339272841249596, + -21.08648439740762 + ], + [ + -14.95663785823718, + 1.733105430805736, + -22.179675728220072 + ], + [ + -14.862935464083442, + -0.769447584762311, + -20.437029708254165 + ], + [ + -16.040263376489968, + -0.6603296785935839, + -19.388819362621533 + ], + [ + -16.311014408156325, + -1.6678096528859214, + -18.656206926290256 + ], + [ + -16.634962138005452, + 0.4021569559153484, + -19.2439827599401 + ], + [ + -14.05031545336158, + 1.1058618848935637, + -18.5407652427918 + ], + [ + -13.052626814786889, + 0.11412590410110823, + -21.11718720373202 + ], + [ + -15.372829491287398, + -0.8513295997367152, + -21.39692782266541 + ], + [ + -14.321745374957313, + -1.6788929653831985, + -20.176026873086446 + ], + [ + -15.6824768518989, + -2.4580298144378503, + -18.631804197590558 + ], + [ + -17.01403383777096, + -1.5015994776055734, + -17.950349633272573 + ], + [ + -14.328777915310184, + 2.932284838147524, + -20.387996547801215 + ], + [ + -15.128317182607663, + 4.0608299331882165, + -20.7961509302559 + ], + [ + -14.659046005995133, + 4.647292910571338, + -22.086841565475876 + ], + [ + -15.473706399040582, + 5.262701046735771, + -22.774257468079398 + ], + [ + -13.843748648911708, + 2.8894405631534283, + -19.50311732270785 + ], + [ + -16.146992247808654, + 3.71087963864548, + -20.963298508739328 + ], + [ + -15.119057532887071, + 4.77308134644278, + -19.971099204866817 + ], + [ + -13.42069177958209, + 4.56812767496308, + -22.494098423613977 + ], + [ + -12.929349194358412, + 5.113669303387468, + -23.806369536905084 + ], + [ + -12.181199561780577, + 3.950685588418878, + -24.46508690534842 + ], + [ + -11.421069478837286, + 3.2180862811261903, + -23.831549607140555 + ], + [ + -11.918799067150628, + 6.302038763972774, + -23.673565004926246 + ], + [ + -11.454847683353455, + 6.757818087993314, + -25.023861463250796 + ], + [ + -12.511149349627168, + 7.4677908680423, + -22.8504738576195 + ], + [ + -12.77562664217039, + 4.066368272365054, + -21.900612626126122 + ], + [ + -13.808158606929187, + 5.3693242222271635, + -24.398347411601616 + ], + [ + -11.040535208119843, + 5.950879494319423, + -23.131859885763266 + ], + [ + -12.360071144505383, + 7.1552789970670005, + -25.48287549544815 + ], + [ + -10.659101725587147, + 7.488470664382419, + -24.878815736197353 + ], + [ + -11.011744582231955, + 5.902823319038106, + -25.53449225881593 + ], + [ + -11.828823841820618, + 8.317413931898216, + -22.87638298705693 + ], + [ + -13.430761875149942, + 7.827380963483165, + -23.312108764499218 + ], + [ + -12.6060394275519, + 7.0804942474550785, + -21.836028987076876 + ], + [ + -12.616722479418863, + 3.6261538199671293, + -25.709861382593836 + ], + [ + -12.040867807577653, + 2.5622543567732095, + -26.574065492267376 + ], + [ + -10.583901401106436, + 2.779359437870184, + -26.97108393811439 + ], + [ + -10.144888204079193, + 3.9070052162090008, + -27.324769714229898 + ], + [ + -12.95677843847392, + 2.358963513875281, + -27.83599506868249 + ], + [ + -12.368421916289476, + 1.270609719314244, + -28.744825891116154 + ], + [ + -11.557082561846903, + 1.5077315726348317, + -29.708827880408183 + ], + [ + -12.542653171463721, + 0.11129057600341863, + -28.391480417732577 + ], + [ + -13.467609969377945, + 4.108038499063383, + -25.96260194504372 + ], + [ + -12.068148896038512, + 1.6217321109340403, + -26.02381709177488 + ], + [ + -13.945246302064573, + 2.080941189636121, + -27.470292920405 + ], + [ + -12.999180835210696, + 3.3229601890471088, + -28.34295919234269 + ], + [ + -9.804782814078504, + 1.7272888478413364, + -27.0213566859153 + ], + [ + -8.328254249854126, + 1.6862650599005065, + -27.240411487491823 + ], + [ + -7.572981223116935, + 2.047757203336573, + -25.93721441581293 + ], + [ + -6.498084064476041, + 1.498723186110162, + -25.63543270973522 + ], + [ + -10.231063155202794, + 0.8233431722668954, + -26.875520980662397 + ], + [ + -8.12537269692275, + 0.6833485471387171, + -27.61603822426792 + ], + [ + -8.009448585465591, + 2.4498200617297954, + -27.949952705274395 + ], + [ + -8.163987483892592, + 2.9187226974053715, + -25.092865898602128 + ], + [ + -7.751990793063599, + 3.1455030915809346, + -23.707720742302094 + ], + [ + -8.463668085169841, + 2.1838229032575924, + -22.720805174179535 + ], + [ + -8.455067124016686, + 2.3282716241078134, + -21.50922480303791 + ], + [ + -7.912075911026863, + 4.614229509587858, + -23.404346875976113 + ], + [ + -7.031168634738385, + 5.506098409660552, + -24.205706232370833 + ], + [ + -7.395199730761875, + 5.861159726483379, + -25.455756837829885 + ], + [ + -5.881617540090128, + 6.042541115012284, + -23.655334630857237 + ], + [ + -6.63977064893931, + 6.784404613602078, + -26.22494761802664 + ], + [ + -5.065927403637712, + 6.881827402648071, + -24.336341251304194 + ], + [ + -5.507266965669268, + 7.370945639733463, + -25.650655637589686 + ], + [ + -4.751014068655573, + 8.153084633890103, + -26.42385343439041 + ], + [ + -9.05616977759202, + 3.2883018618928475, + -25.38870341215453 + ], + [ + -6.74824483739446, + 2.7664774919691553, + -23.515541336758208 + ], + [ + -8.95113813850155, + 4.9098543631449445, + -23.549445710402697 + ], + [ + -7.694019424444914, + 4.730211120239886, + -22.342696597186567 + ], + [ + -8.313230153077768, + 5.4911989036168904, + -25.887901773844874 + ], + [ + -5.614352073297135, + 5.828475642416464, + -22.631057202410762 + ], + [ + -6.982047999836438, + 7.16582260247003, + -27.175615715046387 + ], + [ + -4.175067313749098, + 7.280683042853241, + -23.87408198633427 + ], + [ + -3.9763467042616383, + 8.458938946638455, + -25.946421483613737 + ], + [ + -9.05330444234296, + 1.0935352558364357, + -23.218045871064984 + ], + [ + -9.671098452782159, + 0.08741891512744537, + -22.371886539673664 + ], + [ + -8.715931548720997, + -0.957674336318675, + -21.78564365582984 + ], + [ + -7.721622463101385, + -1.3910473281265539, + -22.414418445141315 + ], + [ + -10.925906087559557, + -0.4726024878065793, + -22.999232933043917 + ], + [ + -10.595107330751647, + -1.3218217957316298, + -24.250590052280106 + ], + [ + -10.964120939608387, + -2.5463532901674455, + -24.294941964312727 + ], + [ + -10.08308729643525, + -0.6996561501620029, + -25.183021326646347 + ], + [ + -8.955027791253492, + 0.9778040841054008, + -24.21656721414671 + ], + [ + -10.014882155171502, + 0.6099098945320165, + -21.479185257512277 + ], + [ + -11.376211420008175, + -1.037020840144777, + -22.182682201422548 + ], + [ + -11.532255950691948, + 0.38426257305938094, + -23.29286950568934 + ], + [ + -8.985453355705562, + -1.3942328877869627, + -20.546582282870578 + ], + [ + -8.182671177134289, + -2.3344735727667683, + -19.791688539749547 + ], + [ + -9.035748601793951, + -3.3516466162279244, + -19.001936588935962 + ], + [ + -10.04532324857546, + -2.8323258550266814, + -18.474804687578747 + ], + [ + -7.2526431328617615, + -1.5456062887050663, + -18.93767140650165 + ], + [ + -6.183331116429295, + -2.441899869877801, + -18.34579029257689 + ], + [ + -4.976339988031736, + -2.666593045402905, + -19.07672310690987 + ], + [ + -6.356516566677685, + -2.961454387080096, + -17.042110800537746 + ], + [ + -3.904039489112884, + -3.5087837220834786, + -18.583401954788858 + ], + [ + -5.290868556158068, + -3.759393179591626, + -16.513489762195263 + ], + [ + -4.170874850215618, + -4.050862717791119, + -17.279889481992853 + ], + [ + -3.2585212103096035, + -4.9166332871754435, + -16.813876017892362 + ], + [ + -9.853513891059151, + -1.186343802885041, + -20.073978351573427 + ], + [ + -7.539036670425707, + -2.8740163743995595, + -20.486472257448803 + ], + [ + -6.729092181961036, + -0.8507996487360003, + -19.594356456929262 + ], + [ + -7.820824013507412, + -0.9885581284459377, + -18.19271015260662 + ], + [ + -4.999810445057974, + -2.2998023675690433, + -20.09226065385815 + ], + [ + -7.268106062720856, + -2.713149123742582, + -16.518901621704902 + ], + [ + -2.9778847413415894, + -3.617335482144483, + -19.128246253386067 + ], + [ + -5.347023030091215, + -4.282163695466153, + -15.570112955643644 + ], + [ + -2.4836440750214774, + -4.807913332061929, + -17.370065485421968 + ], + [ + -8.688966988705682, + -4.646054276936383, + -18.892331129351334 + ], + [ + -9.428758204693278, + -5.81609711094174, + -18.39486237320764 + ], + [ + -8.63006891581265, + -6.579754551753126, + -17.3067270191121 + ], + [ + -7.352333636690854, + -6.603249566443139, + -17.267367090186973 + ], + [ + -9.67074046776736, + -6.823339231673742, + -19.572439978765107 + ], + [ + -8.422467766758373, + -7.427903274754328, + -19.994586954564713 + ], + [ + -7.831364982612386, + -4.893773979540043, + -19.36482735117767 + ], + [ + -10.403828258619734, + -5.5846634503946575, + -17.966167103060673 + ], + [ + -10.31338130833157, + -7.682232145361013, + -19.379014822257407 + ], + [ + -10.030581930751222, + -6.153471800920386, + -20.35339420647476 + ], + [ + -8.168324689458519, + -6.934035771337051, + -20.77759856642353 + ], + [ + -9.347205740971921, + -7.235307842074803, + -16.396939237166947 + ], + [ + -8.819343282501618, + -7.79504536707725, + -15.078329048472153 + ], + [ + -7.741426763002688, + -8.940538747803544, + -15.20846908934919 + ], + [ + -6.701012753476326, + -8.941211528013582, + -14.534886583626983 + ], + [ + -9.89644719467273, + -8.23712440407121, + -14.064382083614909 + ], + [ + -10.837790112117125, + -7.090361950698139, + -13.9414802896772 + ], + [ + -11.907309260232495, + -7.3562693531098375, + -12.88190837607932 + ], + [ + -12.621392773520558, + -8.605734593348984, + -13.109997171690091 + ], + [ + -13.719676798644677, + -8.728115811114947, + -13.860841686385692 + ], + [ + -14.29061595126324, + -7.784179420343889, + -14.635848602230167 + ], + [ + -14.337874312301269, + -9.85093915242038, + -13.86441624295376 + ], + [ + -10.347043761650372, + -7.30881259221519, + -16.519496017699204 + ], + [ + -8.291260051803631, + -6.9543479580728444, + -14.628374952609624 + ], + [ + -10.402001650400456, + -9.127939255798594, + -14.437161575987723 + ], + [ + -9.413019470337346, + -8.521714335354943, + -13.12982169766432 + ], + [ + -10.294627866226003, + -6.21030533843151, + -13.597130835520785 + ], + [ + -11.257021174447319, + -6.879718525469968, + -14.925334703630398 + ], + [ + -11.562916829474911, + -7.191744933231064, + -11.86091603936731 + ], + [ + -12.585435093293148, + -6.505206680092186, + -12.944649430905883 + ], + [ + -12.144073102318236, + -9.445387710101613, + -12.814623229020576 + ], + [ + -13.953523479389435, + -6.832101764641379, + -14.631635587150274 + ], + [ + -15.280747042353088, + -7.9473153529910405, + -14.750408504521658 + ], + [ + -13.951159885604662, + -10.510181807072513, + -13.204150357299293 + ], + [ + -15.099931344676211, + -10.100658463954574, + -14.478427262298114 + ], + [ + -8.11850361043522, + -9.868471242742999, + -16.12175802109552 + ], + [ + -7.13934686347725, + -10.902210523267001, + -16.54469013677939 + ], + [ + -5.832597388248354, + -10.45130261186938, + -17.228976370116744 + ], + [ + -4.811406738829076, + -11.069084210468532, + -16.97738000382036 + ], + [ + -8.976530971998303, + -9.755963972119957, + -16.642560114951102 + ], + [ + -6.9053800833763805, + -11.530424898046647, + -15.685206376834648 + ], + [ + -7.696324532261491, + -11.59732360213394, + -17.172934115352753 + ], + [ + -5.756190093894132, + -9.275983682481353, + -17.85186631400449 + ], + [ + -4.524544205877416, + -8.712972012489217, + -18.419134060686453 + ], + [ + -3.547380941898152, + -8.184442279480265, + -17.32689184574188 + ], + [ + -2.3919566591286796, + -7.9104482462608985, + -17.61162935164169 + ], + [ + -4.938129682815703, + -7.564371511094521, + -19.396666567276423 + ], + [ + -3.7466945134203664, + -6.9547943969129165, + -20.205417141366016 + ], + [ + -2.997764411884576, + -7.872411188794274, + -21.072260873665442 + ], + [ + -1.6953452318862996, + -8.01019454654272, + -20.984460765700806 + ], + [ + -3.534466970573577, + -8.521362335500271, + -21.934916465679965 + ], + [ + -6.605108808272836, + -8.739864489191177, + -17.961474840444094 + ], + [ + -4.048257905168794, + -9.485514913046757, + -19.022809896062 + ], + [ + -5.685903789111275, + -7.8822648432626465, + -20.1232191963374 + ], + [ + -5.304356716126606, + -6.735720926384715, + -18.79059932551744 + ], + [ + -4.188432140619561, + -6.246445030827829, + -20.906279302684077 + ], + [ + -3.080453660050567, + -6.3945741404024545, + -19.549386246315276 + ], + [ + -1.2002329895273876, + -7.466705990441426, + -20.291942072624856 + ], + [ + -1.2634744218544889, + -8.824868161413349, + -21.396645554401715 + ], + [ + -4.1199535862512064, + -8.14869907472513, + -16.051044544148862 + ], + [ + -3.289819719486512, + -7.692979457997012, + -14.87893659647087 + ], + [ + -2.6814811412083466, + -8.98747258208482, + -14.22310230066267 + ], + [ + -1.6284018741992448, + -8.91422383183874, + -13.655104145377287 + ], + [ + -4.1839692651735065, + -6.882493158470766, + -13.922399231635502 + ], + [ + -3.5536012034530544, + -5.978262117160483, + -12.932939414543764 + ], + [ + -2.638198151214319, + -4.891874663251031, + -13.541573006859894 + ], + [ + -4.641831835817132, + -5.21977267421542, + -12.202989262475596 + ], + [ + -5.055477468921121, + -8.463535237423741, + -15.837095699776727 + ], + [ + -2.513663795892378, + -7.048690943512327, + -15.291945658775894 + ], + [ + -4.946449768518521, + -6.383705071719163, + -14.52067409505459 + ], + [ + -4.805799198684158, + -7.593254230877221, + -13.378115300539992 + ], + [ + -3.0505582424447506, + -6.5974193249477935, + -12.190178350273413 + ], + [ + -1.7803313490900956, + -5.346917207087955, + -14.036648722508309 + ], + [ + -3.169560320477693, + -4.2669578480855535, + -14.259370178011785 + ], + [ + -2.3813807503265565, + -4.175863641792574, + -12.760885761944653 + ], + [ + -4.264382658946186, + -4.780717245729221, + -11.279483728228245 + ], + [ + -4.9577623015167145, + -4.431004999868691, + -12.885729293948563 + ], + [ + -5.4783949514194745, + -5.898023321019849, + -12.034943997348007 + ], + [ + -3.1644835836684293, + -10.17734916399911, + -14.493100945334522 + ], + [ + -2.5401389614985885, + -11.494617693317934, + -14.260454767194483 + ], + [ + -1.3818992325656676, + -11.653638115469107, + -15.29387018909045 + ], + [ + -0.3944546855622957, + -12.345630805380438, + -15.00279207827811 + ], + [ + -3.695691574159476, + -12.567302518738359, + -14.270844519164081 + ], + [ + -4.663833231048179, + -12.463744317591306, + -13.04449415841876 + ], + [ + -2.9875510862514254, + -13.856695157127092, + -14.181283555123413 + ], + [ + -3.9524481918354546, + -12.027492400142762, + -11.760066251071924 + ], + [ + -3.9338524333901232, + -10.2219306090077, + -15.145925615837982 + ], + [ + -2.0293807361081995, + -11.458051854756093, + -13.298224554242042 + ], + [ + -4.28249796270722, + -12.61137976883316, + -15.188349673758621 + ], + [ + -5.456552957181236, + -11.756201975563272, + -13.287558249465233 + ], + [ + -5.18820913895116, + -13.400503345471975, + -12.855781587097148 + ], + [ + -3.7032746338695994, + -14.642475905877745, + -13.939644564864189 + ], + [ + -2.439771971211263, + -14.176239220321008, + -15.067809638110141 + ], + [ + -2.369281293634968, + -13.8447334059681, + -13.283677709357843 + ], + [ + -3.1768061196296338, + -12.702697584789917, + -11.398712258310518 + ], + [ + -3.7524206479616367, + -10.956480159397643, + -11.728086612517009 + ], + [ + -4.70423363462643, + -12.066194432944599, + -10.97176215173658 + ], + [ + -1.383512256708112, + -11.00198257963575, + -16.454339592047965 + ], + [ + -0.3975910478997549, + -11.08281922918809, + -17.49599227472099 + ], + [ + 0.7204073401056778, + -10.05970160281538, + -17.37253329733265 + ], + [ + 1.8898604947910083, + -10.427308865677958, + -17.269704106544182 + ], + [ + -1.075348763010332, + -11.149948177082763, + -18.865409042632603 + ], + [ + -0.09722766685156232, + -11.553627229930669, + -19.971865586536662 + ], + [ + -0.7655733935971208, + -11.598880674661814, + -21.389956677183463 + ], + [ + -0.9607047584432684, + -10.545142182882557, + -22.026328744662607 + ], + [ + -0.9949530660900213, + -12.744119616468765, + -21.91500927837075 + ], + [ + -2.1030925955948088, + -10.331643734442878, + -16.684447592453367 + ], + [ + 0.06626149923512237, + -12.063090434226126, + -17.386407126659588 + ], + [ + -1.9401278680770715, + -11.81344682997775, + -18.86025619746905 + ], + [ + -1.522337043217348, + -10.163057657704428, + -18.985187358243827 + ], + [ + 0.7740835276311459, + -10.898730329581895, + -19.96680341143691 + ], + [ + 0.19163141895470392, + -12.57374544290758, + -19.718845561474016 + ], + [ + 0.3443026651472636, + -8.754620385538033, + -17.312602826097255 + ], + [ + 1.2304630908800718, + -7.609518809528026, + -17.0004703608278 + ], + [ + 1.9319931546143836, + -7.767231134658289, + -15.673601078756008 + ], + [ + 3.1568501888748517, + -7.488858566661293, + -15.624225945337274 + ], + [ + 0.47698998420418687, + -6.275917408903666, + -17.0717179665266 + ], + [ + -0.15894327030256142, + -6.049947160735087, + -18.471100785486797 + ], + [ + 0.1630754669348624, + -6.753462967840164, + -19.453550314413125 + ], + [ + -0.8532308775120561, + -5.032936068426579, + -18.49868010528018 + ], + [ + -0.6425436752408074, + -8.541191400484308, + -17.338722586384254 + ], + [ + 1.9338897263143975, + -7.59659315632797, + -17.833011706951336 + ], + [ + -0.27037763905940476, + -6.209756265487471, + -16.281041970508326 + ], + [ + 1.1463373058720812, + -5.474309934979971, + -16.759468403642945 + ], + [ + 1.3384599669329715, + -8.173667649782374, + -14.569025491084712 + ], + [ + 2.0707441614976383, + -8.294109356153967, + -13.294178824654486 + ], + [ + 3.261729884880066, + -9.20480088260183, + -13.336192478097223 + ], + [ + 4.327057226117007, + -8.889474573764119, + -12.825009139740306 + ], + [ + 1.2164483565945456, + -8.790963004679838, + -12.121114664543198 + ], + [ + 0.7865366953895231, + -10.281331169849238, + -12.245066139186141 + ], + [ + 1.8629253291213725, + -8.408711455180423, + -10.736835085906732 + ], + [ + 0.36693672616288875, + -8.394337997700063, + -14.73499922410632 + ], + [ + 2.4352026689571655, + -7.3169140522850284, + -12.977380575070061 + ], + [ + 0.25505951963453294, + -8.277567704446824, + -12.137139613954416 + ], + [ + -0.07163494778924301, + -10.476154113804228, + -11.60188118797406 + ], + [ + 0.5091980404383699, + -10.427476670486726, + -13.289013396984556 + ], + [ + 1.6113859185533925, + -10.963717619824195, + -12.03995481546219 + ], + [ + 2.795909765710751, + -8.955702058616339, + -10.601025597874214 + ], + [ + 2.0670836030970765, + -7.33902370169335, + -10.690069892603287 + ], + [ + 1.153304963021705, + -8.724626251580048, + -9.972153210446812 + ], + [ + 3.2172304744262505, + -10.309057987670144, + -14.163284379090447 + ], + [ + 4.215725952581768, + -11.44179976390501, + -14.2580246267905 + ], + [ + 5.315465182635099, + -11.134219012845051, + -15.327629710120322 + ], + [ + 6.503410849634624, + -11.28147202522041, + -15.084216002448523 + ], + [ + 3.541799702439591, + -12.842695185526622, + -14.60278146693039 + ], + [ + 4.599137493698968, + -13.921584886434061, + -14.483104637349719 + ], + [ + 3.939096114323874, + -15.30196129213698, + -14.753936826587402 + ], + [ + 4.348599223541938, + -16.080455409749675, + -15.6490045384786 + ], + [ + 2.982324823143283, + -15.581712981515807, + -14.057888669666124 + ], + [ + 2.3933673952839567, + -10.24745333017762, + -14.744277666875831 + ], + [ + 4.736428188038031, + -11.592939603943933, + -13.312442204072632 + ], + [ + 2.7044314763698787, + -13.022534330789824, + -13.928563554485235 + ], + [ + 3.165433425955739, + -12.93743543909477, + -15.621347269711602 + ], + [ + 5.468902208216361, + -13.927421371829269, + -15.140051916078898 + ], + [ + 5.0509644267684255, + -13.890604216298016, + -13.49164516535218 + ], + [ + 4.829884064612029, + -10.469180458146809, + -16.406873760189214 + ], + [ + 5.652413240453733, + -9.8659619754863, + -17.433598862028113 + ], + [ + 6.537843426112263, + -8.7675725753125, + -16.801187112282317 + ], + [ + 7.77850281149126, + -8.703501577374823, + -16.98968270124709 + ], + [ + 4.6306099209453455, + -9.414870649530258, + -18.515501219671943 + ], + [ + 5.237270677490821, + -8.538591596679623, + -19.611113710203856 + ], + [ + 5.514918983127064, + -8.936260115423693, + -20.88333639921567 + ], + [ + 5.471844136645659, + -7.180475474469176, + -19.51873996430176 + ], + [ + 6.09833048566277, + -6.829790741205272, + -20.634737204797496 + ], + [ + 6.204695003709283, + -7.812011603974952, + -21.512340706621277 + ], + [ + 3.8260967655382823, + -10.387275321230732, + -16.483041493323633 + ], + [ + 6.276435286588035, + -10.658933355414547, + -17.845778977151955 + ], + [ + 4.174289007755998, + -10.330712612876084, + -18.891137297289326 + ], + [ + 3.7976822178691214, + -8.792846320975457, + -18.18775110186664 + ], + [ + 5.331246689309091, + -6.624573264956439, + -18.687291350120223 + ], + [ + 5.474583858646225, + -9.974413833149526, + -21.178313791263655 + ], + [ + 6.303543203205052, + -5.826032326352049, + -20.976433116569606 + ], + [ + 6.058845719134908, + -8.091005440008132, + -15.799045876129167 + ], + [ + 6.916191247497009, + -7.178518792350189, + -14.949468157909067 + ], + [ + 7.757981400242792, + -7.99000723780415, + -13.871271531210741 + ], + [ + 8.899986760829753, + -7.704179453372944, + -13.482276632273855 + ], + [ + 6.141258804002872, + -6.112151622858022, + -14.138995919896526 + ], + [ + 7.031495617809221, + -4.960594634879072, + -13.703638530352734 + ], + [ + 5.1146063009343, + -5.4646240853203665, + -14.933324550985015 + ], + [ + 5.0742201784295125, + -8.143964637655415, + -15.580395384462292 + ], + [ + 7.541304703211686, + -6.618285657796264, + -15.644788898259533 + ], + [ + 5.69810780083423, + -6.5543192451812615, + -13.246692639841235 + ], + [ + 4.3019057914441685, + -5.90204517301791, + -14.669162263939956 + ], + [ + 7.970806872904926, + -5.399637185321808, + -13.367426398346923 + ], + [ + 7.149139225760217, + -4.287790229728529, + -14.553105531263702 + ], + [ + 6.549100457312597, + -4.396516428741904, + -12.905384034224955 + ], + [ + 7.179058008569532, + -9.004969550470719, + -13.131260059746303 + ], + [ + 7.7830156790871925, + -9.88196196888049, + -12.129077437185806 + ], + [ + 9.155285986178638, + -10.46983606763223, + -12.586591428923565 + ], + [ + 10.145051812143816, + -10.34666421604635, + -11.874287381411973 + ], + [ + 6.868633308799133, + -10.961001523384596, + -11.642304477850518 + ], + [ + 7.484404418782246, + -11.585379802187049, + -10.39587221159269 + ], + [ + 7.785183940346128, + -10.769829699873412, + -9.2786192582472 + ], + [ + 7.841685936085498, + -12.960729868501744, + -10.304504399935853 + ], + [ + 8.517876746960217, + -11.24594033257307, + -8.215208196311105 + ], + [ + 8.558685486546016, + -13.511808665371746, + -9.190826818204657 + ], + [ + 8.860858951335043, + -12.597992847530861, + -8.173313925597391 + ], + [ + 6.302936247923066, + -9.322546785208374, + -13.520690480932833 + ], + [ + 8.077228972615465, + -9.240666623891741, + -11.298248552804326 + ], + [ + 5.861778675990379, + -10.641629947924343, + -11.373330510068676 + ], + [ + 6.782992827592505, + -11.872303391043886, + -12.234166043573348 + ], + [ + 7.449774830597969, + -9.743383294387229, + -9.296157622675882 + ], + [ + 7.72304565017697, + -13.69390419994727, + -11.088584429227826 + ], + [ + 8.658949026826186, + -10.555400129866939, + -7.396885838810056 + ], + [ + 8.740454077145019, + -14.575132323925345, + -9.242842367951427 + ], + [ + 9.30355772641998, + -13.008994433940927, + -7.278051857579431 + ], + [ + 9.275838570043971, + -11.109207510976262, + -13.701348409417587 + ], + [ + 10.506571389405295, + -11.893243870203207, + -14.185942180091814 + ], + [ + 11.716529844808225, + -10.973486201156959, + -14.505803214296533 + ], + [ + 12.799457829461579, + -11.523312315617318, + -14.831239981287025 + ], + [ + 10.036035843124415, + -12.745323908654484, + -15.364631196616532 + ], + [ + 9.53402639351188, + -14.05958131726527, + -14.884951315267198 + ], + [ + 9.391599212538328, + -15.083406065297254, + -15.944391217128674 + ], + [ + 8.509127759259366, + -14.914645939850175, + -16.828749064714838 + ], + [ + 10.18167740284641, + -16.109633153800814, + -15.928384969512223 + ], + [ + 8.448276784440225, + -11.361767796947277, + -14.222359659292602 + ], + [ + 10.670335662976692, + -12.535655312292135, + -13.320732760285178 + ], + [ + 9.264338170718707, + -12.218264614062832, + -15.92569241769606 + ], + [ + 10.847927813509099, + -12.916218667366593, + -16.071542152289982 + ], + [ + 10.290258691244961, + -14.385256890122832, + -14.17070538507097 + ], + [ + 8.54866014716905, + -13.807678982242123, + -14.492907737749816 + ], + [ + 11.511681442801393, + -9.697460191395976, + -14.48471448933817 + ], + [ + 12.561874104226629, + -8.694513483524702, + -14.517381102182298 + ], + [ + 12.700059343682138, + -7.775991326163478, + -13.208314762008722 + ], + [ + 13.69736853413435, + -7.029852317143764, + -13.136879940880846 + ], + [ + 12.36152914299866, + -7.789411808427531, + -15.7333697041218 + ], + [ + 12.33293915577848, + -8.448456999746554, + -17.061774979272975 + ], + [ + 12.287268068969992, + -7.37194856614866, + -18.159511936970617 + ], + [ + 11.271367593897967, + -7.154044265869459, + -18.82994440577989 + ], + [ + 13.33517549424816, + -6.782286370574184, + -18.421257851705302 + ], + [ + 10.549521428278272, + -9.412421479809723, + -14.370248165535784 + ], + [ + 13.529829250105431, + -9.135808911086087, + -14.754917807620936 + ], + [ + 11.467599320477463, + -7.1900497144187625, + -15.560881957581655 + ], + [ + 13.203821036981106, + -7.114571891922253, + -15.885794292873092 + ], + [ + 13.054940870356129, + -9.262336078359851, + -17.128197581979766 + ], + [ + 11.382899392884601, + -8.97815980544192, + -17.13207654410299 + ], + [ + 11.805426344991401, + -7.7468744601359845, + -12.20794050304733 + ], + [ + 12.07946248902187, + -7.276491044583963, + -10.900295416929112 + ], + [ + 12.884490922779024, + -8.378469126202958, + -10.272963760512251 + ], + [ + 13.83094747875679, + -7.996011528008125, + -9.511328230613335 + ], + [ + 10.751680784152924, + -7.155177533694257, + -10.161855864189278 + ], + [ + 10.064251500611263, + -5.778432736248078, + -10.607825661415156 + ], + [ + 10.898652045529643, + -7.221173994251615, + -8.598080513354342 + ], + [ + 10.739074925561026, + -4.436430168360545, + -10.371325554532758 + ], + [ + 10.959384978651357, + -8.28275716571892, + -12.338865656879971 + ], + [ + 12.673829394163388, + -6.362845373014295, + -10.909200845023395 + ], + [ + 10.042353526310364, + -7.937428137560914, + -10.432108175217913 + ], + [ + 9.968417785388837, + -5.795769704700035, + -11.693466574100611 + ], + [ + 9.100692085245583, + -5.668416391425893, + -10.110280463670112 + ], + [ + 11.027461436173853, + -8.2539337629849, + -8.274176607569451 + ], + [ + 11.760680130390604, + -6.5980562027336305, + -8.359900774168818 + ], + [ + 9.996853359228444, + -6.767776327784361, + -8.186632468503975 + ], + [ + 10.08756840753688, + -3.703959836624364, + -10.847905263748528 + ], + [ + 10.793630206931553, + -4.261872191648649, + -9.296779276481088 + ], + [ + 11.751062020443886, + -4.44305455586948, + -10.776219870336938 + ], + [ + 12.593163136685186, + -9.618603638587103, + -10.605148532032715 + ], + [ + 13.140387968983283, + -10.712904064839336, + -9.833375168219627 + ], + [ + 14.651035549426693, + -10.832278064334673, + -9.883722135076999 + ], + [ + 15.218840197377029, + -10.889594723597554, + -8.821345230153982 + ], + [ + 12.387717936010134, + -11.975208324167966, + -10.315657807854704 + ], + [ + 13.037517570638736, + -13.273641349068157, + -9.897915122704378 + ], + [ + 12.247667448516465, + -14.44404320731553, + -10.47840962662239 + ], + [ + 12.917419464647551, + -15.735803064239121, + -10.086143615044348 + ], + [ + 12.14961108935067, + -16.90392746001214, + -10.498233896870392 + ], + [ + 11.723050731439052, + -9.830584819360524, + -11.072128194373118 + ], + [ + 12.920180444106272, + -10.632947805167419, + -8.768849552812178 + ], + [ + 11.404384879460563, + -11.986902368120411, + -9.845532690165424 + ], + [ + 12.311972397754444, + -11.861925248987177, + -11.397105167883582 + ], + [ + 14.079595582345156, + -13.312289528233691, + -10.215216889221969 + ], + [ + 13.052316399957173, + -13.355233510503695, + -8.811073031916656 + ], + [ + 11.209389633845394, + -14.451520277399254, + -10.146712547124837 + ], + [ + 12.288218452494588, + -14.395431324946571, + -11.566569181258618 + ], + [ + 13.850663180617147, + -15.784953482971105, + -10.647160397675792 + ], + [ + 12.953417893556404, + -15.798677574865906, + -8.998553818993093 + ], + [ + 11.338345087052074, + -16.959860314968296, + -9.89921986237242 + ], + [ + 11.791665484193297, + -16.94575066225707, + -11.441751148388821 + ], + [ + 12.542002018318302, + -17.785822120300395, + -10.200932144559957 + ], + [ + 15.291367761781629, + -10.685515978585897, + -11.017063360103517 + ], + [ + 16.793259832574368, + -10.790712422959018, + -10.970681391523973 + ], + [ + 17.495629796321065, + -9.628642268588862, + -10.075301550007874 + ], + [ + 18.4681390707371, + -9.859017978353222, + -9.339393983837818 + ], + [ + 17.24354958554657, + -10.627275222143567, + -12.400929413219693 + ], + [ + 16.031557125667504, + -10.830504796774107, + -13.305588490052887 + ], + [ + 14.83947486914067, + -10.605510548202574, + -12.431618857390639 + ], + [ + 17.01976517800797, + -11.758893876890909, + -10.524116860547567 + ], + [ + 17.678963185147612, + -9.643259238163807, + -12.574783842511223 + ], + [ + 18.06866539533082, + -11.327736201241578, + -12.529944780036958 + ], + [ + 15.993729976522161, + -10.263448640646914, + -14.235706373077079 + ], + [ + 16.055630558339555, + -11.847187303852422, + -13.697856772516225 + ], + [ + 14.487993183532916, + -9.61708480994588, + -12.727539153301617 + ], + [ + 14.161349944854573, + -11.453661612666224, + -12.525893093216006 + ], + [ + 16.960497830346785, + -8.445170366957143, + -10.0266202325928 + ], + [ + 17.405456782736465, + -7.3403021401899196, + -9.163383193322234 + ], + [ + 17.056922316908487, + -7.663771274934049, + -7.666276269853482 + ], + [ + 17.953037446768825, + -7.500035927900228, + -6.792050725897217 + ], + [ + 16.737542037159024, + -6.088536803339423, + -9.78648540061149 + ], + [ + 16.824638105030992, + -4.879348619642087, + -8.827746340907003 + ], + [ + 18.258485664892277, + -4.30612036850215, + -8.626493828802067 + ], + [ + 15.978687925043532, + -3.684284137430666, + -9.375037447284011 + ], + [ + 16.10723300186043, + -8.312233836475912, + -10.550425643382763 + ], + [ + 18.47352111651986, + -7.2642764154805946, + -9.367245793310962 + ], + [ + 17.193889927100802, + -5.834094371804014, + -10.743096939170306 + ], + [ + 15.689075746726488, + -6.19981753788349, + -10.062946504069341 + ], + [ + 16.360271491165165, + -5.193032782816317, + -7.8928331319131075 + ], + [ + 18.259948219371285, + -3.2588930935468454, + -8.324149414102852 + ], + [ + 18.90252836753615, + -4.858668433058227, + -7.942390310364651 + ], + [ + 18.70833991941194, + -4.3223275813229804, + -9.619199779368891 + ], + [ + 16.42922430057111, + -3.368668657980635, + -10.316050945922129 + ], + [ + 14.949493443953202, + -3.9600830479536455, + -9.604802758793872 + ], + [ + 16.128547702726674, + -2.8513570666815866, + -8.688106261656602 + ], + [ + 15.871741185871755, + -8.169506871012402, + -7.448117456742622 + ], + [ + 15.477769868932668, + -8.601302985422535, + -6.094259247898296 + ], + [ + 16.40118342486697, + -9.70755033357159, + -5.571225309506454 + ], + [ + 16.90834261562226, + -9.515605827452589, + -4.43294990757844 + ], + [ + 13.96632465263031, + -8.777941351519416, + -5.945844796360289 + ], + [ + 13.51310652383885, + -9.116424723967157, + -4.556435774414368 + ], + [ + 13.235537003518598, + -8.13702142100982, + -3.5898036188136553 + ], + [ + 13.204464410554163, + -10.450920953490368, + -4.252939632770963 + ], + [ + 12.733529037830184, + -8.430709494878727, + -2.315631817408584 + ], + [ + 12.806493869980288, + -10.806241782401173, + -2.912352250883922 + ], + [ + 12.53385156235324, + -9.763462895853195, + -1.9498352185210566 + ], + [ + 12.208718448325545, + -10.02876073754095, + -0.619411741995593 + ], + [ + 15.219545548418141, + -8.11278650418626, + -8.217221503422586 + ], + [ + 15.717860248189389, + -7.830366328104276, + -5.362062130974436 + ], + [ + 13.552258799625982, + -7.814505261481997, + -6.243230453691957 + ], + [ + 13.593794907531883, + -9.47090340688419, + -6.700249511490812 + ], + [ + 13.305470163859301, + -7.089586926627874, + -3.8435573189873242 + ], + [ + 13.436415986334204, + -11.26933076194041, + -4.918375429962966 + ], + [ + 12.602923760862105, + -7.601580471342061, + -1.6360085187775002 + ], + [ + 12.761724405171021, + -11.835179503931954, + -2.5872623869488502 + ], + [ + 12.048896536781363, + -10.972517616190999, + -0.5460812850076794 + ], + [ + 16.85129686964491, + -10.629928879584554, + -6.439877808277074 + ], + [ + 17.69522558126817, + -11.74837993001222, + -6.062923025078862 + ], + [ + 19.173201912532395, + -11.296138945994244, + -5.859457437357299 + ], + [ + 19.937149349809303, + -11.897026112544097, + -5.042023635631891 + ], + [ + 17.51260096284926, + -12.896356821908284, + -7.187797429326243 + ], + [ + 16.283767188690327, + -13.690604298870653, + -6.922076474991207 + ], + [ + 16.038820636925855, + -14.734518794705878, + -8.06280336232309 + ], + [ + 16.401780079846468, + -14.509574497333233, + -9.254948847047514 + ], + [ + 15.39435502835009, + -15.748685790627633, + -7.817048854699591 + ], + [ + 16.432424844553502, + -10.591432895478135, + -7.358117802786558 + ], + [ + 17.570700389703344, + -12.083699986692807, + -5.033286747150641 + ], + [ + 17.341561769000325, + -12.300942433586727, + -8.084637662969664 + ], + [ + 18.39260533086087, + -13.537517923050018, + -7.238841321131287 + ], + [ + 16.378510603446085, + -14.210323108688044, + -5.968654411023578 + ], + [ + 15.363726939182893, + -13.107906393103804, + -6.967804441366099 + ], + [ + 19.54986196446459, + -10.167080290189972, + -6.396289281536184 + ], + [ + 20.83897436119258, + -9.549123081907226, + -6.0942059774208825 + ], + [ + 20.754617640815674, + -8.591774013746942, + -4.893845535555694 + ], + [ + 21.826651520739972, + -8.340964361199497, + -4.325021242859896 + ], + [ + 21.335506387493787, + -8.736096295624975, + -7.372489214224304 + ], + [ + 21.93007868455893, + -9.461114532876877, + -8.525742195801062 + ], + [ + 23.23181005028985, + -9.470771504499623, + -8.861601625810518 + ], + [ + 21.23792372079159, + -10.3557139684076, + -9.356301783534176 + ], + [ + 22.12881119758144, + -10.881908482868482, + -10.254667087109885 + ], + [ + 23.362168703329925, + -10.433897741006433, + -9.899885648544524 + ], + [ + 19.067512863710824, + -9.748454902049446, + -7.17871666303221 + ], + [ + 21.64130305807478, + -10.244831672723421, + -5.848537400582119 + ], + [ + 20.515256147211918, + -8.175183356473667, + -7.82044921306399 + ], + [ + 22.13400903081057, + -8.055270040127823, + -7.077588327470888 + ], + [ + 20.275097214392815, + -10.659228379682986, + -9.3871161544829 + ], + [ + 24.13040867926676, + -9.147386662403619, + -8.357275643540413 + ], + [ + 21.856310289100264, + -11.573105075547517, + -11.038494233566926 + ], + [ + 19.545555075698683, + -8.063224768550924, + -4.53282945973786 + ], + [ + 19.35202534897923, + -7.394024654595228, + -3.2170021213479516 + ], + [ + 19.300257248952622, + -8.370504251442583, + -1.999502481501811 + ], + [ + 19.946208973449323, + -8.253765958176132, + -0.9733100604685314 + ], + [ + 18.084727465085642, + -6.5244507697079825, + -3.4102991948893084 + ], + [ + 18.314629338146577, + -5.454203016452112, + -4.386842458297845 + ], + [ + 16.928439805183228, + -4.7059742521976204, + -4.624767795595667 + ], + [ + 19.201878056089573, + -4.308791196667755, + -3.8026160566466527 + ], + [ + 18.810902509276197, + -8.17336247917666, + -5.217118311024805 + ], + [ + 20.156937353480227, + -6.686399580894033, + -3.0183056841316986 + ], + [ + 17.178338028358613, + -7.090247999525673, + -3.6257792366960975 + ], + [ + 17.829233301309692, + -6.188578127889684, + -2.4053046864989045 + ], + [ + 18.659974784940083, + -5.830350763593515, + -5.349830547173815 + ], + [ + 17.010442452787434, + -4.0404299416106255, + -5.484085717393553 + ], + [ + 16.087959423027563, + -5.385841678822345, + -4.764298598361239 + ], + [ + 16.72434852793635, + -4.117408251292517, + -3.730320181686244 + ], + [ + 20.22936487853989, + -4.668400804295686, + -3.747362254994236 + ], + [ + 19.163487372609495, + -3.445405406786648, + -4.466838647743474 + ], + [ + 18.93926116332882, + -3.9700284097012286, + -2.800432473739977 + ], + [ + 18.626400049727323, + -9.477016184848253, + -2.1742164778878283 + ], + [ + 18.435068311627113, + -10.607443815697081, + -1.280010838077097 + ], + [ + 19.801272677890058, + -11.299779139613293, + -1.0361385779748746 + ], + [ + 20.22871602451884, + -11.444277811662403, + 0.06258161457249428 + ], + [ + 17.421965972494228, + -11.559292008079694, + -1.8290701352559788 + ], + [ + 17.143008914701163, + -12.82195529165034, + -1.0270143014480735 + ], + [ + 16.088826348235006, + -13.1225030700042, + -0.20340064324641643 + ], + [ + 18.001913617575365, + -13.906418453671336, + -0.9663870971071488 + ], + [ + 17.65467323465133, + -14.6889430086444, + 0.014704618865987394 + ], + [ + 16.472008328674615, + -14.312746481035333, + 0.4617573247290973 + ], + [ + 18.229511248766965, + -9.619914857557944, + -3.091909538825755 + ], + [ + 18.037224154010218, + -10.220820755807381, + -0.34174512740116436 + ], + [ + 16.458922429379843, + -11.052248314980432, + -1.8886484321893056 + ], + [ + 17.673412514249918, + -11.71058638464018, + -2.8788248281797424 + ], + [ + 18.858517372134074, + -14.047588346606972, + -1.482523988456489 + ], + [ + 15.178184729289368, + -12.54372321140022, + -0.15704137958763303 + ], + [ + 18.246106420724185, + -15.541950266225058, + 0.31300670378810136 + ], + [ + 20.57770945412355, + -11.612702327491945, + -2.087876017670389 + ], + [ + 21.865685553687204, + -12.221406856667954, + -1.8783018899853408 + ], + [ + 22.950869031709423, + -11.241972334211312, + -1.3878576949142556 + ], + [ + 23.91177247661205, + -11.728692913750024, + -0.7050478512071543 + ], + [ + 22.336435060385096, + -12.784555111969553, + -3.222671282125111 + ], + [ + 20.168545126087945, + -11.491378670264965, + -3.0032803100784093 + ], + [ + 21.65245486625475, + -12.934018464895757, + -1.0815481296854164 + ], + [ + 21.634239894791378, + -13.535446509271083, + -3.584872630044599 + ], + [ + 22.409803947481194, + -12.013377284019157, + -3.989482124404557 + ], + [ + 23.32929634171313, + -13.21777873798544, + -3.1016567224037934 + ], + [ + 22.732555652749653, + -9.87452158170845, + -1.5015514543022423 + ], + [ + 23.591458638202393, + -8.88678813584886, + -0.9632168304506897 + ], + [ + 23.22070834293014, + -8.76337979655574, + 0.5880263447875571 + ], + [ + 24.141828743298863, + -8.765734527290874, + 1.4475424375691974 + ], + [ + 23.494297212502666, + -7.562772292242585, + -1.701051116038849 + ], + [ + 24.08513862828506, + -6.286202282706199, + -1.0287708898600472 + ], + [ + 25.37383581901645, + -5.844993879499128, + -1.373425359766816 + ], + [ + 23.361929512696545, + -5.646166254270696, + 0.018964528764975862 + ], + [ + 25.888345562246602, + -4.61147516926161, + -0.8639793050437929 + ], + [ + 23.9335194405307, + -4.585478301945983, + 0.6987034999472315 + ], + [ + 25.165824841154517, + -4.031530042846043, + 0.22838003068104645 + ], + [ + 25.680284641036337, + -2.901995094555488, + 0.7657819564583549 + ], + [ + 22.03968723482359, + -9.59558394077402, + -2.181423643319311 + ], + [ + 24.622329653681785, + -9.237183308256704, + -1.0144556683088974 + ], + [ + 24.18301030674136, + -7.731378661655583, + -2.528908553079004 + ], + [ + 22.498718295634863, + -7.4192890344083935, + -2.1209712956667985 + ], + [ + 25.877203461737523, + -6.44984592246081, + -2.1131373426137423 + ], + [ + 22.384400181740187, + -5.931672868102794, + 0.3785880757425692 + ], + [ + 26.91727155410634, + -4.31532387689748, + -1.0054289631019877 + ], + [ + 23.433033363015866, + -4.0524205708064756, + 1.4935399020719682 + ], + [ + 25.24148051474197, + -2.7062601509770303, + 1.5968894776079445 + ], + [ + 21.913012487768512, + -8.69957104241223, + 0.9718507284974633 + ], + [ + 21.54184229167491, + -8.595293231806181, + 2.4080087813730096 + ], + [ + 21.806037396998505, + -9.819814872587528, + 3.2107152236494754 + ], + [ + 22.427013518055023, + -9.650153284097996, + 4.252008222592501 + ], + [ + 20.088215539136577, + -8.12356659729653, + 2.703252214593168 + ], + [ + 19.701641548178312, + -6.775450080713711, + 2.217279104910596 + ], + [ + 19.0895444158166, + -9.105333996838795, + 2.1642406212600327 + ], + [ + 21.19777220934331, + -8.853802393369904, + 0.2756145661488116 + ], + [ + 22.142555349492955, + -7.800262145411239, + 2.8497917574792626 + ], + [ + 20.032284255118277, + -8.255529079399423, + 3.7837879718145992 + ], + [ + 20.284656274058673, + -6.00980707974648, + 2.72912449317325 + ], + [ + 19.742178496193763, + -6.6316304327745, + 1.1375697865269636 + ], + [ + 18.69995140640811, + -6.527152036885411, + 2.56808113935058 + ], + [ + 19.07890635889143, + -8.93927982149404, + 1.0870165714080353 + ], + [ + 19.284610171684683, + -10.169019021096858, + 2.300725090684046 + ], + [ + 18.148181271462565, + -8.829654110656918, + 2.639559088262745 + ], + [ + 21.538124234344824, + -11.046185488215258, + 2.7062959850278205 + ], + [ + 21.967795177608714, + -12.321306912983857, + 3.3433043443520964 + ], + [ + 23.444873975652133, + -12.23178109628725, + 3.8049438901576043 + ], + [ + 23.765802633126505, + -12.35743021514304, + 4.986434906022436 + ], + [ + 21.77502578886477, + -13.54841665025765, + 2.4639422328880394 + ], + [ + 22.20775467805223, + -14.770113706839311, + 3.2715114949348028 + ], + [ + 22.642400449218496, + -16.054348103455254, + 2.539988517017381 + ], + [ + 21.6969382460123, + -16.592024369273304, + 1.572601371490056 + ], + [ + 21.643952502782366, + -16.472706564876717, + 0.23568070104394984 + ], + [ + 20.596720966402525, + -16.88671302809496, + -0.37901071300703953 + ], + [ + 22.575200465573612, + -15.903492360860014, + -0.43209313762449936 + ], + [ + 20.826299357704233, + -11.048896901729961, + 1.9897772876952768 + ], + [ + 21.372353486149574, + -12.505740007569898, + 4.237471033663102 + ], + [ + 20.76053100673003, + -13.793850305024648, + 2.1498311981340232 + ], + [ + 22.33636799282642, + -13.504639107356184, + 1.5306259088426872 + ], + [ + 23.107110390660885, + -14.589429293632406, + 3.860252082704096 + ], + [ + 21.3577413914287, + -15.047918860436425, + 3.8947290430272035 + ], + [ + 23.57238560761636, + -15.807706254065124, + 2.0277398965862417 + ], + [ + 22.867522755780595, + -16.823156371408345, + 3.2791480404888267 + ], + [ + 20.961411566722845, + -17.140764825645306, + 1.9944834973499461 + ], + [ + 19.842715459564516, + -17.357179955807624, + 0.10081934363163582 + ], + [ + 20.46127673412035, + -16.946062857250126, + -1.3781264139452738 + ], + [ + 23.497121657252585, + -16.053573859872472, + -0.04785214097733364 + ], + [ + 22.487472110759462, + -15.893027584692732, + -1.4382208651953914 + ], + [ + 24.314616414428045, + -11.815775024138475, + 2.8650817829659645 + ], + [ + 25.727189483045493, + -11.726772914542721, + 3.1552833536139704 + ], + [ + 26.043756681221506, + -10.590859237178393, + 4.188047156416583 + ], + [ + 26.81767248461581, + -10.926693635110041, + 5.1090250984928 + ], + [ + 26.47623734479642, + -11.407338900083857, + 1.8917577797920488 + ], + [ + 24.035034849238755, + -11.523294364405217, + 1.939668115691032 + ], + [ + 25.982846036547254, + -12.702788121337903, + 3.567757166026051 + ], + [ + 27.512999463364107, + -11.540102942831425, + 2.200945905307503 + ], + [ + 26.235494468242138, + -12.048972976640073, + 1.0441452902613448 + ], + [ + 26.305735093406923, + -10.375771716224051, + 1.5837059668979694 + ], + [ + 25.437272550762888, + -9.423002548611919, + 3.994442528883624 + ], + [ + 25.637311413351043, + -8.373790103744511, + 4.997527718676557 + ], + [ + 25.124751258474422, + -8.688367925086368, + 6.389406985054022 + ], + [ + 25.692352943769272, + -8.270042244139177, + 7.38544945755758 + ], + [ + 25.214572757771776, + -7.070373666267642, + 4.464458241729159 + ], + [ + 26.104729620871066, + -6.571283921103998, + 3.2791911581614626 + ], + [ + 27.63408702353441, + -6.376556586865632, + 3.554351944805246 + ], + [ + 28.22079813921903, + -5.62530421410338, + 2.3894249526425035 + ], + [ + 29.687802401740917, + -5.494776267993586, + 2.5378476508021257 + ], + [ + 24.99385730526054, + -9.23838681995494, + 3.10595900457938 + ], + [ + 26.711541603512224, + -8.367500155121888, + 5.182170717164396 + ], + [ + 24.195426243053177, + -6.955700542880265, + 4.095291214168304 + ], + [ + 25.387472530752802, + -6.301160325311059, + 5.21713145077249 + ], + [ + 25.991841519703456, + -7.198413418282769, + 2.394846384890518 + ], + [ + 25.66416153623489, + -5.625448214043928, + 2.963921412580291 + ], + [ + 27.81072065853053, + -5.738447972268517, + 4.420214966342749 + ], + [ + 28.060935702844727, + -7.370659200827333, + 3.687241280589237 + ], + [ + 27.987956898869548, + -6.014355370551584, + 1.398201486627119 + ], + [ + 27.800340090716976, + -4.621934872260255, + 2.4569833382946373 + ], + [ + 29.902992106469785, + -4.698917084379559, + 1.954409213341767 + ], + [ + 29.774680007738013, + -5.273963481110314, + 3.5195775734956483 + ], + [ + 30.192556205985575, + -6.308301785777246, + 2.216129748344019 + ], + [ + 24.050739659950555, + -9.425038059966653, + 6.513121744831492 + ], + [ + 23.363276942789142, + -9.7349891515114, + 7.764928100873169 + ], + [ + 24.17041503383488, + -10.831973674216442, + 8.61674278624994 + ], + [ + 24.311538086011943, + -10.679524176181644, + 9.849248020658782 + ], + [ + 21.980559117126287, + -10.297759650871399, + 7.475679524845531 + ], + [ + 20.839409861912532, + -9.399511436359319, + 7.076952675692536 + ], + [ + 19.77138771587995, + -10.024251080866236, + 6.174596439308529 + ], + [ + 20.10406884976805, + -8.771055110460054, + 8.296326225710443 + ], + [ + 23.546980282805382, + -9.751234217975139, + 5.700765823819082 + ], + [ + 23.230589319057984, + -8.824276551901505, + 8.34896216720175 + ], + [ + 22.104517748348965, + -10.936907094307912, + 6.6014797131682785 + ], + [ + 21.608733363002138, + -10.87502224180912, + 8.322208777806217 + ], + [ + 21.37816469946801, + -8.57877889716093, + 6.603412909335624 + ], + [ + 20.383355490410203, + -10.38438439559502, + 5.347612574609877 + ], + [ + 19.178620017597567, + -10.77904725704343, + 6.691324089752578 + ], + [ + 19.13412743303913, + -9.254198715865812, + 5.73983368617234 + ], + [ + 19.46432048609481, + -9.501206613885302, + 8.792006861430126 + ], + [ + 20.807369206426287, + -8.295523599472517, + 8.979946574867082 + ], + [ + 19.420734829738045, + -7.999495624130645, + 7.941572807343059 + ], + [ + 24.682080850954605, + -11.85383315476713, + 7.9935789682717555 + ], + [ + 25.527214633173305, + -12.944763436069309, + 8.64315841814539 + ], + [ + 26.73750092248873, + -12.411371266043489, + 9.441110792969262 + ], + [ + 27.17716205648362, + -13.036847690734021, + 10.387656361517042 + ], + [ + 25.995810022016176, + -13.873445979479584, + 7.513926514231022 + ], + [ + 24.937831205587607, + -14.719083874249122, + 6.724310533200387 + ], + [ + 25.638735577312985, + -15.722253801540433, + 5.353179795429312 + ], + [ + 26.69080314226417, + -17.005365857156335, + 6.016272214688862 + ], + [ + 24.506386878628124, + -11.90570747481354, + 7.000331388294616 + ], + [ + 24.933663320282594, + -13.63100471372104, + 9.247200371041599 + ], + [ + 26.488725284760793, + -13.264901450237517, + 6.755763266907367 + ], + [ + 26.755970541780968, + -14.577033591433064, + 7.8533745667344315 + ], + [ + 24.46255964357884, + -15.336942741109056, + 7.486196705452162 + ], + [ + 24.220940909097088, + -13.978892960334633, + 6.368945605728308 + ], + [ + 27.358045036896918, + -17.320222312529495, + 5.213927164690813 + ], + [ + 27.222630401285567, + -16.56029755310385, + 6.8572080199177545 + ], + [ + 26.140060019073026, + -17.853883750736827, + 6.422223327762384 + ], + [ + 27.23509282294215, + -11.22947048571433, + 9.091518668768101 + ], + [ + 28.27029390161267, + -10.502185712812832, + 9.80101761587442 + ], + [ + 27.78148392511973, + -10.078820424190212, + 11.202355576759368 + ], + [ + 28.52776420334536, + -10.091689101804036, + 12.132868331258004 + ], + [ + 28.56841504415994, + -9.174691236496415, + 9.012105480285484 + ], + [ + 29.764964738577206, + -8.439920808148884, + 9.702484037662026 + ], + [ + 31.027278396029, + -8.867394582880138, + 9.771155192330395 + ], + [ + 29.44688791382425, + -7.406429722644361, + 10.306507171645388 + ], + [ + 26.8654320698611, + -10.863213466196726, + 8.225894050691812 + ], + [ + 29.141667635955535, + -11.102475806438463, + 10.06266198380648 + ], + [ + 28.878892982610154, + -9.41118362666225, + 7.9943739947964865 + ], + [ + 27.619139298776627, + -8.648272722128013, + 8.912838417801678 + ], + [ + 31.305238148760385, + -9.696724972187326, + 9.266129863962426 + ], + [ + 31.707582453182315, + -8.175746868436136, + 10.052070528575927 + ], + [ + 26.561419618758478, + -9.686845561632026, + 11.296501135062677 + ], + [ + 25.892638590947676, + -9.214868390640447, + 12.54029380088054 + ], + [ + 25.15988112495715, + -10.34257212017485, + 13.287726939469819 + ], + [ + 24.982827533257993, + -10.2596359592942, + 14.468264212280802 + ], + [ + 25.003410388542882, + -8.13232678880172, + 12.039732828362112 + ], + [ + 26.01066863240815, + -9.7633637739429, + 10.453342876444303 + ], + [ + 26.606469283183905, + -8.718967717330884, + 13.198039427661925 + ], + [ + 24.258928391290016, + -8.620303172700005, + 11.410668556586335 + ], + [ + 24.485244710434632, + -7.623950803569585, + 12.852850932107753 + ], + [ + 25.510667876943, + -7.360525351352692, + 11.460844426088604 + ], + [ + 24.724931138249772, + -11.370681744486546, + 12.537251605948905 + ], + [ + 23.917220338354568, + -12.511677175850366, + 12.941848597257055 + ], + [ + 24.70548469372334, + -13.775928751448191, + 12.582423985968576 + ], + [ + 24.301095450996314, + -14.487605335671788, + 11.622665601734159 + ], + [ + 22.4469801626953, + -12.482805382892423, + 12.361962850894379 + ], + [ + 21.63186391454709, + -11.199658205339801, + 12.8368886831371 + ], + [ + 21.184299599649336, + -11.042358758087857, + 14.18614472413246 + ], + [ + 21.386055549339854, + -10.18706623315802, + 11.933355754362864 + ], + [ + 20.431708217756107, + -9.944917650205468, + 14.579661814882485 + ], + [ + 20.547401375815962, + -9.117512723517962, + 12.26198312078685 + ], + [ + 20.062795125827098, + -8.971275125357522, + 13.597110779474082 + ], + [ + 19.020997247688737, + -8.118853233388847, + 13.898329004853416 + ], + [ + 24.92787036758236, + -11.318304010013833, + 11.54923873441027 + ], + [ + 23.776579613506218, + -12.479544506189939, + 14.022259473011204 + ], + [ + 22.482392446461457, + -12.558352668774887, + 11.275161350129741 + ], + [ + 22.023158354639147, + -13.353608535564831, + 12.862137530248754 + ], + [ + 21.499068688871887, + -11.684064639492476, + 14.995794355368174 + ], + [ + 21.838653997910626, + -10.204096470029299, + 10.952913603526838 + ], + [ + 19.90209438460666, + -9.904822447247113, + 15.520035301692813 + ], + [ + 20.182261182077244, + -8.431284714153435, + 11.512205465087858 + ], + [ + 18.701087887879066, + -7.7417052915384375, + 13.075516464011804 + ], + [ + 25.71200450464129, + -14.191187116588594, + 13.348299156117037 + ], + [ + 26.426436299920745, + -15.38648028163243, + 13.100347669750152 + ], + [ + 25.51047033173408, + -16.61391704316145, + 13.455692787464029 + ], + [ + 24.788113558762674, + -16.639940056807745, + 14.44017943810854 + ], + [ + 27.762911828616588, + -15.160204472614396, + 13.90290883106761 + ], + [ + 27.294656737465562, + -14.299727949824842, + 15.154091126624026 + ], + [ + 26.161893047040994, + -13.497848866257186, + 14.533577055811563 + ], + [ + 26.688683220203323, + -15.441640453980767, + 12.043803316418744 + ], + [ + 28.352485895530453, + -16.04002928009868, + 14.16061020077406 + ], + [ + 28.344309392733024, + -14.504499767721086, + 13.254734215331386 + ], + [ + 26.95367429471995, + -14.97023069738907, + 15.942923625645237 + ], + [ + 28.04134594173796, + -13.658351434137899, + 15.6222696043633 + ], + [ + 25.324834264839065, + -13.420474459177854, + 15.227439826938165 + ], + [ + 26.511581024274403, + -12.524111121936357, + 14.19057148104061 + ], + [ + 25.78676922578285, + -17.690677574216238, + 12.80972547939347 + ], + [ + 25.22506341229471, + -19.027741607557346, + 13.116322899223164 + ], + [ + 23.713432447870993, + -19.309012125577397, + 12.802855009451838 + ], + [ + 23.08451413932822, + -20.182496252752685, + 13.383867908415755 + ], + [ + 25.612007287956395, + -19.496848926075245, + 14.542599777371818 + ], + [ + 27.044773132192187, + -19.453773821908158, + 14.61671480421258 + ], + [ + 26.41096719849415, + -17.51209423331261, + 12.036043032020586 + ], + [ + 25.73379456883224, + -19.683399483201697, + 12.409634416923515 + ], + [ + 25.06801683665186, + -18.943828276348427, + 15.308331363273604 + ], + [ + 25.475756108741372, + -20.57773979688818, + 14.507757308374623 + ], + [ + 27.189678427031634, + -19.30558266357866, + 15.554074014155747 + ], + [ + 23.11288785615808, + -18.52530903450554, + 11.898791374700467 + ], + [ + 21.65934696344341, + -18.135711536819485, + 11.923214435513783 + ], + [ + 20.93976560001171, + -18.10943408425385, + 10.541251329063925 + ], + [ + 19.703346990160767, + -18.131002075349215, + 10.463172196776105 + ], + [ + 21.43968021732134, + -16.743526355504173, + 12.646618573399167 + ], + [ + 20.39636046422994, + -16.892961610881002, + 13.720193987174262 + ], + [ + 20.819075631479297, + -17.220120109955587, + 14.962854933362811 + ], + [ + 19.025373314141685, + -16.776381756573528, + 13.410961779432913 + ], + [ + 19.90150332772221, + -17.2245938642061, + 15.989077379245387 + ], + [ + 18.06675673289444, + -16.757637569190365, + 14.494386153697635 + ], + [ + 18.49425628334484, + -17.01767414475762, + 15.871609382650636 + ], + [ + 17.635014505495356, + -17.199699435459706, + 16.930568600716523 + ], + [ + 23.649282512371308, + -17.87418735211031, + 11.343433113055143 + ], + [ + 21.16766644332393, + -18.89561912552051, + 12.530585946778091 + ], + [ + 22.400358823337424, + -16.45550305978429, + 13.073511610860843 + ], + [ + 21.10002605099851, + -15.913687088358301, + 12.026859198092325 + ], + [ + 21.873946622344015, + -17.375729021320126, + 15.134418530539554 + ], + [ + 18.761576331656084, + -16.53495824649235, + 12.391880054810926 + ], + [ + 20.322660630088563, + -17.394560623301345, + 16.96894506127501 + ], + [ + 17.011468969421994, + -16.704124225430405, + 14.27099194825447 + ], + [ + 16.776496984817616, + -16.915325699208665, + 16.60858163679855 + ], + [ + 21.690082564371156, + -18.18685532058214, + 9.441470290295367 + ], + [ + 21.176321990422533, + -18.113029009598904, + 8.057302295631903 + ], + [ + 22.08158295556488, + -19.048137306453782, + 7.279674520429613 + ], + [ + 23.34115394643341, + -19.03097282573549, + 7.407735289798894 + ], + [ + 21.24442409223005, + -16.603344559721563, + 7.546018145072196 + ], + [ + 20.61071188500777, + -15.562058745727882, + 8.547734786855214 + ], + [ + 20.585775381501698, + -16.50995767144832, + 6.183691707845007 + ], + [ + 20.635873134480757, + -14.15814595949837, + 8.008268800772651 + ], + [ + 22.680079419574074, + -18.129153880990316, + 9.632969092265432 + ], + [ + 20.17591189953973, + -18.545754684600865, + 8.052152701865774 + ], + [ + 22.307085879578693, + -16.367315779120418, + 7.490013428500072 + ], + [ + 19.58680130480028, + -15.846140579660414, + 8.790640499840093 + ], + [ + 21.232498164559107, + -15.55780352797251, + 9.442978877681456 + ], + [ + 20.99514268567363, + -17.28548281467704, + 5.536324966734045 + ], + [ + 19.551623249017847, + -16.853258212638934, + 6.211485707799787 + ], + [ + 20.698009403023736, + -15.470431076240516, + 5.875651589556456 + ], + [ + 21.55766474588706, + -14.051921613110608, + 7.436326748068106 + ], + [ + 19.71090180357112, + -14.085569989462329, + 7.436201171778786 + ], + [ + 20.514629028949148, + -13.389543740240697, + 8.77158553050094 + ], + [ + 21.485157897428277, + -19.862398043446092, + 6.379535246410123 + ], + [ + 22.160474764360632, + -20.823685451443794, + 5.542751604387605 + ], + [ + 22.83957842165396, + -19.998104524003224, + 4.430867119623307 + ], + [ + 22.210536665917935, + -19.14742155814588, + 3.851558471061588 + ], + [ + 21.185480512414536, + -21.84651898037282, + 4.900249322834774 + ], + [ + 21.97289878206586, + -22.616899150115955, + 4.045800894372659 + ], + [ + 20.475959487297537, + -19.895200371366627, + 6.3563169600800045 + ], + [ + 22.896379279944053, + -21.339244262978696, + 6.159792510734113 + ], + [ + 20.822098078085503, + -22.506007488581986, + 5.688364944600864 + ], + [ + 20.418982449868253, + -21.349262600305906, + 4.305840604403528 + ], + [ + 21.585866032015804, + -23.48802308314373, + 3.9319961183054994 + ], + [ + 24.130574986363865, + -20.323204097098596, + 4.083403806223317 + ], + [ + 24.856614037193644, + -19.474843861989598, + 3.1171264778080277 + ], + [ + 24.25031730620117, + -19.39933950291868, + 1.7047504987621427 + ], + [ + 24.456281637618876, + -18.454253454085688, + 0.9499913454263627 + ], + [ + 26.229013908624633, + -20.107983112784723, + 3.0484351567808683 + ], + [ + 25.995264260660555, + -21.554218613248054, + 3.4176120534055263 + ], + [ + 24.92653025512472, + -21.451532997106597, + 4.506720719150529 + ], + [ + 25.07938069857748, + -18.469355886874837, + 3.4741590572014243 + ], + [ + 26.575806345576268, + -20.038625873127103, + 2.0174033691436755 + ], + [ + 26.870571454710138, + -19.54243876091141, + 3.7242053616013573 + ], + [ + 25.50158880698606, + -22.214131706647777, + 2.7042399105508443 + ], + [ + 26.932561083069672, + -22.066191865287692, + 3.635458579019531 + ], + [ + 24.2883850235863, + -22.32533712414977, + 4.638402291849076 + ], + [ + 25.370043806907205, + -21.170669893552486, + 5.46197531748763 + ], + [ + 23.435438494843844, + -20.349316086317913, + 1.3092971781990297 + ], + [ + 22.685639785016402, + -20.41552171752062, + 0.07323671199667812 + ], + [ + 21.138988316537034, + -20.290033379086253, + 0.23707015769639983 + ], + [ + 20.43738314777925, + -20.356125059116494, + -0.7501059865434886 + ], + [ + 23.031747061544202, + -21.771183206598153, + -0.6004057584349195 + ], + [ + 22.633375420366516, + -23.053182287063805, + 0.20070528914510086 + ], + [ + 24.55873648080335, + -21.783324469878153, + -0.939367538364698 + ], + [ + 22.881225557243248, + -24.283196218260514, + -0.5999211544469852 + ], + [ + 23.359759364375098, + -21.114877526343207, + 1.9637335301439032 + ], + [ + 22.98855471983806, + -19.59341864230271, + -0.5752140572627581 + ], + [ + 22.47615080270759, + -21.765658916196003, + -1.5381587130803263 + ], + [ + 23.06502559186409, + -23.16241307123471, + 1.1956155106311859 + ], + [ + 21.56913702489821, + -22.9792061224839, + 0.42437798398703275 + ], + [ + 24.895082804648542, + -20.80481950801334, + -1.282155259192257 + ], + [ + 25.17211849646538, + -22.11449311363856, + -0.10140278690948303 + ], + [ + 24.638583530124624, + -22.550192445949392, + -1.7098485560843244 + ], + [ + 23.86166928081431, + -24.691146098613444, + -0.3541455004554507 + ], + [ + 22.202590191833167, + -25.100745929504683, + -0.3566813358129031 + ], + [ + 22.78182266346707, + -24.177408944863032, + -1.6802115379820335 + ], + [ + 20.533952870009657, + -20.435636440923304, + 1.4040337574918416 + ], + [ + 19.08057747971247, + -20.56355209542869, + 1.6172945190525452 + ], + [ + 18.362346261001743, + -19.23096025536313, + 1.663371058540514 + ], + [ + 18.853019933622452, + -18.224076768629402, + 1.1663877836322212 + ], + [ + 21.13517175197478, + -20.54471424954761, + 2.208231257614521 + ], + [ + 18.564322520068234, + -21.18244588869061, + 0.8834330179974803 + ], + [ + 18.916823433784355, + -20.998071330665766, + 2.6034378453785405 + ], + [ + 17.120626585753264, + -19.32649816713854, + 2.0487666651952705 + ], + [ + 16.290748206005784, + -18.15788986912628, + 2.3506873062247418 + ], + [ + 16.67860047632607, + -17.39820549984529, + 3.6783146103746587 + ], + [ + 17.356288437507896, + -18.005538712514294, + 4.539526349297561 + ], + [ + 14.86363468942741, + -18.695125940004118, + 2.525666246676098 + ], + [ + 14.235151868482664, + -19.245193225096614, + 0.8572681577443245 + ], + [ + 16.7327774498226, + -20.25095124888037, + 2.1714895987193126 + ], + [ + 16.215579399502467, + -17.402240620130556, + 1.5687396968784744 + ], + [ + 14.794808236513651, + -19.42700934515335, + 3.330466729891428 + ], + [ + 14.193851488780302, + -17.866733696651067, + 2.7564345347112034 + ], + [ + 15.317695867674125, + -19.985482480433916, + 0.6023719065577989 + ], + [ + 16.172092105970957, + -16.184013610896727, + 3.883766592178195 + ], + [ + 16.361755182002714, + -15.320738259994414, + 5.070664007345835 + ], + [ + 15.298116232533372, + -15.665479581077989, + 6.089497209244828 + ], + [ + 14.183566071052828, + -15.831164585843453, + 5.700925328071822 + ], + [ + 16.186107922461364, + -13.830002485220689, + 4.733464479322696 + ], + [ + 17.300241267250726, + -13.182510069619752, + 3.765968216397459 + ], + [ + 16.983241484218926, + -11.73834676342284, + 3.379997204529622 + ], + [ + 18.70476439265875, + -13.155583251468556, + 4.3805524854533004 + ], + [ + 15.594061487729968, + -15.818171030232406, + 3.1407050545775754 + ], + [ + 17.38955573990001, + -15.408538418866897, + 5.422816015988388 + ], + [ + 15.200611340456847, + -13.654233582179472, + 4.30219054643277 + ], + [ + 16.195517436354073, + -13.257827111694837, + 5.661165144057922 + ], + [ + 17.31937106685946, + -13.863444812876992, + 2.915049377126899 + ], + [ + 17.577698191491297, + -11.434921327720474, + 2.518221911321275 + ], + [ + 15.934255380572994, + -11.736379934966578, + 3.083828592085668 + ], + [ + 17.15030790132161, + -11.069360503037387, + 4.22418335603642 + ], + [ + 19.237582973024516, + -14.064743461475473, + 4.101927446206086 + ], + [ + 19.228221674580027, + -12.321944571257177, + 3.91243359501162 + ], + [ + 18.656169667934435, + -12.982333762021312, + 5.455598670303629 + ], + [ + 15.70333442143459, + -15.86068418341199, + 7.333031125679643 + ], + [ + 14.817979081474858, + -15.88487773439897, + 8.515183262735855 + ], + [ + 13.94323828130718, + -14.717357435937515, + 8.423553238988239 + ], + [ + 14.428145701289415, + -13.563228741703256, + 8.435210528384456 + ], + [ + 15.643741094842591, + -16.054832005694493, + 9.750900967789457 + ], + [ + 16.795824970436637, + -16.83053978299415, + 9.210171418487388 + ], + [ + 17.00520630110728, + -16.217302963006432, + 7.843025800632457 + ], + [ + 14.211203203709518, + -16.77021434448568, + 8.325188479570807 + ], + [ + 15.975377959671862, + -15.10883590845674, + 10.178931954736207 + ], + [ + 15.171201238038437, + -16.659648926719456, + 10.524852695345928 + ], + [ + 17.733082716573396, + -16.65510024567061, + 9.738254664018726 + ], + [ + 16.413773302729705, + -17.85039497168941, + 9.1651131569062 + ], + [ + 17.449334823567874, + -15.228364444473641, + 7.956394666794987 + ], + [ + 17.703719226641702, + -16.78941277558374, + 7.232395803311514 + ], + [ + 12.63507570749223, + -14.823901782193161, + 8.28681969874275 + ], + [ + 11.77669938371734, + -13.59471360675309, + 8.074126697176453 + ], + [ + 11.727992989461116, + -12.629099176151612, + 9.301595418612937 + ], + [ + 11.689376717391497, + -11.398722318275475, + 9.180391904364773 + ], + [ + 10.468912253498825, + -14.086928037682128, + 7.546980847154794 + ], + [ + 12.25674929971336, + -15.753335935049222, + 8.172276973929005 + ], + [ + 12.291660300370065, + -13.045420565243376, + 7.285970878496099 + ], + [ + 9.988273959216205, + -13.375701014248534, + 6.875233992463877 + ], + [ + 10.541515609285003, + -14.996731369374743, + 6.951092739526446 + ], + [ + 9.773764062859994, + -14.22156525038804, + 8.37567829738463 + ], + [ + 11.789628905497704, + -13.14626266995083, + 10.47987007400948 + ], + [ + 11.760825723283423, + -12.190543259654305, + 11.634723020110835 + ], + [ + 12.963474908574524, + -11.206719275595276, + 11.73192405513798 + ], + [ + 12.823441331545025, + -10.228300167353552, + 12.487044096973474 + ], + [ + 11.575282839429043, + -13.037347983210395, + 12.90003844527285 + ], + [ + 12.781543476649755, + -13.859500229139712, + 13.20478366851846 + ], + [ + 13.903249132104252, + -13.491598722496178, + 13.979551673776218 + ], + [ + 13.039411948742176, + -15.061546171883379, + 12.641516039903326 + ], + [ + 14.160104598592847, + -15.583055419985953, + 13.112619038723208 + ], + [ + 14.746476970173703, + -14.665754725535066, + 13.912624886604883 + ], + [ + 11.808194437186092, + -14.15210186443278, + 10.56955827525758 + ], + [ + 10.917351288092908, + -11.505453201039472, + 11.549260428172067 + ], + [ + 11.417083438030959, + -12.347545341175362, + 13.729043348062659 + ], + [ + 10.735768701478602, + -13.726509845022179, + 12.80854508645305 + ], + [ + 12.429530478609392, + -15.514102472844343, + 11.975680653925934 + ], + [ + 14.081390647512627, + -12.569982712753756, + 14.513676673476311 + ], + [ + 14.727831256113571, + -16.412826004233352, + 12.718203603261102 + ], + [ + 14.072889486295871, + -11.357289359771869, + 10.955579358140064 + ], + [ + 15.234414012421004, + -10.463295582527678, + 11.069321270111088 + ], + [ + 15.112376892362043, + -9.174877773004766, + 10.200544211959501 + ], + [ + 15.880729285872425, + -8.250973373963234, + 10.517604690012753 + ], + [ + 16.337570688617895, + -11.237874774927434, + 10.569003803774672 + ], + [ + 16.789811764036585, + -12.448513884855004, + 11.492485992238727 + ], + [ + 18.022978914149768, + -13.103983663016038, + 10.866151006065337 + ], + [ + 17.309297959715884, + -12.066142140283262, + 12.905737271776605 + ], + [ + 13.993631031342387, + -12.00510801914055, + 10.18476839108806 + ], + [ + 15.51621367912864, + -10.174206140906506, + 12.081800827141013 + ], + [ + 16.094025848285497, + -11.69784258502358, + 9.611289498224025 + ], + [ + 17.257584317475665, + -10.706962213633972, + 10.324459841315889 + ], + [ + 16.00224063335955, + -13.195008796166803, + 11.389625613957314 + ], + [ + 18.193095598820186, + -14.057367854764493, + 11.366367028904147 + ], + [ + 17.78655989543748, + -13.178557681007646, + 9.804714579838706 + ], + [ + 18.86453168756348, + -12.44341339915593, + 11.074812707915193 + ], + [ + 16.374915513092528, + -12.02471932811693, + 13.465480299223934 + ], + [ + 18.136530443918893, + -12.665485502592446, + 13.285969690197074 + ], + [ + 17.602831418251817, + -11.022253400534964, + 12.795130429713218 + ], + [ + 14.15501220878881, + -9.099865121047912, + 9.223874995222694 + ], + [ + 14.132390478560811, + -8.026576198315922, + 8.143672468443325 + ], + [ + 13.154511377631028, + -6.83414508087094, + 8.30982107339511 + ], + [ + 11.997369240758326, + -7.0928548277177015, + 8.458916098118356 + ], + [ + 13.812637294976465, + -8.692222752763143, + 6.788387217405617 + ], + [ + 14.54043104037056, + -9.94595179611997, + 6.3705899494735405 + ], + [ + 14.258392543621614, + -10.223496266897882, + 4.877266102667518 + ], + [ + 16.046528373801436, + -9.999248164359756, + 6.677105271615747 + ], + [ + 13.554829883726562, + -9.91168605416948, + 9.195101605408187 + ], + [ + 15.170404464131073, + -7.696816334461687, + 8.18713697607696 + ], + [ + 12.725560284993591, + -8.753383312878043, + 6.737190410685199 + ], + [ + 14.10706053379773, + -7.973576415319542, + 6.023557830356364 + ], + [ + 14.184313401481882, + -10.843220498841333, + 6.876740819679917 + ], + [ + 13.267647955434283, + -9.937134629028549, + 4.5243843279295275 + ], + [ + 15.028872575766599, + -9.693734144153836, + 4.317080130770903 + ], + [ + 14.520230563236675, + -11.269059932783932, + 4.71498796002153 + ], + [ + 16.650575678951505, + -9.267876758999137, + 6.140151288589878 + ], + [ + 16.3377906812966, + -9.849870665056642, + 7.71679340847148 + ], + [ + 16.41315151004857, + -10.90126223097559, + 6.187148814376678 + ], + [ + 13.669434778887602, + -5.5961311529771365, + 8.081277871616672 + ], + [ + 12.97866580142488, + -4.378558582497504, + 7.793123430972387 + ], + [ + 12.287092197266766, + -3.901393511208795, + 9.05225111561875 + ], + [ + 12.793983694868187, + -3.895582391656774, + 10.167409266946203 + ], + [ + 14.670199235227338, + -5.4831470045022, + 8.005087415365013 + ], + [ + 13.713383881805443, + -3.6460133239629897, + 7.458953748705099 + ], + [ + 12.22028017838901, + -4.5782197683574, + 7.036099004909801 + ], + [ + 11.026856985753275, + -3.5768633037320114, + 8.78596443719145 + ], + [ + 10.02596606128597, + -3.303672782376026, + 9.775266694699944 + ], + [ + 9.638564180812475, + -4.706677081175741, + 10.486081699003844 + ], + [ + 10.062781061223731, + -5.765581619602614, + 10.168728491916788 + ], + [ + 8.878379353614967, + -2.5153560346723935, + 9.108744449001383 + ], + [ + 8.354411613412532, + -3.091139796952376, + 7.806236547025976 + ], + [ + 8.398380321436802, + -2.3717761915122253, + 6.814270484181694 + ], + [ + 8.037717981151701, + -4.291788667102111, + 7.763253606706988 + ], + [ + 10.71219565711437, + -3.641283569818171, + 7.828395288131243 + ], + [ + 10.402753375186897, + -2.737663650206798, + 10.627183570056408 + ], + [ + 8.02466731062044, + -2.4462542095434685, + 9.78291083910554 + ], + [ + 9.164103254424502, + -1.4717975386901898, + 8.976661713721384 + ], + [ + 8.759601802803155, + -4.584907375352429, + 11.48713653831513 + ], + [ + 7.915361844001883, + -5.68277697086279, + 11.97908959082979 + ], + [ + 7.316514174802659, + -6.789542562700319, + 10.984817295395338 + ], + [ + 6.92446290570164, + -7.8654726550735745, + 11.366172128944699 + ], + [ + 6.752738266905129, + -4.926445966050977, + 12.57893950727482 + ], + [ + 5.63934991692433, + -5.832308226199984, + 13.008235808542292 + ], + [ + 5.974426160583476, + -7.015346176791354, + 14.401615953259117 + ], + [ + 5.758216216454793, + -5.926914626164859, + 15.750240529067119 + ], + [ + 8.53374114394008, + -3.668513607356374, + 11.846732847471696 + ], + [ + 8.341436249323504, + -6.27414101939317, + 12.789552482956598 + ], + [ + 7.105065110257298, + -4.455237965473543, + 13.496506311959436 + ], + [ + 6.359317497861048, + -4.218819721618559, + 11.84915638020702 + ], + [ + 4.902712120609312, + -5.1479810940994355, + 13.429142563881154 + ], + [ + 5.195770427633108, + -6.294415352486055, + 12.12630918785607 + ], + [ + 6.644280973743319, + -5.296175374378862, + 15.822059359943388 + ], + [ + 4.877494585358666, + -5.350815351820017, + 15.466445927843663 + ], + [ + 5.4683478936988825, + -6.527897402431336, + 16.612154748740043 + ], + [ + 7.544768500698227, + -6.539324129420976, + 9.689436736125057 + ], + [ + 7.052357452737406, + -7.411054891466506, + 8.596992368735082 + ], + [ + 8.026298926423557, + -7.704206770434837, + 7.421189507349561 + ], + [ + 7.7895451400019855, + -8.592323476934723, + 6.6604538705991025 + ], + [ + 5.723801470362754, + -6.840418639256427, + 7.961637347106453 + ], + [ + 4.720055132737271, + -6.571162945544188, + 9.01792026018473 + ], + [ + 3.851124050828905, + -7.518698164097714, + 9.555555239566464 + ], + [ + 4.361066700250439, + -5.340730282813041, + 9.721257297564243 + ], + [ + 3.2254082572283433, + -5.538555762113759, + 10.504394593499615 + ], + [ + 4.796849443299207, + -3.9973458618374877, + 9.68716708752748 + ], + [ + 2.9288332600432763, + -6.861534728099343, + 10.292719434612344 + ], + [ + 2.6304860908113175, + -4.603759660251939, + 11.334989357672322 + ], + [ + 4.170554208011032, + -2.9479345877838767, + 10.469974160474269 + ], + [ + 3.0590101074799163, + -3.291240787508741, + 11.29900646715661 + ], + [ + 7.924257058579953, + -5.666066343615654, + 9.352526771683042 + ], + [ + 6.954926932988938, + -8.393497412681256, + 9.058963737401925 + ], + [ + 5.962389008937151, + -5.910080291651724, + 7.446228338072845 + ], + [ + 5.32147662190291, + -7.616674318768901, + 7.310743618573548 + ], + [ + 3.7322156913456244, + -8.568113535710609, + 9.329743871669656 + ], + [ + 2.23687260388315, + -7.308757958091405, + 10.876912023703763 + ], + [ + 5.662824484565841, + -3.7875633143026732, + 9.07685548760185 + ], + [ + 1.6616685546402534, + -4.803224553509949, + 11.768585327284676 + ], + [ + 4.525850766119053, + -1.9453792943851482, + 10.28276012963398 + ], + [ + 2.5873021381343038, + -2.4099508098976656, + 11.707931158471963 + ], + [ + 9.11838115157155, + -6.966721806622672, + 7.2750673413636315 + ], + [ + 9.825350625751863, + -7.098706142375079, + 6.092192877766479 + ], + [ + 9.173424988094562, + -6.394647506225823, + 4.846761194558825 + ], + [ + 9.672584206231317, + -6.52163320989564, + 3.768559477099116 + ], + [ + 9.365310171239397, + -6.316162075214947, + 8.007119292578636 + ], + [ + 10.814764427512308, + -6.653007984924102, + 6.194713358074622 + ], + [ + 9.886270095347813, + -8.159837411589933, + 5.850554777348223 + ], + [ + 8.078092695928644, + -5.580563549648332, + 5.051791366105576 + ], + [ + 7.333897046762075, + -4.865594869222946, + 4.048633537647795 + ], + [ + 8.20456900023521, + -3.841696365123852, + 3.334976383622687 + ], + [ + 7.909204420459462, + -3.592760663022233, + 2.1316767848894944 + ], + [ + 6.199935317709336, + -4.191635732841831, + 4.778946231845558 + ], + [ + 5.384786725188816, + -3.515899036218997, + 3.71924755349898 + ], + [ + 4.250113188068486, + -2.795800601813937, + 4.416854698238356 + ], + [ + 3.580922382815362, + -2.0388627679843694, + 3.3760317094863352 + ], + [ + 2.916747548935135, + -0.9301776647442139, + 3.5348913317859196 + ], + [ + 2.3751366030628525, + -0.3005925344329423, + 2.5353163259941893 + ], + [ + 2.804450772918539, + -0.37530135724694347, + 4.715760678560998 + ], + [ + 7.774939645287092, + -5.513401040791905, + 6.012878199135712 + ], + [ + 7.0617153579754595, + -5.560952630915693, + 3.2545958589888806 + ], + [ + 5.667661255299006, + -4.97704301833204, + 5.315528702054364 + ], + [ + 6.579421540833002, + -3.4071802518367065, + 5.433713130150964 + ], + [ + 5.952306816849251, + -2.6645483633202502, + 3.3434521344351804 + ], + [ + 4.999211132988141, + -4.2243600120141025, + 2.9860935625498612 + ], + [ + 3.5180233968405656, + -3.4959587517686828, + 4.819251472757824 + ], + [ + 4.58446773429046, + -2.1674045685727066, + 5.242339583635395 + ], + [ + 3.6465266684990736, + -2.3049149508240987, + 2.4039148513069426 + ], + [ + 2.1628502813427235, + -0.6934379576073155, + 1.629387165494694 + ], + [ + 1.9892440111701912, + 0.6038923848213038, + 2.765738061851632 + ], + [ + 3.1197215140304637, + -0.9317055665524236, + 5.497501244398028 + ], + [ + 2.2720600987632613, + 0.4815642889846288, + 4.765173717147637 + ], + [ + 9.11837696468825, + -3.199121996272922, + 4.009894671088339 + ], + [ + 10.2870336093181, + -2.6215386249798343, + 3.241508375410913 + ], + [ + 11.606325184383183, + -2.9154706011870672, + 3.980962659443769 + ], + [ + 11.61609378354408, + -3.151611381741972, + 5.179722369536807 + ], + [ + 10.205741821429616, + -1.1097911515639964, + 3.166492538976922 + ], + [ + 8.800613777270003, + -0.5942851204951083, + 2.68870370195432 + ], + [ + 7.7052112852536725, + -0.36330377683445114, + 3.5548227967846904 + ], + [ + 8.590408976519369, + -0.4686165870131873, + 1.333630606572961 + ], + [ + 6.515281206623379, + 0.07807856532519697, + 2.987525892989159 + ], + [ + 7.39148026446257, + 0.012440622150308334, + 0.7368851770093797 + ], + [ + 6.268144130293976, + 0.17916131627475984, + 1.6218244144410086 + ], + [ + 9.249770475673964, + -3.2555165095750596, + 5.009722157456919 + ], + [ + 10.316812354148718, + -2.9582081445179114, + 2.205233304470424 + ], + [ + 10.521857167174607, + -0.6337822749198878, + 4.094708901613339 + ], + [ + 10.92627534982536, + -0.7418221327532137, + 2.436060207599837 + ], + [ + 7.828231740606966, + -0.6062117984978492, + 4.599935736389966 + ], + [ + 9.381354219895908, + -0.5872057575642593, + 0.6078616085340758 + ], + [ + 5.693344750592108, + 0.2753145692595318, + 3.6597742281148413 + ], + [ + 7.33142799050027, + 0.09287667506925823, + -0.3384402091874673 + ], + [ + 5.367508758762129, + 0.6567123630138703, + 1.2651724826221555 + ], + [ + 12.729077495291506, + -2.8355188293181754, + 3.3111022005058928 + ], + [ + 14.041485170273276, + -3.1230082715999288, + 4.019510448595324 + ], + [ + 14.831474205697237, + -1.774187950429635, + 4.26476527823847 + ], + [ + 16.023027272554135, + -1.7454439622969744, + 4.392785854969396 + ], + [ + 14.865305389293498, + -4.067941735130063, + 3.121433166135974 + ], + [ + 14.306179871002119, + -5.45241296841067, + 2.8501828264972824 + ], + [ + 13.288525696724683, + -5.978477531705693, + 3.5210136414041795 + ], + [ + 14.8187338868348, + -6.5266938907331, + 2.0215777297372064 + ], + [ + 13.979836369126124, + -7.681173023847066, + 2.207190228042782 + ], + [ + 15.97286103382254, + -6.708532644926834, + 1.1853427154147407 + ], + [ + 12.966094704196403, + -7.221742969626462, + 2.9817819324719874 + ], + [ + 14.132989960364533, + -8.919542073545472, + 1.5855580443233506 + ], + [ + 16.148658125602186, + -7.916368243816748, + 0.536338979695971 + ], + [ + 15.218123567620601, + -9.005471403922058, + 0.7332904500777646 + ], + [ + 12.836627877680844, + -2.6735085547428667, + 2.3199985979133784 + ], + [ + 13.93245266393139, + -3.573463500257617, + 5.006070455980746 + ], + [ + 15.038292596054902, + -3.5528059478107537, + 2.1765465017759866 + ], + [ + 15.87504859204924, + -4.1988806078994685, + 3.5104948207514384 + ], + [ + 12.723592427834618, + -5.465673060497039, + 4.285396157365562 + ], + [ + 12.126118505696429, + -7.752492409036051, + 3.163013332198674 + ], + [ + 16.68151863314908, + -5.922892383923056, + 0.9686109346994419 + ], + [ + 13.351046143620827, + -9.655221769810282, + 1.7027634281246584 + ], + [ + 17.00341836743313, + -8.040401753583467, + -0.11204008943120956 + ], + [ + 15.281313468125768, + -9.97152993190116, + 0.25460934570989696 + ], + [ + 14.090768088203943, + -0.6901808857813094, + 4.397624915696497 + ], + [ + 14.734532795221327, + 0.639212955604588, + 4.579718412803814 + ], + [ + 15.422495036744236, + 0.7852839196874832, + 5.926868649426374 + ], + [ + 16.455579435868927, + 1.4793611453235513, + 5.973489822974219 + ], + [ + 13.757468521285356, + 1.8573145502560493, + 4.231405180219842 + ], + [ + 12.777753776811531, + 2.215084939131131, + 5.39485526364536 + ], + [ + 14.59974087038347, + 2.9652428733208467, + 3.9288635613455916 + ], + [ + 13.111033090270128, + -0.8518230629476164, + 4.212989724743631 + ], + [ + 15.556727964242926, + 0.6884761059973457, + 3.8658084255559824 + ], + [ + 13.145224487467067, + 1.776630095762826, + 3.3332135813391193 + ], + [ + 14.366421914593559, + 3.3325180387595594, + 3.0731349331794147 + ], + [ + 12.298355658285663, + 3.1760297131239525, + 5.208140002610995 + ], + [ + 11.962696997206482, + 1.4916269939179685, + 5.3751105585600625 + ], + [ + 13.224081783782118, + 2.2664622837729667, + 6.387957270898921 + ], + [ + 14.82223152069346, + 0.24221658292447756, + 7.009061813580679 + ], + [ + 15.557588101656233, + 0.15591252099528674, + 8.253585759196225 + ], + [ + 16.637378566861734, + -0.9268075197941599, + 8.25204039410865 + ], + [ + 17.225296402963565, + -1.3248458920440669, + 9.293476053399107 + ], + [ + 14.5792751631456, + -0.1544729484189018, + 9.38923100519732 + ], + [ + 13.513485086094368, + 0.8793634418211056, + 9.572796199099397 + ], + [ + 13.95842998764588, + 2.011563267060211, + 10.115915515682216 + ], + [ + 12.38866995518633, + 0.6879263013462911, + 9.231560885323068 + ], + [ + 13.890804031399306, + -0.136503577789016, + 6.913588739534701 + ], + [ + 16.134691404591123, + 1.0639691217017457, + 8.428176841707732 + ], + [ + 14.077112711631889, + -1.119653391394678, + 9.323219779517387 + ], + [ + 15.071879829956899, + -0.050376534079423774, + 10.35598101900341 + ], + [ + 14.940128688267713, + 2.2237805452971315, + 10.222382541489356 + ], + [ + 13.231227893501268, + 2.71246053866102, + 10.120376002795341 + ], + [ + 16.828320208171352, + -1.742801231680744, + 7.2098188029451755 + ], + [ + 17.9577184495513, + -2.7166127320686826, + 7.1449298473247795 + ], + [ + 19.270908884629215, + -2.092170258170782, + 6.802047562728238 + ], + [ + 20.3225315214418, + -2.7093897106605596, + 6.966682792841183 + ], + [ + 17.57732453970991, + -3.768951029304077, + 6.137129350425661 + ], + [ + 18.00535491211237, + -5.227217744312355, + 6.338007751547802 + ], + [ + 17.357250635938524, + -5.778405028942444, + 7.616807276001057 + ], + [ + 17.384420981245874, + -5.977901531943502, + 5.135794063950682 + ], + [ + 16.328945578086856, + -1.6502200016114585, + 6.336803766528458 + ], + [ + 17.99469642817549, + -3.2818140596933745, + 8.076209095679186 + ], + [ + 16.496549183095855, + -3.7961233107685644, + 5.9982369683943055 + ], + [ + 18.034574667547286, + -3.439879555409533, + 5.203996823261886 + ], + [ + 19.069265514669016, + -5.4579009661448765, + 6.28347583520147 + ], + [ + 17.34445384537398, + -6.867188579423612, + 7.666667986493853 + ], + [ + 17.856153809866623, + -5.318429413971472, + 8.46981371118031 + ], + [ + 16.3274410841307, + -5.437217657611086, + 7.511044227816166 + ], + [ + 17.635232151691866, + -5.407337084581826, + 4.241562202120816 + ], + [ + 17.756373294879033, + -6.997197501357448, + 5.031921354644417 + ], + [ + 16.31131938707546, + -6.131094444305518, + 5.250193289834685 + ], + [ + 19.225940230141852, + -0.9307157133025612, + 6.098148097222292 + ], + [ + 20.462653815484906, + -0.2630857206498387, + 5.637036789722574 + ], + [ + 21.466988210293845, + -0.0007410049341576783, + 6.755440565289239 + ], + [ + 22.69898925770414, + 0.06438958926955651, + 6.607111203975892 + ], + [ + 20.08183826623073, + 1.0180468967589107, + 4.891911594588701 + ], + [ + 21.272351652737775, + 1.9875185940605462, + 4.601853863829364 + ], + [ + 22.004689319824916, + 1.7461475717625774, + 3.4840693282510435 + ], + [ + 21.348747240301808, + 3.155922794596094, + 5.346907550592534 + ], + [ + 22.88315131981699, + 2.757401007911625, + 3.1036496953931785 + ], + [ + 22.38977386383939, + 4.0647144193893325, + 5.090035376294394 + ], + [ + 23.14897746974442, + 3.8406903167587245, + 3.9452830450394334 + ], + [ + 24.159482356361963, + 4.662377392148386, + 3.6479340145455343 + ], + [ + 18.393920240636707, + -0.396492007034686, + 6.304177293470161 + ], + [ + 20.933823230463812, + -0.9059096747635778, + 4.8934800310424444 + ], + [ + 19.631690571454406, + 0.7291222843379792, + 3.942180897052376 + ], + [ + 19.34768047416129, + 1.6325776674319172, + 5.412933043243685 + ], + [ + 21.9251358588553, + 0.8565697926951827, + 2.8768430847292343 + ], + [ + 20.700130915984886, + 3.2452097821230126, + 6.205814927747294 + ], + [ + 23.495069130881266, + 2.559750162685148, + 2.23595657210905 + ], + [ + 22.525825254857192, + 4.9257536736538725, + 5.727610484112906 + ], + [ + 24.51078598415813, + 5.086779558391697, + 4.434106924349039 + ], + [ + 20.917955834607938, + 0.2243698341951852, + 7.882823528627334 + ], + [ + 21.662629839567522, + 0.6092176996958472, + 9.081748252554942 + ], + [ + 22.603293732219644, + -0.528506415945408, + 9.570589425197774 + ], + [ + 23.535264444783643, + -0.20252847735902257, + 10.302425165623886 + ], + [ + 20.727062594905856, + 0.8895830473579025, + 10.287475783394019 + ], + [ + 19.936640982868795, + 2.0116619987267654, + 9.98704818561528 + ], + [ + 19.91186063784305, + 0.256008211376761, + 7.965728512603536 + ], + [ + 22.325324525577233, + 1.4672303210636315, + 8.968848330255902 + ], + [ + 20.061687712135466, + 0.0679327829286529, + 10.552559836511461 + ], + [ + 21.398180350307957, + 1.1054625679852563, + 11.118797157497548 + ], + [ + 20.49698255667159, + 2.654212562709475, + 9.545750364011361 + ], + [ + 22.4641375881286, + -1.7356839663265191, + 9.090322755503157 + ], + [ + 23.38167250818493, + -2.786847629900535, + 9.290426483606812 + ], + [ + 23.80187609533012, + -3.4930229481027197, + 7.95209651206908 + ], + [ + 24.340768443775634, + -4.5941065910666055, + 7.957716827005759 + ], + [ + 22.84913504507603, + -3.755396693436751, + 10.385626097053626 + ], + [ + 21.652126427000113, + -4.529653544506175, + 9.998849367296593 + ], + [ + 21.544814181312642, + -5.85751953286433, + 10.668353934104156 + ], + [ + 20.23601925236872, + -3.8412495360400385, + 10.09762789490885 + ], + [ + 21.84415267744962, + -1.7897738952142817, + 8.294840576807992 + ], + [ + 24.274729671620474, + -2.404989641214243, + 9.785127491927243 + ], + [ + 23.705818448301937, + -4.412395056332542, + 10.53576456292381 + ], + [ + 22.706413501780375, + -3.2090964311792334, + 11.31798081642875 + ], + [ + 21.726787877411283, + -4.7657065202192825, + 8.93733800773234 + ], + [ + 22.320447081783602, + -6.519387357164334, + 10.283098283311219 + ], + [ + 21.721349527032636, + -5.91011463310096, + 11.742677777820532 + ], + [ + 20.612354896330263, + -6.352320109067108, + 10.396703767182675 + ], + [ + 20.17756068313514, + -3.089128090465863, + 9.31086448209658 + ], + [ + 19.45162938664085, + -4.560855092599809, + 9.863100057478555 + ], + [ + 19.93805563951891, + -3.4630803263185896, + 11.075535780343543 + ], + [ + 23.628545385625316, + -2.836589267900621, + 6.779491316541101 + ], + [ + 23.902994480103185, + -3.327412479891848, + 5.4332803696051695 + ], + [ + 24.55082711455817, + -2.351380297493918, + 4.377066100549582 + ], + [ + 24.42650171596096, + -2.5300344676365967, + 3.1672892474121204 + ], + [ + 22.73690410011702, + -4.193755536844691, + 4.843857482284609 + ], + [ + 22.124374486708433, + -5.318553121237471, + 5.665191463029359 + ], + [ + 21.5852853906745, + -3.3599252469563226, + 4.692799217078592 + ], + [ + 23.362945422076255, + -1.8669527901792122, + 6.876245977527536 + ], + [ + 24.709359859338647, + -4.037598723267337, + 5.616342923967567 + ], + [ + 23.02643064244734, + -4.560903092579991, + 3.85923818487369 + ], + [ + 21.273151254264707, + -3.0767903394621072, + 5.5553576914956935 + ], + [ + 22.851567212686994, + -5.988770600626793, + 6.123558100564397 + ], + [ + 21.47166214348554, + -4.956449856102495, + 6.459513489249244 + ], + [ + 21.561568133935655, + -5.9677290483384695, + 4.99443237830451 + ], + [ + 25.1395752745489, + -1.2289441755408106, + 4.838435591366314 + ], + [ + 25.735132403818255, + -0.059884908202544995, + 4.014162683812822 + ], + [ + 26.99169854847794, + -0.44802083941885584, + 3.23994403866976 + ], + [ + 27.79042451617697, + -1.1574610831023406, + 3.7689767919584756 + ], + [ + 26.04701979386662, + 1.14466274692289, + 4.967185443571331 + ], + [ + 26.826934433152722, + 0.6882924963170538, + 6.234322857493658 + ], + [ + 26.74992829248365, + 2.3265042102033675, + 4.311729631799946 + ], + [ + 25.176251933117136, + -1.1068727137445222, + 5.840361024427448 + ], + [ + 25.03105774259293, + 0.2723451802415813, + 3.251274429669422 + ], + [ + 25.06074894956359, + 1.568329011031004, + 5.156582463139208 + ], + [ + 26.155460803191076, + 0.10508435905354307, + 6.864476018024071 + ], + [ + 27.680041639181646, + 0.07833534570698664, + 5.937244335371724 + ], + [ + 27.165063402026927, + 1.5129036680604386, + 6.861844108563729 + ], + [ + 26.693523958022674, + 3.1883202446350083, + 4.976703761075205 + ], + [ + 27.778551495146466, + 2.0935501600400954, + 4.036474686272568 + ], + [ + 26.12798121211814, + 2.5923591248318587, + 3.4569787807483454 + ], + [ + 27.09159779620693, + -0.07583260283783844, + 1.947790600297447 + ], + [ + 28.17990957927399, + -0.5694774234202242, + 1.1387795912415513 + ], + [ + 29.513166341429937, + 0.13577162687169952, + 1.4638797581575527 + ], + [ + 30.518946269027076, + -0.5286689036832009, + 1.7270980735883232 + ], + [ + 27.67937357752699, + -0.3936047643242837, + -0.2786384922937988 + ], + [ + 26.700167645678704, + 0.8279398532959235, + -0.23514895986639173 + ], + [ + 26.15858270864428, + 0.6942049816808833, + 1.1347117235997 + ], + [ + 28.30336092583298, + -1.6351272273549071, + 1.3317807234749846 + ], + [ + 28.549164419011298, + -0.14296055073292457, + -0.8858801930007664 + ], + [ + 27.202127407380196, + -1.345155834878348, + -0.5129196501861267 + ], + [ + 27.274927923908734, + 1.7529766421138362, + -0.1898212758460879 + ], + [ + 25.887093249448235, + 0.8307449253085437, + -0.9610964783897882 + ], + [ + 26.03159263674361, + 1.694891007558681, + 1.547751417319289 + ], + [ + 25.238281864385556, + 0.11040806417265348, + 1.1166516016803387 + ], + [ + 29.501090537874873, + 1.4765189025945702, + 1.6483431361164045 + ], + [ + 30.73486635972374, + 2.2581854091414044, + 1.8278358519614022 + ], + [ + 30.671712371467002, + 3.0941181371861433, + 3.1688506791604176 + ], + [ + 30.5514360379639, + 4.292533252160553, + 3.285326291262014 + ], + [ + 31.035107341550646, + 3.1184248588581056, + 0.5734107093852486 + ], + [ + 31.350361903444597, + 2.35145463892664, + -0.7115476184061938 + ], + [ + 30.398254604725025, + 2.146054528606868, + -1.6982356482474636 + ], + [ + 32.604283769287555, + 1.7941157470802267, + -0.9341767276711179 + ], + [ + 30.628476615267083, + 1.3935597173331828, + -2.879173089071899 + ], + [ + 32.89504661976334, + 1.215399986010759, + -2.1560661618304278 + ], + [ + 31.905095050127258, + 0.9286479092782329, + -3.0979628878809797 + ], + [ + 28.636922269830546, + 1.9992071746006133, + 1.658725780902701 + ], + [ + 31.55682587684722, + 1.5746912523067067, + 2.0407128311905165 + ], + [ + 30.184563255714394, + 3.7376581641749738, + 0.28841000789421956 + ], + [ + 31.86418168081429, + 3.782671609005206, + 0.8173577629054798 + ], + [ + 29.418374394410915, + 2.5368584648192183, + -1.4669351326277675 + ], + [ + 33.40935971792601, + 1.948532073571286, + -0.23103401113324837 + ], + [ + 29.90379399629208, + 1.2788629841994563, + -3.6716884324979757 + ], + [ + 33.90531276492504, + 0.8752819800915574, + -2.329533436578432 + ], + [ + 32.14233830540811, + 0.4497377167588006, + -4.036453611800165 + ], + [ + 30.797015013479196, + 2.304709487494293, + 4.290211025708634 + ], + [ + 30.587004525594573, + 2.8080993284435607, + 5.669637565321155 + ], + [ + 31.687547995628684, + 3.8093428175058364, + 6.172880972995402 + ], + [ + 31.58817627688977, + 4.504047701419353, + 7.169147462479891 + ], + [ + 30.971844283498253, + 1.3257823794623036, + 4.113474743580915 + ], + [ + 29.615294450616165, + 3.3000001985264475, + 5.713372982871682 + ], + [ + 30.629453741120308, + 1.9826495229000756, + 6.3802222817825776 + ], + [ + 32.86872526565533, + 3.7882310213440746, + 5.4981342740362305 + ], + [ + 34.069911044691295, + 4.669074364993207, + 5.692324932121896 + ], + [ + 33.86608819602672, + 6.040598871911726, + 5.0788679636222085 + ], + [ + 34.64852995282165, + 6.92148397164118, + 5.374474793260868 + ], + [ + 35.364649301256506, + 3.882193519135768, + 5.358449535572533 + ], + [ + 35.790729937612035, + 3.461244229515671, + 3.917042130452537 + ], + [ + 34.877659566176355, + 2.390230622917457, + 3.2219277724595687 + ], + [ + 35.157620435943684, + 2.2611785786373417, + 1.943808878917444 + ], + [ + 33.980083398614234, + 1.7646847348409693, + 3.6514872714440956 + ], + [ + 32.90275144816538, + 3.1230902227856063, + 4.738838615108494 + ], + [ + 33.988234568352865, + 4.96384770670673, + 6.738525856722764 + ], + [ + 36.207859834643365, + 4.482364588420296, + 5.700345526445918 + ], + [ + 35.38383375014423, + 3.000522078267551, + 5.999063552689439 + ], + [ + 35.81353571208511, + 4.385372628464722, + 3.3394907177544293 + ], + [ + 36.77307337112361, + 3.0081571970665095, + 4.05053122293695 + ], + [ + 36.02520092829889, + 2.6254453550742056, + 1.5767635131966165 + ], + [ + 34.62654558588716, + 1.564029110367251, + 1.4417732374379524 + ], + [ + 32.841339338127995, + 6.2086471927746345, + 4.160268575447771 + ], + [ + 32.52128942131284, + 7.503153194905906, + 3.464393698202941 + ], + [ + 31.237271954635503, + 8.106899287104682, + 4.017653206835051 + ], + [ + 30.53449298061965, + 7.406143283738231, + 4.735217849978171 + ], + [ + 32.50245471174281, + 7.31293434661103, + 1.9394368735251268 + ], + [ + 33.857284245528724, + 6.725303759953874, + 1.4422816306128219 + ], + [ + 35.13222922581857, + 7.444630682482341, + 1.9086716923484415 + ], + [ + 36.33294994825707, + 6.81626411264358, + 1.2566412048222189 + ], + [ + 36.494904193733674, + 7.201994294853137, + -0.15056957959548312 + ], + [ + 32.18629810492856, + 5.449240286793724, + 4.040600393998968 + ], + [ + 33.31679342865472, + 8.224597579974784, + 3.650918432934546 + ], + [ + 31.660439887041893, + 6.688093238731369, + 1.6416349142535154 + ], + [ + 32.39379829066262, + 8.315564957051834, + 1.5258861759198932 + ], + [ + 33.85355046974074, + 5.714295787118118, + 1.8496519458047262 + ], + [ + 33.85143683169845, + 6.746632921879552, + 0.35250581157191363 + ], + [ + 35.18512746633864, + 8.492389079169584, + 1.612856937099971 + ], + [ + 35.35931674766193, + 7.367232860778529, + 2.971940710235112 + ], + [ + 37.241543502987554, + 7.099239215325724, + 1.7881339089129722 + ], + [ + 36.45170900435997, + 5.746778895658252, + 1.4304190282918392 + ], + [ + 35.68070591947179, + 6.887656863655934, + -0.6588880764970809 + ], + [ + 36.526401470424865, + 8.210742366182899, + -0.18976218205561388 + ], + [ + 37.33530816625332, + 6.8469021487747455, + -0.5838507146061661 + ], + [ + 30.98455313067552, + 9.418591233360019, + 3.7376837151593785 + ], + [ + 29.766493098729025, + 10.041574781030988, + 4.1846244346943395 + ], + [ + 28.43328316183258, + 9.389167635751846, + 3.754112308987233 + ], + [ + 28.39262295363091, + 8.492531908378908, + 2.8949402168735543 + ], + [ + 29.910858197365656, + 11.499270179201972, + 3.609249772948843 + ], + [ + 31.428378723091807, + 11.744004517184521, + 3.2949516793389098 + ], + [ + 31.88823893322197, + 10.322685299117097, + 3.064347719012588 + ], + [ + 29.787934640302122, + 10.181314820898422, + 5.265416957038992 + ], + [ + 29.330106820633176, + 11.588641459377016, + 2.6911885149250248 + ], + [ + 29.474649932401768, + 12.225308513593689, + 4.295317769710551 + ], + [ + 31.632179567121465, + 12.372342208986424, + 2.4279118058120055 + ], + [ + 31.95166432921845, + 12.161054881585073, + 4.155384063482304 + ], + [ + 31.70424682760598, + 10.14331132439355, + 2.0050685624772817 + ], + [ + 32.919378430674875, + 10.048060632011754, + 3.2867085697493716 + ], + [ + 27.36153021690477, + 9.674760493450776, + 4.453210591304695 + ], + [ + 26.149992048411832, + 8.840106399024478, + 4.657328059888647 + ], + [ + 24.836099077506812, + 9.501695979536919, + 4.414205066827097 + ], + [ + 24.72694624917144, + 10.732362398269117, + 4.624937808849112 + ], + [ + 26.24043811371244, + 8.126683083814726, + 6.079914816859085 + ], + [ + 25.03618189801965, + 7.231271160814572, + 6.46253914091087 + ], + [ + 24.26667896737498, + 7.613162905584488, + 7.473256789346104 + ], + [ + 24.449892250149396, + 6.419437739893283, + 5.733434722557489 + ], + [ + 27.501468446432316, + 10.3921377582476, + 5.150268217260189 + ], + [ + 26.1756607792821, + 8.064706133792981, + 3.891694847786756 + ], + [ + 27.106079951771424, + 7.476210767005057, + 5.9547878347238274 + ], + [ + 26.379630190602892, + 8.931528800303909, + 6.801683843455539 + ], + [ + 24.768607303685084, + 8.167190384163916, + 8.152391682311073 + ], + [ + 23.57415403573034, + 6.9412256220271615, + 7.771596628254103 + ], + [ + 23.848513977950816, + 8.790657834074125, + 3.849092789024606 + ], + [ + 22.506542194116406, + 9.389382269809573, + 3.5266988082761874 + ], + [ + 21.535550196064165, + 9.504555685673324, + 4.7820661322681 + ], + [ + 20.60235559747693, + 10.260070690822033, + 4.705359439996787 + ], + [ + 22.016684902981666, + 8.494036688245444, + 2.3925209956223985 + ], + [ + 20.65251138571014, + 8.914025588018148, + 1.7556615925128713 + ], + [ + 21.871676685403184, + 6.999997890445172, + 2.772541983541441 + ], + [ + 20.604753245317458, + 10.388632588963048, + 1.3878584624835388 + ], + [ + 24.087966040533143, + 7.944511061465903, + 3.352306288941712 + ], + [ + 22.659306931114333, + 10.422256770202807, + 3.2137519588252466 + ], + [ + 22.76725941531113, + 8.58747118625513, + 1.6076588437460122 + ], + [ + 20.402062364719786, + 8.300232280455305, + 0.8904258899532611 + ], + [ + 19.84982061124375, + 8.70099699304302, + 2.4616402722679323 + ], + [ + 20.978522721844108, + 6.878752281966456, + 3.3854635309269847 + ], + [ + 21.665050477474658, + 6.361218837100466, + 1.9138409116068684 + ], + [ + 22.77432922468554, + 6.5509030514697315, + 3.1868294024278017 + ], + [ + 21.29175703917359, + 10.65441667435249, + 0.5844365574173558 + ], + [ + 19.62898777304551, + 10.67302739837612, + 0.9940345577388047 + ], + [ + 20.86520344270259, + 10.872724486660218, + 2.3290928706056513 + ], + [ + 21.791768679452268, + 8.808033826900214, + 5.877701211361925 + ], + [ + 20.75289613851144, + 8.731786443745818, + 6.894142986795282 + ], + [ + 20.891321758063803, + 9.783395765672424, + 8.01226696094964 + ], + [ + 21.81393289295682, + 9.73557685858583, + 8.813017421379012 + ], + [ + 20.517607366479606, + 7.3220020501843806, + 7.397146948592817 + ], + [ + 19.731893739828703, + 7.319667612123794, + 8.691576107153722 + ], + [ + 20.087810146501845, + 6.4479469964155385, + 9.529082125388118 + ], + [ + 18.93010512261313, + 8.249440496547322, + 8.925702834165293 + ], + [ + 22.690156635997546, + 8.347440846330471, + 5.906922253331728 + ], + [ + 19.831023337975562, + 8.869693118516523, + 6.329137205553239 + ], + [ + 19.936832618414318, + 6.8379577622236525, + 6.611971904673413 + ], + [ + 21.449731121839932, + 6.757230380918884, + 7.413828291501886 + ], + [ + 20.02115619209055, + 10.73142425231498, + 7.996418378723585 + ], + [ + 19.919060531261053, + 11.966225693730223, + 8.744861337279918 + ], + [ + 19.288693584002147, + 11.807309076414242, + 10.179780584233082 + ], + [ + 18.981209539160588, + 12.790507889999674, + 10.895904356596349 + ], + [ + 19.083856119844796, + 12.9373082196351, + 7.98041911036531 + ], + [ + 19.71113856245027, + 13.336258298825669, + 6.5880504696335285 + ], + [ + 17.6654981060496, + 12.476857287787197, + 7.694430627638026 + ], + [ + 19.290590265319295, + 10.526024141995208, + 7.329947670407066 + ], + [ + 20.967202125525063, + 12.254673574640663, + 8.824207197316229 + ], + [ + 18.981772974158595, + 13.809933030091997, + 8.625556761549664 + ], + [ + 19.594930288266145, + 12.434490085766868, + 5.986876518430971 + ], + [ + 19.143046643494888, + 14.077189114873704, + 6.025563279674699 + ], + [ + 20.78288990987682, + 13.534470899917778, + 6.575345638879175 + ], + [ + 17.710113974724653, + 11.387857152029596, + 7.708119643247596 + ], + [ + 17.042611319270865, + 12.735879229627017, + 8.550598094940941 + ], + [ + 17.239248894026403, + 12.77027219103718, + 6.735099127078199 + ], + [ + 18.94681050163055, + 10.568194661169912, + 10.619041350034813 + ], + [ + 18.132022158177225, + 10.527435263363827, + 11.761577501086549 + ], + [ + 18.76522536904416, + 11.055950167110609, + 13.042375360536102 + ], + [ + 18.157024197249058, + 11.81153931857017, + 13.797937188491234 + ], + [ + 17.683799234810458, + 9.055996261110977, + 11.962485989854798 + ], + [ + 16.775588121568514, + 8.738291026426168, + 13.180782516061086 + ], + [ + 16.922969146865935, + 8.566433146160477, + 10.81754602941012 + ], + [ + 19.149357993719118, + 9.726875203641839, + 10.098215056401163 + ], + [ + 17.250962571962823, + 11.157023296112925, + 11.637259904868316 + ], + [ + 18.54172205236589, + 8.396254874957435, + 12.09213197644642 + ], + [ + 17.57862234782708, + 8.457268703425598, + 10.124870389063696 + ], + [ + 16.55262946490454, + 7.671336540103312, + 13.180072328835776 + ], + [ + 17.30054710501179, + 8.994358823144182, + 14.101078687330594 + ], + [ + 15.842204660843612, + 9.284089825476087, + 13.04295780941792 + ], + [ + 20.101031268211752, + 10.90166106007922, + 13.253970148359878 + ], + [ + 20.806435794248934, + 11.70666209357745, + 14.27045512608316 + ], + [ + 21.03145959120854, + 13.16546110104889, + 13.861435904276775 + ], + [ + 21.12968855706342, + 14.049733126209276, + 14.76421012275422 + ], + [ + 22.136297545622764, + 10.957998207551384, + 14.537014990625387 + ], + [ + 22.69370138386924, + 11.344536974792959, + 15.944528904838775 + ], + [ + 22.032996829418607, + 11.96367349966198, + 16.813960742821173 + ], + [ + 23.76816420078828, + 10.80130129663604, + 16.207649943716763 + ], + [ + 20.617562611463757, + 10.314707936557, + 12.614608073943874 + ], + [ + 20.2487806087461, + 11.721286087539738, + 15.206887153445248 + ], + [ + 21.919343959737514, + 9.889887819266733, + 14.55025523645288 + ], + [ + 22.831149932992, + 11.072948403995099, + 13.705107396252917 + ], + [ + 21.012150302009665, + 13.547965528492682, + 12.570689884717373 + ], + [ + 21.108452980090924, + 15.023862675246392, + 12.237019709852056 + ], + [ + 19.852366021889814, + 15.847186432887156, + 12.71550694585304 + ], + [ + 19.917102691175536, + 16.966087044104825, + 13.23818999539108 + ], + [ + 21.276456029836936, + 15.061518074334003, + 10.656718304530493 + ], + [ + 20.724069298909647, + 12.902999550873062, + 11.84879519915579 + ], + [ + 22.041430520811474, + 15.359060195392203, + 12.69011371125487 + ], + [ + 20.434450539122263, + 14.858722450743812, + 9.994900086855342 + ], + [ + 21.714245433950733, + 16.037380305582587, + 10.446639890447079 + ], + [ + 22.072735946566507, + 14.39444791071844, + 10.326486240101323 + ], + [ + 18.71176790693653, + 15.207673721308765, + 12.593753317834237 + ], + [ + 17.438204290169995, + 15.803892792224929, + 13.026749851600343 + ], + [ + 17.448729917892916, + 16.154472159678676, + 14.48154416201394 + ], + [ + 16.91253650279048, + 17.154518576064447, + 14.928381030426433 + ], + [ + 16.325842679211934, + 14.795520135374318, + 12.650145221738091 + ], + [ + 15.982768477269154, + 14.823628611574236, + 11.166356579814963 + ], + [ + 14.976924703611969, + 13.449422739909096, + 10.660925477890116 + ], + [ + 14.490123688429238, + 14.051205125601541, + 8.998687720116788 + ], + [ + 18.669531111090688, + 14.349836807185511, + 12.062310844883532 + ], + [ + 17.365956055000016, + 16.729436995467495, + 12.455568781828626 + ], + [ + 16.59510937727925, + 13.76859997398617, + 12.897191396762317 + ], + [ + 15.49365880063475, + 15.15358906071151, + 13.256242943446292 + ], + [ + 15.341035993325285, + 15.69735937279404, + 11.052891640909749 + ], + [ + 16.867285573844587, + 14.845543139111896, + 10.529766754237688 + ], + [ + 14.119232837993293, + 15.067576218174281, + 9.131099734794843 + ], + [ + 15.37570224294096, + 14.13987786947962, + 8.369411839774873 + ], + [ + 13.658870223409673, + 13.449269764362498, + 8.631546470928022 + ], + [ + 18.14466413281842, + 15.317007529827379, + 15.255650385185707 + ], + [ + 18.398851725730662, + 15.442310112240875, + 16.681391828741745 + ], + [ + 19.474599107889052, + 16.45086696413739, + 17.03777168805867 + ], + [ + 19.437825617059705, + 17.015082926315245, + 18.139707600298358 + ], + [ + 18.618626180783966, + 14.028155769264117, + 17.24327730750443 + ], + [ + 19.298154490772642, + 13.959608675613481, + 18.68378556411329 + ], + [ + 17.274845334158275, + 13.207059522898817, + 17.177675868243075 + ], + [ + 18.57199826074774, + 14.516224250685354, + 14.812669120985795 + ], + [ + 17.578671739520768, + 15.8681393998462, + 17.25938029027594 + ], + [ + 19.4129298868475, + 13.577780150329659, + 16.648007294333592 + ], + [ + 19.422161540711333, + 12.94307211969442, + 19.0571114977749 + ], + [ + 20.33426564729283, + 14.29688385343809, + 18.655158784192277 + ], + [ + 18.789908799180655, + 14.592334268042805, + 19.411415307040926 + ], + [ + 16.927690751196536, + 13.13529369886976, + 16.146932897476532 + ], + [ + 17.499828731624305, + 12.204127644289713, + 17.540455850030714 + ], + [ + 16.45190554074719, + 13.678751815959231, + 17.71468561310446 + ], + [ + 20.374916362821427, + 16.873344838492244, + 16.125683031195663 + ], + [ + 21.413059855274774, + 17.918873382441575, + 16.39902682726179 + ], + [ + 20.69148815173214, + 19.230354597076598, + 16.30225415850307 + ], + [ + 21.069034854310598, + 20.136016662186307, + 17.08914002143831 + ], + [ + 22.63384688350414, + 17.653270370148107, + 15.546943625108167 + ], + [ + 23.834892170695166, + 18.588394276752638, + 15.795514746180471 + ], + [ + 24.86598798080694, + 18.04941927976347, + 16.197425192881425 + ], + [ + 23.74964255154255, + 19.825162546624142, + 15.681293474711063 + ], + [ + 20.466693927768493, + 16.31885218937316, + 15.286512275933227 + ], + [ + 21.76715142457216, + 17.810635378348593, + 17.42421117374194 + ], + [ + 22.89887084960929, + 16.65292736851893, + 15.889251418362678 + ], + [ + 22.32130067535981, + 17.596577320383858, + 14.504254510760653 + ], + [ + 19.70437284753612, + 19.28893486557388, + 15.460101961418573 + ], + [ + 18.846785602083038, + 20.44557985145218, + 15.061666210406834 + ], + [ + 17.418707361886188, + 20.452596433921144, + 15.830449564877055 + ], + [ + 16.525373816458856, + 21.25518107817311, + 15.513602870389912 + ], + [ + 18.619128338842422, + 20.331382044941734, + 13.551835043825715 + ], + [ + 19.860339093097902, + 20.998516208530873, + 12.789998787138673 + ], + [ + 19.841137572722147, + 20.565759314029606, + 11.32878106871425 + ], + [ + 20.7317581464333, + 19.726438684944583, + 10.923622989844347 + ], + [ + 18.89135608811659, + 20.871423187832193, + 10.61009885700172 + ], + [ + 19.653511656746588, + 18.540511369692467, + 14.783804909721045 + ], + [ + 19.382535553339853, + 21.39201770460511, + 15.134655774020189 + ], + [ + 18.602547743357107, + 19.263856241781582, + 13.332263669671384 + ], + [ + 17.693527901638543, + 20.846132271444617, + 13.29416024133977 + ], + [ + 19.761750954571806, + 22.0802484448501, + 12.880781926195224 + ], + [ + 20.774004301538508, + 20.6715684410766, + 13.286405190690758 + ], + [ + 21.487163905093148, + 19.438235877103693, + 11.528934719511216 + ], + [ + 20.735971233724673, + 19.516365796066225, + 9.935719406711959 + ], + [ + 17.264242709164524, + 19.604979222895622, + 16.8529849913901 + ], + [ + 16.081282827331346, + 19.339939722564623, + 17.69275524455919 + ], + [ + 14.736484151546717, + 19.492136342655044, + 16.977440079821797 + ], + [ + 13.943391728442503, + 20.387739485088446, + 17.304405013519798 + ], + [ + 16.247838801812108, + 20.059368108465833, + 19.08397102169345 + ], + [ + 17.99861748091627, + 18.93531940181265, + 17.032843646011592 + ], + [ + 16.199668808897723, + 18.290585228975374, + 17.9628273688722 + ], + [ + 17.216934223980882, + 19.82896820358951, + 19.526544855462003 + ], + [ + 16.247623305007952, + 21.148920829361145, + 19.052692157722593 + ], + [ + 15.32570533346733, + 19.99845730434538, + 19.661950143110467 + ], + [ + 14.546009367090761, + 18.64796420337791, + 15.930592557252654 + ], + [ + 13.345291825685578, + 18.493747681682407, + 15.09764388720198 + ], + [ + 12.107562041897355, + 17.875692131976848, + 15.873912135633127 + ], + [ + 12.187348963085451, + 17.514093842243142, + 17.023323575840656 + ], + [ + 13.53618351486067, + 17.69014684272804, + 13.778496751294801 + ], + [ + 14.246836045543134, + 18.404920401282766, + 12.65907627310634 + ], + [ + 15.45245969783078, + 19.001976154780323, + 12.667920678462036 + ], + [ + 13.785363455375393, + 18.407636497722365, + 11.317257530073851 + ], + [ + 14.830692155341337, + 18.92669501512944, + 10.497946970687304 + ], + [ + 12.703653114300131, + 17.85670131054917, + 10.644559342586149 + ], + [ + 15.766490363065293, + 19.45737967407797, + 11.393232390613267 + ], + [ + 14.729217855767168, + 18.92677150290274, + 9.065486298237383 + ], + [ + 12.459528325991643, + 18.003061445244384, + 9.303815315037806 + ], + [ + 13.465700747400275, + 18.5491482441754, + 8.479899880033793 + ], + [ + 15.31238255825252, + 18.06311995703379, + 15.62937901514122 + ], + [ + 12.985042145845926, + 19.453720748759338, + 14.727814550261572 + ], + [ + 13.973409551757554, + 16.74879620698698, + 14.111352831028672 + ], + [ + 12.569184518719608, + 17.435111630949564, + 13.344942252003083 + ], + [ + 16.074924998591598, + 19.044648527406366, + 13.54946096835908 + ], + [ + 16.673243521316113, + 19.833014250699534, + 11.154907359783238 + ], + [ + 11.973540675906793, + 17.318172752400073, + 11.23049710734751 + ], + [ + 15.474789416087013, + 19.381088583624546, + 8.429783093612977 + ], + [ + 11.501615765365463, + 17.744821551862174, + 8.877063544387708 + ], + [ + 13.24015703774388, + 18.521294206894822, + 7.4240814001896585 + ], + [ + 10.937986727108898, + 17.780129244601994, + 15.198709347749366 + ], + [ + 9.653495585965953, + 17.30521822116316, + 15.749755441051006 + ], + [ + 8.648031833660692, + 16.938353201896575, + 14.698727642285364 + ], + [ + 8.85594899675248, + 17.194777681394157, + 13.496922069389333 + ], + [ + 9.069399738397244, + 18.480356077455212, + 16.531639970453032 + ], + [ + 8.829253801755282, + 19.600517956444833, + 15.571927547728585 + ], + [ + 7.720591620452035, + 19.665193832181558, + 14.951688239680678 + ], + [ + 9.7458785312051, + 20.432873515234746, + 15.522079296736763 + ], + [ + 10.89363237550586, + 18.15698606462138, + 14.262700353805371 + ], + [ + 9.738831809148195, + 16.466884128256197, + 16.441139383640458 + ], + [ + 8.092629816737448, + 18.261394997124512, + 16.963010771452186 + ], + [ + 9.758616219983827, + 18.670414145328664, + 17.354415787446673 + ], + [ + 7.484996263532021, + 16.312408484716457, + 15.073962687514625 + ], + [ + 6.385956362813138, + 15.838597948628149, + 14.196377947857004 + ], + [ + 5.753188162494636, + 16.783278143970165, + 13.1742624537779 + ], + [ + 5.435708131435469, + 16.346353446311582, + 12.093098445322116 + ], + [ + 5.232984012487479, + 15.153770133807484, + 15.089315025382492 + ], + [ + 7.2227618394789985, + 16.255912117797834, + 16.0476879579679 + ], + [ + 6.715179703398608, + 15.019031457728829, + 13.557611403745602 + ], + [ + 5.617408112885443, + 14.306188825206164, + 15.656698226010159 + ], + [ + 4.9168635127788045, + 15.747924034844573, + 15.946722659237064 + ], + [ + 4.304416602852194, + 14.99653000360422, + 14.54055588477306 + ], + [ + 5.7237258328917395, + 18.07953048684385, + 13.441662092883261 + ], + [ + 5.1728830597369715, + 19.056355839646017, + 12.566719996470102 + ], + [ + 6.1536509992090975, + 19.663639101116132, + 11.564307853108517 + ], + [ + 5.81466029326495, + 19.88394574186691, + 10.391977415479376 + ], + [ + 4.528732220951216, + 20.120514619806045, + 13.443421274689713 + ], + [ + 3.429164717342005, + 19.558649485925912, + 14.310090257790085 + ], + [ + 2.5146967191039074, + 20.65941468999688, + 14.949848034294714 + ], + [ + 1.5478640794632859, + 20.204298390092845, + 15.737937527174388 + ], + [ + 2.7914221714378122, + 21.877366967636817, + 14.838118063869945 + ], + [ + 6.216996623160688, + 18.48308934461943, + 14.225194998482232 + ], + [ + 4.466912664641906, + 18.458419696268038, + 11.990369071907672 + ], + [ + 5.302068450078647, + 20.61001451527045, + 14.035400682399839 + ], + [ + 4.150759633339808, + 20.924981799866146, + 12.812492345802761 + ], + [ + 2.8641804189811304, + 18.846793389581308, + 13.70829700108535 + ], + [ + 3.899450614249289, + 18.998493619632768, + 15.118271001220947 + ], + [ + 1.4667265303974366, + 19.198019000670683, + 15.707660904280191 + ], + [ + 0.8789263566879958, + 20.83657598270713, + 16.153686040056353 + ], + [ + 7.435015932223797, + 19.68180260581221, + 11.941341786982271 + ], + [ + 8.531660126510996, + 20.15698679986997, + 10.974079678598134 + ], + [ + 8.799999605050242, + 19.135347416789386, + 9.846709250146606 + ], + [ + 9.11367359354926, + 19.510694774017338, + 8.74409269964873 + ], + [ + 9.853909698665626, + 20.53154586474045, + 11.691514625298815 + ], + [ + 10.867012045583, + 21.380285416766014, + 10.96939893961117 + ], + [ + 12.160034724604273, + 21.468357185282457, + 11.814430335237141 + ], + [ + 13.205078531814658, + 22.18377074357295, + 11.127688688157 + ], + [ + 14.350693637979802, + 22.589191844482116, + 11.547206105692243 + ], + [ + 14.675351445547534, + 22.716512767525728, + 12.825552484982508 + ], + [ + 15.213708276312419, + 22.983249047643994, + 10.66310417185472 + ], + [ + 7.763517669305103, + 19.429489734373192, + 12.862496525292132 + ], + [ + 8.263994212225994, + 21.1315159584982, + 10.56573171873108 + ], + [ + 9.57826176834089, + 21.116060745366894, + 12.56927424940302 + ], + [ + 10.308863728620272, + 19.58520167008544, + 11.9840007699238 + ], + [ + 11.065503320946645, + 20.84728739291893, + 10.039551143011064 + ], + [ + 10.42801195664907, + 22.3744719331321, + 10.88589612055015 + ], + [ + 11.991098961453739, + 21.8394914710791, + 12.825281811494248 + ], + [ + 12.495571834293163, + 20.441995852931882, + 11.963095279665488 + ], + [ + 13.116279355963288, + 22.0910675623345, + 10.12587993896914 + ], + [ + 14.124592682195223, + 22.270807585687407, + 13.545353987457244 + ], + [ + 15.589247624343374, + 23.104016997783333, + 13.011918009689555 + ], + [ + 14.932312882406906, + 22.95527793724102, + 9.693497561302362 + ], + [ + 16.150831778476064, + 23.160358828180392, + 10.995568376131633 + ], + [ + 8.419398881077623, + 17.88364373845002, + 10.106799750700457 + ], + [ + 8.541041846768545, + 16.703696518289917, + 9.242292056323 + ], + [ + 7.656752629708782, + 16.98416469517781, + 8.111495281288736 + ], + [ + 8.10971244463538, + 16.958506949673392, + 6.9623523224156365 + ], + [ + 8.234574949687474, + 15.40112847070668, + 9.985054746825952 + ], + [ + 9.240937882455716, + 14.988064836367471, + 11.086859534289866 + ], + [ + 8.056732382561638, + 14.193720578957254, + 9.039404466094233 + ], + [ + 10.629844269537953, + 14.541939752263488, + 10.56362146520296 + ], + [ + 8.031018960654276, + 17.661256318070514, + 11.012231598700275 + ], + [ + 9.559222113127197, + 16.65334883175956, + 8.856451002585604 + ], + [ + 7.268666278823934, + 15.354519319218184, + 10.487995461487516 + ], + [ + 9.41717657853396, + 15.788451627868312, + 11.805483975394298 + ], + [ + 8.925620221213777, + 14.163757664498576, + 11.726540880979092 + ], + [ + 7.256779523199249, + 14.444083792664628, + 8.342630533887553 + ], + [ + 8.925069988388875, + 14.020040260419592, + 8.40385425910079 + ], + [ + 7.696432892828243, + 13.282050321206157, + 9.516001398095142 + ], + [ + 11.143355810952896, + 15.223455178207814, + 9.885430083210924 + ], + [ + 11.361993825052958, + 14.48718075048123, + 11.36926324931476 + ], + [ + 10.619146982878295, + 13.551482405089473, + 10.108671452894589 + ], + [ + 6.378028064598626, + 17.24745590354769, + 8.36538712329114 + ], + [ + 5.290885089772982, + 17.367101512686986, + 7.387340349869287 + ], + [ + 5.282499037225204, + 18.75509391524554, + 6.761157523702451 + ], + [ + 5.104680562634987, + 18.906350828406858, + 5.550945731832671 + ], + [ + 3.8933180694330995, + 17.202699629342987, + 8.15308839467876 + ], + [ + 3.365666104651856, + 15.74499720678466, + 8.074489489521758 + ], + [ + 2.242343859260723, + 15.44647791539819, + 7.267513104355624 + ], + [ + 4.142491618366375, + 14.707356269334923, + 8.62032264142152 + ], + [ + 1.9298359929131026, + 14.092926864473725, + 6.997416117962845 + ], + [ + 3.7127787238676344, + 13.398442858517797, + 8.471868534808143 + ], + [ + 2.623182513676043, + 13.095376447057447, + 7.657544639204955 + ], + [ + 5.993667242997413, + 17.30944378039419, + 9.297333679445197 + ], + [ + 5.363196138160377, + 16.653814002299214, + 6.5663104729579835 + ], + [ + 4.103470942005065, + 17.418246857424606, + 9.200693797211462 + ], + [ + 3.1263140444137183, + 17.851781117458586, + 7.7305988181662215 + ], + [ + 1.7375666390707192, + 16.277498840592784, + 6.797395820774617 + ], + [ + 5.041343518838459, + 14.986937812442534, + 9.14975534693693 + ], + [ + 1.0473137326269593, + 13.967107599346718, + 6.387724316197299 + ], + [ + 4.206641993679067, + 12.615966693768655, + 9.028853293074981 + ], + [ + 2.496117669628885, + 12.047636782069787, + 7.42842010222761 + ], + [ + 5.680912063259575, + 19.785164124113635, + 7.524261926691398 + ], + [ + 5.835141359869361, + 21.15115146258654, + 7.094085257356969 + ], + [ + 7.067655961510828, + 21.302806424364007, + 6.107942384483035 + ], + [ + 6.988659639388231, + 22.124740914285667, + 5.133924802924819 + ], + [ + 5.903817545732206, + 22.19046732617403, + 8.21052728457244 + ], + [ + 5.6409246674407, + 23.631322145932018, + 7.725088994477355 + ], + [ + 4.365524584326387, + 23.953376256870115, + 6.834741696424147 + ], + [ + 4.0822707362580415, + 25.428316525970104, + 6.482797594516728 + ], + [ + 2.7534937084424267, + 25.632869807371208, + 5.874350285107627 + ], + [ + 5.934131093007817, + 19.621691020873982, + 8.488242012581301 + ], + [ + 4.972653507712397, + 21.324992561545628, + 6.450663504323463 + ], + [ + 5.112822374088005, + 22.0053232074913, + 8.937263417442042 + ], + [ + 6.834063799813091, + 22.13749720170199, + 8.776155890746923 + ], + [ + 5.5213008743474665, + 24.129394915905777, + 8.687231800213503 + ], + [ + 6.473246634797713, + 24.034924711006624, + 7.148508495575488 + ], + [ + 4.4097209037073455, + 23.358060990458853, + 5.922741316558066 + ], + [ + 3.5812978143216747, + 23.580279825542107, + 7.493444304326493 + ], + [ + 4.119428916052622, + 26.07424952758072, + 7.360003446394137 + ], + [ + 4.786774222802669, + 25.792164180628788, + 5.734875905387545 + ], + [ + 2.6248977875628836, + 26.58035351375088, + 5.5490153592415155 + ], + [ + 2.7188047915548217, + 25.0447693672495, + 5.053963919330779 + ], + [ + 2.010000960806653, + 25.38684922601726, + 6.512151821133323 + ], + [ + 8.057097178808375, + 20.444160925208735, + 6.2637737290628674 + ], + [ + 9.170149596111928, + 20.460143747878305, + 5.257050192911387 + ], + [ + 8.76119918647203, + 19.722828149849875, + 3.9680462873938884 + ], + [ + 9.31719269581114, + 19.95076951915587, + 2.905784057549803 + ], + [ + 10.434781318994663, + 19.799451727970904, + 5.870266693825517 + ], + [ + 11.72501372160684, + 20.333345751448064, + 5.186437042760057 + ], + [ + 11.979613310512434, + 21.801698706194543, + 5.613452986270092 + ], + [ + 11.442143059556267, + 22.249837448003746, + 6.622493354066906 + ], + [ + 12.77462327132469, + 22.49603129757884, + 4.9256994490195085 + ], + [ + 8.01519441580338, + 19.79562421735602, + 7.036912171749733 + ], + [ + 9.280203715280361, + 21.51045980204617, + 4.987195034091085 + ], + [ + 10.561797841488756, + 19.93761830507333, + 6.943987995031371 + ], + [ + 10.38376171456182, + 18.71571207784632, + 5.765354006254241 + ], + [ + 12.570211469077403, + 19.702318499780972, + 5.461286090654973 + ], + [ + 11.649732590994489, + 20.2136267764854, + 4.105651546281003 + ], + [ + 7.926028482716919, + 18.750818404815618, + 4.060998132889925 + ], + [ + 7.499505405997185, + 17.899699926942958, + 2.924920609001728 + ], + [ + 6.509332105960197, + 18.56603174939994, + 2.004995734667881 + ], + [ + 6.672615546927106, + 18.616555826101376, + 0.7419769297030678 + ], + [ + 6.944969933108055, + 16.534873953844226, + 3.442621552330699 + ], + [ + 7.589508056510791, + 18.48295978369731, + 4.974840513723466 + ], + [ + 8.38418407147343, + 17.815758498184664, + 2.293732932155618 + ], + [ + 7.684642645316484, + 15.978800037085307, + 4.018613111377579 + ], + [ + 6.054203853652906, + 16.64342571390523, + 4.061370209112518 + ], + [ + 6.641628838546872, + 15.892563975128041, + 2.6158673984175675 + ], + [ + 5.592422376127057, + 19.355604106341275, + 2.6422048430073404 + ], + [ + 4.7228277387809845, + 20.276696408982843, + 1.9000759764224104 + ], + [ + 5.424706407952107, + 21.143463660882503, + 0.8775067690604378 + ], + [ + 4.898011193640383, + 21.370366981836582, + -0.24797163121522744 + ], + [ + 4.017632636948891, + 21.28212974997382, + 2.900758086738962 + ], + [ + 2.803872494680966, + 22.05061645708406, + 2.2897552365119553 + ], + [ + 2.3177807058485977, + 23.20406300525849, + 3.27184046041052 + ], + [ + 3.1474476130223694, + 24.096277271042254, + 3.5853733288691716 + ], + [ + 1.117680906738088, + 23.22929304362242, + 3.6518819158361455 + ], + [ + 5.584017303514624, + 19.39417267578358, + 3.6514327176985693 + ], + [ + 3.948792199843606, + 19.694816454097804, + 1.3996949739876807 + ], + [ + 3.621589909006421, + 20.813570333668736, + 3.8017035086621465 + ], + [ + 4.802309333823078, + 21.97529161013415, + 3.2039202384394314 + ], + [ + 3.1141140889022565, + 22.49816358938142, + 1.3455347151732184 + ], + [ + 2.0703614428386783, + 21.25652819956815, + 2.150176434083174 + ], + [ + 6.6737158112519985, + 21.57061977720832, + 1.1668561373067454 + ], + [ + 7.475248284569698, + 22.548231861392992, + 0.30928790140121415 + ], + [ + 7.719668901364924, + 22.08754756378778, + -1.1241961558491396 + ], + [ + 7.818100024209496, + 22.829674086659224, + -2.1485036721310813 + ], + [ + 8.81057414410423, + 22.92152341459166, + 0.8977482910784869 + ], + [ + 8.621760113190113, + 23.71741303721751, + 2.196476313710999 + ], + [ + 10.009640881002994, + 24.049020314943164, + 2.879590883346054 + ], + [ + 9.876823734132476, + 24.459285121169614, + 4.327258371090542 + ], + [ + 11.25467757834061, + 24.803014930475683, + 4.871906266094493 + ], + [ + 7.060319383669852, + 21.243256790413284, + 2.0406242617752937 + ], + [ + 6.934069119563506, + 23.493503666246852, + 0.26818285192803515 + ], + [ + 9.458036965621389, + 22.067982303572876, + 1.0986449976313772 + ], + [ + 9.330356899670255, + 23.639754532694496, + 0.26365874265793837 + ], + [ + 8.043324381459092, + 24.619516079406367, + 1.9971749184326526 + ], + [ + 8.043374448666553, + 23.082936030877136, + 2.8680458455580413 + ], + [ + 10.688167103542709, + 23.205898711817667, + 2.7498008953457944 + ], + [ + 10.38088202921467, + 24.901627962932707, + 2.310960820713979 + ], + [ + 9.296598343125673, + 25.380965911373096, + 4.283125691458981 + ], + [ + 9.348353376050154, + 23.692668462067786, + 4.893932144961292 + ], + [ + 11.286374698367306, + 25.301285944270035, + 5.749869587767029 + ], + [ + 11.71191998973752, + 23.960737814806407, + 5.190646834255432 + ], + [ + 11.983660658467553, + 25.247223137322294, + 4.3321273157163835 + ], + [ + 7.791961658096023, + 20.714645106218654, + -1.3089826568524245 + ], + [ + 8.062440422480737, + 20.094930240124995, + -2.6384528244046215 + ], + [ + 6.968302310207367, + 20.458086382874058, + -3.6663310022254803 + ], + [ + 7.161917795746093, + 21.044600872431033, + -4.72979206067659 + ], + [ + 8.117582759727132, + 18.557004631175687, + -2.3367227378219106 + ], + [ + 8.959528220770935, + 17.86089721125586, + -3.380019289067533 + ], + [ + 10.263777472521243, + 17.408838861308823, + -3.0841556435912016 + ], + [ + 8.45821019904798, + 17.65951895293415, + -4.683359988542756 + ], + [ + 10.98464746597591, + 16.784013363178815, + -4.070829191647598 + ], + [ + 9.191022431371808, + 17.036054624973872, + -5.66160310163689 + ], + [ + 10.399075048862914, + 16.46542929958855, + -5.335046386274252 + ], + [ + 7.607273388889231, + 20.121435595035564, + -0.512683536978 + ], + [ + 9.058579695929415, + 20.39426279946838, + -2.9643479659935488 + ], + [ + 8.55011410942895, + 18.343978377663007, + -1.3591558339451695 + ], + [ + 7.151739683891858, + 18.058995861175504, + -2.251659294320321 + ], + [ + 10.595593916690053, + 17.46449854564605, + -2.057901254962868 + ], + [ + 7.429234210381742, + 17.967458728236124, + -4.796412007911191 + ], + [ + 11.923676969607259, + 16.285142934997793, + -3.8817526060235323 + ], + [ + 8.706118845859043, + 16.782188583444395, + -6.592633709346052 + ], + [ + 10.950042282512143, + 15.849660578207136, + -6.030506779238403 + ], + [ + 5.73590556580993, + 20.258295636092043, + -3.2992333350861673 + ], + [ + 4.517675408297228, + 20.607033053086752, + -4.0777040000676505 + ], + [ + 4.465160195257996, + 22.100711265670043, + -4.284565636193911 + ], + [ + 4.220526510695059, + 22.490995592340823, + -5.421366734192597 + ], + [ + 3.2534638685320174, + 20.13219695644625, + -3.3314954516457966 + ], + [ + 3.1961447857935643, + 18.634026257912865, + -3.039800089449329 + ], + [ + 2.781686094836947, + 17.776283002287528, + -4.058130735359402 + ], + [ + 3.673537018673082, + 18.107741987391478, + -1.7961527958905361 + ], + [ + 2.8453226598754338, + 16.405294300025844, + -3.895607428239947 + ], + [ + 3.9126187802304995, + 16.727996215574535, + -1.6539131949999273 + ], + [ + 3.5399524592598293, + 15.91003440693953, + -2.756745858368408 + ], + [ + 5.683087285125074, + 19.74209838579634, + -2.4327160094303646 + ], + [ + 4.468030982858127, + 20.052456111319543, + -5.014764269705265 + ], + [ + 3.219598094730903, + 20.551883807563172, + -2.3261015421374696 + ], + [ + 2.353965676428812, + 20.488334955751384, + -3.8336602937400293 + ], + [ + 2.373591016099502, + 18.143349387324633, + -4.988249764188063 + ], + [ + 3.9390069020859833, + 18.84636880439075, + -1.0542902192396215 + ], + [ + 2.467621983834199, + 15.795095137320573, + -4.702699344521704 + ], + [ + 4.156699491906286, + 16.30467385376346, + -0.6907811945630307 + ], + [ + 3.5665113585022166, + 14.837961483705499, + -2.6288668410738345 + ], + [ + 4.83198144322893, + 22.948372183994593, + -3.3001934127650263 + ], + [ + 4.700487143151792, + 24.41150992138205, + -3.4184767392113553 + ], + [ + 5.601586049981255, + 24.91765605387627, + -4.52897819589719 + ], + [ + 5.188234745046958, + 25.725065671745938, + -5.343670949935982 + ], + [ + 4.809894260048924, + 25.172389997486448, + -2.1012437601144542 + ], + [ + 4.46923594888576, + 26.633954272108895, + -2.3014466532836626 + ], + [ + 3.857054893601863, + 24.575836877927713, + -1.0423520320049493 + ], + [ + 5.022957395813597, + 22.5320476729529, + -2.4000263599265685 + ], + [ + 3.662322091802552, + 24.630786318655737, + -3.667936502862812 + ], + [ + 5.80628643383472, + 25.1751217036757, + -1.659322230143208 + ], + [ + 5.421799429067288, + 27.01779177217304, + -2.666670560912059 + ], + [ + 3.5766489892338953, + 26.78091382119078, + -2.9095493940181463 + ], + [ + 4.211283233361282, + 27.184113654724342, + -1.3965244055193244 + ], + [ + 4.195197654630176, + 23.63055570722406, + -0.6178476929234823 + ], + [ + 3.8916718017224916, + 25.280453172383318, + -0.21143684639669683 + ], + [ + 2.8766609703521366, + 24.397753049012977, + -1.484181652609535 + ], + [ + 6.803081404365678, + 24.314198742046074, + -4.627633791063089 + ], + [ + 7.924400735152255, + 24.461749900639802, + -5.5470028328070695 + ], + [ + 7.681839325831174, + 23.779482084762208, + -6.9568851371220095 + ], + [ + 8.560966369781356, + 23.881797749836892, + -7.766456748218819 + ], + [ + 9.335337939591149, + 24.05292275235638, + -4.936795128543108 + ], + [ + 9.57858464030008, + 24.42553840339508, + -3.6172760904882804 + ], + [ + 6.920188144316611, + 23.564606075915663, + -3.960932380136236 + ], + [ + 7.994829503506254, + 25.52955824026867, + -5.754198114090847 + ], + [ + 9.372145030972657, + 22.96431598229003, + -4.977790187593325 + ], + [ + 10.106785778152425, + 24.557017763746217, + -5.518907334209982 + ], + [ + 9.051296707776286, + 23.830816307470627, + -3.078875288119851 + ], + [ + 6.525926097292655, + 23.11290987216057, + -7.2332306994632125 + ], + [ + 5.94707328101511, + 22.87573689690987, + -8.64942207910005 + ], + [ + 4.682734231365384, + 23.663226913247513, + -9.069151055697304 + ], + [ + 4.3221458967232635, + 23.606416790360868, + -10.20925203016095 + ], + [ + 5.825064471023388, + 21.349270405180732, + -8.922619943029975 + ], + [ + 7.198427470537692, + 20.629642214483965, + -8.733990195825413 + ], + [ + 4.775941842005496, + 20.557340976041814, + -8.191886895955218 + ], + [ + 5.9147244098769916, + 22.96110349581147, + -6.44361772382064 + ], + [ + 6.692843875761896, + 23.19602554516223, + -9.376980849706886 + ], + [ + 5.503569586481111, + 21.255035907501338, + -9.959856569791596 + ], + [ + 7.521551638945891, + 20.508693191248653, + -7.700035509593556 + ], + [ + 7.157373126608548, + 19.594575324751986, + -9.07318532581857 + ], + [ + 8.050470789185297, + 21.11829137859229, + -9.206585571506775 + ], + [ + 4.896073380977299, + 19.545729296138234, + -8.579590892040542 + ], + [ + 4.800767192815287, + 20.62084455957961, + -7.104022373345844 + ], + [ + 3.7685010663013325, + 20.834273544633334, + -8.502479516279172 + ], + [ + 4.211039138159554, + 24.569731904838477, + -8.200459921159077 + ], + [ + 3.19815089586337, + 25.564656762363143, + -8.520838324686737 + ], + [ + 1.907858778731244, + 25.126494211557088, + -7.898323774439684 + ], + [ + 0.8714349590154353, + 25.82181490009441, + -8.05846964463074 + ], + [ + 4.781085718029208, + 24.755793876800794, + -7.387731314145749 + ], + [ + 3.473666033779354, + 26.430999429072244, + -7.919473549709696 + ], + [ + 3.121926901061078, + 25.912644911374514, + -9.550981130769909 + ], + [ + 1.86824696662459, + 24.146624957572612, + -7.00532507417293 + ], + [ + 0.6874039781982088, + 23.66658613137281, + -6.336376594830938 + ], + [ + 0.5465392964887706, + 24.420785234625782, + -4.999615807686538 + ], + [ + 1.4273423113906707, + 24.898691769023003, + -4.348128136053029 + ], + [ + 0.7131171122706975, + 22.073188155082107, + -6.256031193623239 + ], + [ + 0.6485200778968984, + 21.266441951572688, + -7.616293618323333 + ], + [ + 0.8637246818475428, + 19.84342439274303, + -7.261085907302326 + ], + [ + -0.6757348151870858, + 21.60004259432901, + -8.293007441971566 + ], + [ + 2.762881935955063, + 23.860268783115657, + -6.6342079856896135 + ], + [ + -0.16551330550303153, + 23.850542348106956, + -6.989670734892888 + ], + [ + 1.7465332323605385, + 21.938560308225988, + -5.936616340394982 + ], + [ + -0.0005632336348547012, + 21.705074355843294, + -5.518974670152323 + ], + [ + 1.4244020611201422, + 21.76853423208206, + -8.19422904533312 + ], + [ + -0.016464938935897604, + 19.411799205091597, + -6.784574046695344 + ], + [ + 1.191394445769468, + 19.240146593033842, + -8.107719692052507 + ], + [ + 1.6855747852479142, + 19.79457836412928, + -6.546749455526961 + ], + [ + -1.5261399908345077, + 21.146691757110716, + -7.783708863545963 + ], + [ + -0.826397077652177, + 22.66981464046421, + -8.437882349162878 + ], + [ + -0.6281413432679488, + 21.227130358046907, + -9.316125834611624 + ], + [ + -0.6912039521843936, + 24.468394971067028, + -4.477258117667944 + ], + [ + -1.01592469228992, + 25.06314672551582, + -3.1755423742191864 + ], + [ + -0.47310339398463214, + 24.281646170119984, + -1.951678869074574 + ], + [ + -0.2957289867456323, + 23.08656061474653, + -1.9254659573625568 + ], + [ + -2.548091583623803, + 25.218307637065323, + -3.1880250405820028 + ], + [ + -3.0021576474467557, + 24.02392764237618, + -3.9803735194432335 + ], + [ + -1.8811420912473538, + 23.771925404955255, + -5.003819378788171 + ], + [ + -0.7100499218135097, + 26.107531074815597, + -3.1138886050369576 + ], + [ + -2.9575942364098413, + 25.12011138492403, + -2.182656457859863 + ], + [ + -2.7723596577143166, + 26.133850673705297, + -3.7353676740891806 + ], + [ + -3.0908145199669823, + 23.143289566934982, + -3.3442028128962926 + ], + [ + -3.915805874726556, + 24.277256708517598, + -4.518120390514997 + ], + [ + -1.7192027596576616, + 22.694076874349662, + -4.99286636766483 + ], + [ + -2.1131804566893493, + 24.066208210285936, + -6.027369788190797 + ], + [ + -0.21363256057628616, + 25.069292283954155, + -0.883608428983409 + ], + [ + -0.010040674333127223, + 24.52380802135974, + 0.4511411324529789 + ], + [ + -1.3009509287020593, + 23.938144263158847, + 0.9598231995864316 + ], + [ + -2.3373548080704825, + 24.131244671239642, + 0.32704376599253454 + ], + [ + 0.3184461463720951, + 25.718125577050273, + 1.3473432812458823 + ], + [ + 1.5723473044512952, + 26.459050149198447, + 1.0244479127267652 + ], + [ + 2.5542999985772323, + 26.10980229339009, + 1.7353059330465348 + ], + [ + 1.6131024381711436, + 27.372532698884243, + 0.23400751443274037 + ], + [ + -0.35733664986998503, + 26.06869870060416, + -0.9087840657493624 + ], + [ + 0.7211586429814794, + 23.722316059583477, + 0.34597159358036705 + ], + [ + -0.47730911780450846, + 26.461582050592142, + 1.3936563375817013 + ], + [ + 0.42103419977895473, + 25.41889916400453, + 2.390434956747866 + ], + [ + 2.642053186922937, + 25.39661624637506, + 2.4450689844231 + ], + [ + 3.3485971858217463, + 26.716373750276034, + 1.5894919807943226 + ], + [ + -1.3079165343136283, + 23.275223171001016, + 2.0952399308278653 + ], + [ + -2.5108978403237763, + 22.599953205892803, + 2.7552276428831504 + ], + [ + -3.451336170106594, + 23.711361137277095, + 3.2535009906666277 + ], + [ + -3.0612207129771916, + 24.8918344060005, + 3.405533249489338 + ], + [ + -2.0830989230934804, + 21.679894268678254, + 3.8922082681536234 + ], + [ + -1.1473857615700331, + 20.561579023072568, + 3.459177040284001 + ], + [ + -2.0283301769327338, + 19.250597320426436, + 2.541895368466702 + ], + [ + -1.6019968287372623, + 19.73753409499784, + 0.8163630165652173 + ], + [ + -0.4451900570912804, + 23.22035802292112, + 2.6175358750002062 + ], + [ + -3.002732323145242, + 21.99297745649085, + 1.9951109315672968 + ], + [ + -1.5608588876909213, + 22.231784772530204, + 4.673731800978461 + ], + [ + -2.9096318144374194, + 21.20698597611988, + 4.422587423053076 + ], + [ + -0.2933247317215498, + 20.987751725170256, + 2.932816226028522 + ], + [ + -0.7753432445433528, + 20.07834644209379, + 4.362597940447573 + ], + [ + -0.5230520638853514, + 19.859438434911908, + 0.7208820278852613 + ], + [ + -2.0802932613728315, + 19.037909798481223, + 0.13089963154430856 + ], + [ + -1.8972651745359141, + 20.763525476281643, + 0.5966768314222207 + ], + [ + -4.719123715755512, + 23.334012610143645, + 3.3009952868716215 + ], + [ + -5.84179064479321, + 24.33367658766292, + 3.4978974548569988 + ], + [ + -5.781657649153414, + 25.031764884813697, + 4.90115030577703 + ], + [ + -5.0086866168042965, + 24.576025755898513, + 5.787600267391086 + ], + [ + -7.226504166145728, + 23.627809952260122, + 3.3267916656629946 + ], + [ + -7.516815056654225, + 23.442069541140654, + 1.9068631019766331 + ], + [ + -7.3527463620546945, + 22.390244024181357, + 4.067835712009961 + ], + [ + -4.9252628732326285, + 22.347379651634583, + 3.365490531893841 + ], + [ + -5.807053548739275, + 25.1328520625907, + 2.757485821655315 + ], + [ + -8.047836943881112, + 24.206141811049065, + 3.7499232089064676 + ], + [ + -8.205213496461976, + 22.04804397034127, + 3.788909050120848 + ], + [ + -7.327219103769617, + 24.32155249510754, + 1.2915045775973593 + ], + [ + -6.8352597657548655, + 22.6461081136664, + 1.606818743049932 + ], + [ + -8.554615189070903, + 23.11782850427619, + 1.8298040713769974 + ], + [ + -6.501132949863163, + 26.165035831561795, + 4.969625186247936 + ], + [ + -6.21450211694399, + 27.13369416334558, + 6.079003795306923 + ], + [ + -6.320945358402127, + 26.71423209262366, + 7.551608088359411 + ], + [ + -5.573751173166868, + 27.281943077748792, + 8.335230731744225 + ], + [ + -7.207176524604435, + 28.270043352725224, + 5.7142367201134565 + ], + [ + -7.0039048958021946, + 29.490638360981393, + 6.655651293588904 + ], + [ + -7.676473691103285, + 30.780347096800597, + 6.11785441547874 + ], + [ + -8.924836893817215, + 30.923401086519334, + 6.522079077391611 + ], + [ + -7.154426749103369, + 31.60127319689468, + 5.331516730206004 + ], + [ + -7.035370800402113, + 26.46074848996068, + 4.1651111873651425 + ], + [ + -5.159150374300671, + 27.355720998508104, + 5.9207798047957985 + ], + [ + -6.909756183002611, + 28.58010605397999, + 4.712486863242889 + ], + [ + -8.231488269288914, + 27.905309064286257, + 5.7907366516856165 + ], + [ + -7.42761202804137, + 29.359497732197724, + 7.651327784812521 + ], + [ + -5.929034718101637, + 29.658474389249022, + 6.587957998923868 + ], + [ + -9.266080018719595, + 30.24412409867523, + 7.187083725492709 + ], + [ + -9.50196920112877, + 31.688765843699002, + 6.203905541989312 + ], + [ + -7.144245622791614, + 25.672788620158485, + 7.87508354851394 + ], + [ + -7.295164533009726, + 24.985839440359996, + 9.180755631440027 + ], + [ + -6.647582260664618, + 23.652243893391756, + 9.348384080023868 + ], + [ + -6.703989608949002, + 23.081880811800602, + 10.435235561138759 + ], + [ + -7.801209230676796, + 25.363937235476783, + 7.172863392847164 + ], + [ + -6.730133780005484, + 25.490561963685877, + 9.964397797727836 + ], + [ + -8.339527797026209, + 24.82528848225536, + 9.448394988244182 + ], + [ + -5.918428192124041, + 23.279807754474064, + 8.325662925699708 + ], + [ + -5.241699787003956, + 21.96651893082924, + 8.213584951017063 + ], + [ + -4.442116859078126, + 21.45614567812902, + 9.413145028486756 + ], + [ + -4.682641939905183, + 20.288409965122355, + 9.85582276093694 + ], + [ + -4.340970399709719, + 21.925791533009942, + 7.02115925939258 + ], + [ + -3.558457059482894, + 20.570492190124355, + 6.922233276492291 + ], + [ + -2.1785007426770986, + 20.458033309725238, + 7.09892700179637 + ], + [ + -4.294043402919649, + 19.450277237985915, + 6.435512387829489 + ], + [ + -1.5567961222074649, + 19.17772164319706, + 6.9137821314147905 + ], + [ + -3.628971195829476, + 18.239247884317024, + 6.220306256642333 + ], + [ + -2.234671078534546, + 18.10648228059449, + 6.473543560361119 + ], + [ + -5.832842718740755, + 23.971975273581506, + 7.595129729898784 + ], + [ + -6.078722221263069, + 21.311755493839996, + 7.971133604129276 + ], + [ + -4.990768783035885, + 22.157026559492692, + 6.177124894452117 + ], + [ + -3.587713401649803, + 22.67815024677884, + 7.254948755593469 + ], + [ + -1.6277277676188133, + 21.3301156813817, + 7.419111002531071 + ], + [ + -5.328169038950764, + 19.638404379827307, + 6.187329502884646 + ], + [ + -0.5393192635107845, + 19.03887135905984, + 7.248240491508553 + ], + [ + -4.162030032257916, + 17.3724384860933, + 5.858523442809166 + ], + [ + -1.7747082698195658, + 17.155628429264766, + 6.248351479670267 + ], + [ + -3.6192466311730263, + 22.33707409491376, + 10.003750758952345 + ], + [ + -2.7679843197516623, + 21.9565333739763, + 11.163117284106733 + ], + [ + -3.49840255548203, + 21.965910150592777, + 12.498404959455065 + ], + [ + -3.0359394791913403, + 21.333938509071686, + 13.496123189089568 + ], + [ + -1.659478319714968, + 23.001425040139793, + 11.09812053388664 + ], + [ + -0.8523197299805453, + 23.052401799581162, + 9.766513631513888 + ], + [ + -1.15511089025944, + 23.923658415480986, + 8.76061821708477 + ], + [ + 0.24651253680988178, + 22.232228089420346, + 9.297713032396118 + ], + [ + 0.5248470493014593, + 22.644568992350628, + 7.966323893350929 + ], + [ + 1.0223493923473232, + 21.195231834631272, + 9.783256648226647 + ], + [ + -0.2613599993151466, + 23.71121752758029, + 7.713848668257033 + ], + [ + 1.3799999189834993, + 21.955654545070843, + 7.130268816626777 + ], + [ + 1.816905610827654, + 20.417480741102054, + 8.967426350172168 + ], + [ + 2.0373638312297633, + 20.815401357303017, + 7.634061019981111 + ], + [ + -3.563630724226784, + 23.265470199417905, + 9.60994639072231 + ], + [ + -2.5277113632100257, + 20.895156251204412, + 11.10108651634029 + ], + [ + -2.1380397546362064, + 23.948816648996512, + 11.346182069514478 + ], + [ + -0.8723475041511466, + 22.755192166190568, + 11.810788313569795 + ], + [ + -1.9636123665043843, + 24.638221242415398, + 8.806773909452039 + ], + [ + -0.3500296383870544, + 24.26135193459629, + 6.871477873918574 + ], + [ + 0.8468919182442228, + 21.004067035507433, + 10.831621499713473 + ], + [ + 1.5651592384932147, + 22.203064394143894, + 6.095423566431669 + ], + [ + 2.3228422485560185, + 19.541652029528905, + 9.34604552709586 + ], + [ + 2.70152145573533, + 20.218651554898656, + 7.026456194721659 + ], + [ + -4.654573053584267, + 22.60981388474852, + 12.574177048124419 + ], + [ + -5.607670024089094, + 22.585309699743448, + 13.712397889219742 + ], + [ + -6.687376036236275, + 21.543332373840144, + 13.635911769637383 + ], + [ + -7.270904349058105, + 21.124426010205866, + 14.646563493755123 + ], + [ + -5.989350365870845, + 24.030642956676843, + 14.1586478048272 + ], + [ + -4.800313266385791, + 24.933206486480458, + 14.34728685503044 + ], + [ + -5.1011210512845375, + 26.31355167268407, + 14.93442880933538 + ], + [ + -6.108619999879994, + 26.942465364248164, + 14.609171594316999 + ], + [ + -4.219869155082784, + 26.745941738068495, + 15.712417113638208 + ], + [ + -5.016325911264093, + 23.026044737292295, + 11.7280162243602 + ], + [ + -4.990977954829449, + 22.17223513857948, + 14.510619599543329 + ], + [ + -6.626796376554047, + 24.42745996357735, + 13.368521312291415 + ], + [ + -6.586692560583102, + 24.061220895271845, + 15.06988101436207 + ], + [ + -4.132973016293195, + 24.43242386396696, + 15.048695338651918 + ], + [ + -4.230628443854505, + 25.137681719133298, + 13.44078339057483 + ], + [ + -6.835112129933182, + 21.007818058349017, + 12.456123018302081 + ], + [ + -7.781318874469333, + 19.89094047068636, + 12.204219992971733 + ], + [ + -7.184692281577199, + 18.46692700982885, + 12.09507197664022 + ], + [ + -7.763036556621282, + 17.51929032790258, + 12.581671647321869 + ], + [ + -8.530597029243532, + 20.223390674893267, + 10.924632637047575 + ], + [ + -9.474097215030397, + 21.382609708489326, + 11.102413627389671 + ], + [ + -10.100028700898854, + 21.87236560384804, + 10.044230265349183 + ], + [ + -9.750952550116967, + 21.842964640376863, + 12.200749165906148 + ], + [ + -6.36256562122797, + 21.377430393554505, + 11.643602731584135 + ], + [ + -8.52124520062265, + 19.857766630724086, + 13.003913745381267 + ], + [ + -7.860908352486391, + 20.51959347943125, + 10.117242489144518 + ], + [ + -9.148325495810532, + 19.443457338362578, + 10.47942000390454 + ], + [ + -10.016986356323708, + 21.377029222988426, + 9.167960596370287 + ], + [ + -10.751371319235922, + 22.640390262368555, + 10.121624179515246 + ], + [ + -6.003784663462662, + 18.35954598099181, + 11.567726196217103 + ], + [ + -5.350920052166184, + 17.030336773676026, + 11.366224650437099 + ], + [ + -4.752423090966424, + 16.53276663764109, + 12.728259595886248 + ], + [ + -4.666823188549107, + 17.35718151678259, + 13.618330603264663 + ], + [ + -4.140822612685675, + 17.19105787805188, + 10.395729771686273 + ], + [ + -4.669885032609731, + 17.246797172112338, + 9.060446050982685 + ], + [ + -5.620446342500247, + 19.11925688684721, + 11.023673297701588 + ], + [ + -6.15745625660703, + 16.395408645570683, + 10.999530620937621 + ], + [ + -3.5585606780715384, + 18.10358198910899, + 10.523673458401863 + ], + [ + -3.4924395949181113, + 16.31753784845239, + 10.46402477772107 + ], + [ + -4.643409795628185, + 18.162861574390718, + 8.77456437171546 + ], + [ + -4.442898051641272, + 15.288415151388222, + 12.808458628027832 + ], + [ + -3.683483681803309, + 14.636397469362919, + 13.950047225184004 + ], + [ + -2.350807124448668, + 14.18079258429475, + 13.330919247339276 + ], + [ + -2.2950430015029024, + 13.539612751453433, + 12.246342159735148 + ], + [ + -4.4199511911645395, + 13.457327517133308, + 14.490879866112666 + ], + [ + -3.539160453601452, + 12.439828620148148, + 15.218525230206852 + ], + [ + -4.591846753336913, + 11.18261235871887, + 16.05777103346259 + ], + [ + -3.3451658100579413, + 9.962258521094839, + 16.523288108409538 + ], + [ + -4.651569135162367, + 14.628285082468324, + 12.07307867693286 + ], + [ + -3.56004066418385, + 15.343260006793571, + 14.77053933794393 + ], + [ + -5.239554386261081, + 13.739263010488571, + 15.1518357142914 + ], + [ + -4.944690056845415, + 12.932480124067467, + 13.69257858304432 + ], + [ + -2.904884188442212, + 11.920294005376661, + 14.500278497338849 + ], + [ + -2.9378873799118357, + 13.021571989723725, + 15.917200402233284 + ], + [ + -3.839433242857669, + 9.029088174659364, + 16.793460156821688 + ], + [ + -2.674975814334604, + 9.58452911606986, + 15.751108121747572 + ], + [ + -2.7612714363464863, + 10.218772756652925, + 17.407240096966614 + ], + [ + -1.2466841873910826, + 14.468544270370671, + 13.996612570194685 + ], + [ + 0.07612920289954708, + 13.93753180667943, + 13.606748111178852 + ], + [ + 0.8228982589292632, + 13.392184909881962, + 14.860652755414835 + ], + [ + 2.0056128177458588, + 13.091171960988447, + 14.872781492354713 + ], + [ + 0.9235147790272548, + 14.998691953931143, + 12.953398053595494 + ], + [ + 0.4792490955357884, + 15.820362639083669, + 11.732344102202633 + ], + [ + -0.6348836489056091, + 16.91277350514042, + 11.907854664836584 + ], + [ + 1.7231194116997581, + 16.460596521096022, + 11.079545850337878 + ], + [ + -1.3455227232576257, + 14.999525514562606, + 14.850069369675786 + ], + [ + -0.024913656595395173, + 13.073248846437025, + 12.950316034147452 + ], + [ + 1.0900099762604967, + 15.6755338208294, + 13.791408207333724 + ], + [ + 1.8910275824869538, + 14.572473983559462, + 12.688143115058539 + ], + [ + 0.20190751748694089, + 15.14021931013383, + 10.926994232652657 + ], + [ + -1.4499947007212663, + 16.564565258658945, + 12.542241185479273 + ], + [ + -0.1238405829754462, + 17.76766173755425, + 12.350682129619646 + ], + [ + -0.8861525367158559, + 17.123907856995174, + 10.868438120118169 + ], + [ + 1.4270871166096915, + 16.81911032429832, + 10.093680888780582 + ], + [ + 2.199103749545241, + 17.13616307144764, + 11.790281116321518 + ], + [ + 2.4908169086426386, + 15.695019471321075, + 10.967150969819652 + ], + [ + 0.1162842866485416, + 13.17400587800887, + 16.00358773859701 + ], + [ + 0.6139879551319563, + 12.743482738682928, + 17.378970582449423 + ], + [ + -0.3730921924323142, + 12.0194549400465, + 18.265682486275452 + ], + [ + -1.5998377230467242, + 12.187703846192449, + 18.140080242936975 + ], + [ + 1.1720334878642207, + 13.942584682642064, + 18.15850423258164 + ], + [ + 2.516052307992494, + 14.467231490424865, + 17.654680749153798 + ], + [ + 0.18991042705844954, + 14.949824071667877, + 18.354892052841457 + ], + [ + -0.8769473757933048, + 13.326794107611136, + 15.902360109810076 + ], + [ + 1.4726232606168916, + 12.07819442799024, + 17.288212367566256 + ], + [ + 1.3635759703663128, + 13.6114815998302, + 19.179178939234063 + ], + [ + 0.24937837553436637, + 15.30707816807319, + 19.24395469195481 + ], + [ + 2.823304412593471, + 15.278231350714691, + 18.314965305714914 + ], + [ + 3.1378882163396407, + 13.572909908437964, + 17.694783768897707 + ], + [ + 2.2498812669967965, + 14.850510161451439, + 16.66961656536591 + ], + [ + 0.16781228382547633, + 11.314323523852352, + 19.230856729115306 + ], + [ + -0.5817804554115228, + 10.505828247894328, + 20.234090724486386 + ], + [ + -1.2011042644731416, + 11.3635699425447, + 21.284558182804304 + ], + [ + -0.4596165730264999, + 12.04174410157583, + 21.97455744562957 + ], + [ + 0.40548485939572576, + 9.336702486681077, + 20.763155099370323 + ], + [ + -0.2623904742952274, + 8.36323713249169, + 21.763747928739225 + ], + [ + 0.576800603050542, + 7.595489547027512, + 22.35759743653519 + ], + [ + -1.4934242085590181, + 8.344826993751099, + 21.94485854272658 + ], + [ + 1.155959170032021, + 11.133015501146815, + 19.126964444057638 + ], + [ + -1.4024237949292577, + 10.121900211282195, + 19.628085954166323 + ], + [ + 0.7051102598668284, + 8.854959856306664, + 19.832431589153533 + ], + [ + 1.1777694980645774, + 9.899408205580016, + 21.287595800103425 + ], + [ + -2.5155949294348705, + 11.206672446346317, + 21.574755980967247 + ], + [ + -3.06106517886614, + 11.678361617456801, + 22.871955838869933 + ], + [ + -2.3042461455657293, + 11.298350067032572, + 24.11592799173546 + ], + [ + -2.229530530038846, + 12.10556222156913, + 25.03409186679186 + ], + [ + -4.505516258463364, + 11.26300022796869, + 22.903651516835062 + ], + [ + -4.838796075141513, + 10.657383307274017, + 21.553775042019364 + ], + [ + -3.4974928148232975, + 10.535325211325869, + 20.786407500664335 + ], + [ + -3.037734539054942, + 12.767977557838208, + 22.85487716312629 + ], + [ + -4.595849433056357, + 10.515901219345324, + 23.69218430105484 + ], + [ + -5.157148831012719, + 12.072251015809911, + 23.23317956901724 + ], + [ + -5.106822422267136, + 9.613626469910287, + 21.717579129291522 + ], + [ + -5.566859030659566, + 11.14211676568192, + 20.903348004119955 + ], + [ + -3.2122610490661385, + 9.493695982839824, + 20.63891257023254 + ], + [ + -3.5539505804770424, + 10.970642104770207, + 19.78870096919107 + ], + [ + -1.7034933286186744, + 10.114660409393196, + 24.175029651352126 + ], + [ + -0.5543682275378083, + 9.922113366937594, + 25.118927756423183 + ], + [ + -0.8837781059916887, + 9.46746067659825, + 26.495158246890764 + ], + [ + -0.14683474557870008, + 8.740105659823314, + 27.168472309948356 + ], + [ + -1.9390379644635478, + 9.486892473453622, + 23.419698878985912 + ], + [ + 0.16714709900812583, + 9.243122037512137, + 24.66452013729461 + ], + [ + -0.03430044701426487, + 10.873565852166507, + 25.230134670577947 + ], + [ + -2.0542317083428063, + 9.954997646043807, + 26.97982227176394 + ], + [ + -2.750449928793443, + 9.574964241970065, + 28.222508244773298 + ], + [ + -4.311799928394971, + 9.708469747826143, + 28.095404359662922 + ], + [ + -4.819130911932154, + 10.64948009102477, + 27.435530271680605 + ], + [ + -2.2941301820658975, + 10.434255984760966, + 29.378069856518486 + ], + [ + -2.8609886421791506, + 9.936772482836602, + 30.652100206310216 + ], + [ + -3.493488154824728, + 10.817119436446774, + 31.366055803149372 + ], + [ + -2.6675915657647478, + 8.83620942502364, + 31.10285986473962 + ], + [ + -2.6214328792849817, + 10.475079382540628, + 26.325680104870536 + ], + [ + -2.4789289892718833, + 8.568143974722432, + 28.53982326785774 + ], + [ + -1.2101253619554764, + 10.442685249573515, + 29.491927322734693 + ], + [ + -2.5722739506563292, + 11.474652043024435, + 29.209812331691122 + ], + [ + -3.764749765383604, + 11.665040257103044, + 30.88903743830082 + ], + [ + -4.0339390317563515, + 10.52721438540624, + 32.168534337399706 + ], + [ + -5.127403038417964, + 8.841697813001588, + 28.79620726581728 + ], + [ + -6.602538428186894, + 8.825780551280559, + 28.82404263657425 + ], + [ + -7.15683045815116, + 8.37713527309512, + 27.411382190479056 + ], + [ + -7.506671397900516, + 7.230801307350021, + 27.33404219024884 + ], + [ + -7.251772981023553, + 10.00693206362638, + 29.5074218433763 + ], + [ + -8.629124183210983, + 9.55615449363836, + 30.010068349908394 + ], + [ + -6.486791490268347, + 10.630399513536588, + 30.648144823917647 + ], + [ + -4.6349325533460455, + 8.123153719418212, + 29.307348528082414 + ], + [ + -6.745258303538752, + 7.955235739964905, + 29.46426407507809 + ], + [ + -7.451303095178056, + 10.671741155004725, + 28.66699602367786 + ], + [ + -8.554710898853628, + 8.9364396275447, + 30.90366410237233 + ], + [ + -9.19277435982963, + 10.455063000560756, + 30.259789988250425 + ], + [ + -9.066166697502606, + 9.06638142755503, + 29.13988728627205 + ], + [ + -5.807337772937032, + 11.304956113085666, + 30.12716937006753 + ], + [ + -7.151651362433816, + 11.280758659661274, + 31.216558248411 + ], + [ + -6.116023198613845, + 9.908694445648507, + 31.37599624607148 + ], + [ + -7.009071747247754, + 9.136900813074305, + 26.31114143432728 + ], + [ + -7.479411426184179, + 8.748591119734613, + 24.94151862269298 + ], + [ + -6.414677369218857, + 7.986575434342967, + 24.158294737703226 + ], + [ + -5.277092303473364, + 8.325166514063312, + 24.26255843500888 + ], + [ + -7.962879811508659, + 10.035063173963295, + 24.29456626932962 + ], + [ + -9.358815260868857, + 10.375347911520976, + 24.933095612823838 + ], + [ + -9.3430447744798, + 10.953976355553323, + 26.293496195913978 + ], + [ + -8.570390338196091, + 11.933922097311097, + 26.56062264316498 + ], + [ + -10.044679565581575, + 10.408661458742642, + 27.17793529990155 + ], + [ + -6.276172979147261, + 9.815908532736898, + 26.459146774919514 + ], + [ + -8.299618643171312, + 8.031545562117913, + 24.9762035536171 + ], + [ + -7.255382019864108, + 10.864185173112617, + 24.30472346626096 + ], + [ + -8.125833884366179, + 9.952859890828847, + 23.219953650543236 + ], + [ + -9.823915611427879, + 11.100891416848697, + 24.265733535505433 + ], + [ + -10.08425099806494, + 9.569245610184737, + 25.042832219829148 + ], + [ + -8.088596237344804, + 12.486215332704091, + 25.86568122634283 + ], + [ + -8.603177081776213, + 12.270477665676708, + 27.51233345647249 + ], + [ + -6.857364331714198, + 7.003136230612881, + 23.400052771628115 + ], + [ + -6.106294524142751, + 6.090791241433038, + 22.521113043998714 + ], + [ + -6.576026638648156, + 6.299507643066562, + 21.005250266618127 + ], + [ + -7.766663415186224, + 6.2970662782208535, + 20.74157511055789 + ], + [ + -6.348368852745627, + 4.659773685906288, + 22.99580248212565 + ], + [ + -5.3935801428144625, + 4.2497266356874945, + 24.11412550879475 + ], + [ + -5.525185831594878, + 2.7855414840983315, + 24.58769260254271 + ], + [ + -6.749605980796107, + 2.4119234920100467, + 25.38442834345221 + ], + [ + -6.704069889781025, + 0.9573768730268526, + 25.81993261548219 + ], + [ + -7.764647444717794, + 6.677199194448633, + 23.70121796948651 + ], + [ + -5.026278584627599, + 6.154763117460419, + 22.6536787929204 + ], + [ + -7.360681008088933, + 4.499822922675804, + 23.366935258188565 + ], + [ + -6.105773785592585, + 4.058956763229872, + 22.119293201126013 + ], + [ + -4.3949171410617485, + 4.257277461838328, + 23.677419303648307 + ], + [ + -5.467693726125293, + 4.950858443776838, + 24.945402406475814 + ], + [ + -5.423131968646199, + 2.1044043994612167, + 23.742860196167793 + ], + [ + -4.618677697347061, + 2.511269987578885, + 25.12724669360806 + ], + [ + -7.00151304987091, + 3.0891179441285885, + 26.200549744013237 + ], + [ + -7.643954110256467, + 2.556285773871565, + 24.778293992339467 + ], + [ + -5.971710771526047, + 0.8781021740491539, + 26.510921569943616 + ], + [ + -7.583329613267635, + 0.8108795676565634, + 26.294842122783322 + ], + [ + -6.506488654338794, + 0.312013505327398, + 25.06855421356467 + ], + [ + -5.667145052993525, + 6.171305159411304, + 20.078914614943596 + ], + [ + -5.989017330363072, + 6.436410610934587, + 18.612239710766158 + ], + [ + -5.51545803285511, + 5.398116015218136, + 17.64099330717529 + ], + [ + -4.7981126965332255, + 4.450912894088475, + 17.98041015269968 + ], + [ + -5.5284435789340565, + 7.8562831954529315, + 18.405054543376657 + ], + [ + -4.712722803272737, + 6.043878870557535, + 20.383772989514956 + ], + [ + -7.074861959986524, + 6.499434584914297, + 18.541035882433512 + ], + [ + -6.079451794775863, + 8.559468075865368, + 19.029570961811682 + ], + [ + -4.466929868145626, + 7.820426820012813, + 18.65000737302144 + ], + [ + -5.625549902113689, + 8.145136929854345, + 17.358519162193172 + ], + [ + -5.910733586554679, + 5.52497098723461, + 16.347942535688443 + ], + [ + -5.578992777564602, + 4.625543456136256, + 15.184014065436491 + ], + [ + -4.374991755243023, + 5.1761032288303, + 14.485240423581669 + ], + [ + -4.559537283637464, + 5.753747087903292, + 13.38414583661015 + ], + [ + -6.761326711704102, + 4.403781986717831, + 14.244405539131648 + ], + [ + -6.650399071769263, + 3.3974405485408, + 13.090290152324377 + ], + [ + -7.9432149630819975, + 3.858713333707925, + 15.05218206160584 + ], + [ + -6.550922257543201, + 6.283272332696356, + 16.160221242175155 + ], + [ + -5.2654556600477695, + 3.615805726678502, + 15.44900988890036 + ], + [ + -7.011597900093215, + 5.360162079668413, + 13.785274380751895 + ], + [ + -5.821983039473314, + 3.6083778273061853, + 12.414026581219183 + ], + [ + -6.396755785486089, + 2.418208172342162, + 13.496330211523787 + ], + [ + -7.541608059925329, + 3.2682971872252153, + 12.476150352920255 + ], + [ + -8.284627570735394, + 4.728714925735659, + 15.613104343501579 + ], + [ + -8.77985302479855, + 3.436309215420181, + 14.49566488299126 + ], + [ + -7.673356676963179, + 3.116043981792302, + 15.80299386985137 + ], + [ + -3.2054031588829472, + 5.095708725436879, + 15.090205589618149 + ], + [ + -1.9212146584692602, + 5.659468102437387, + 14.560935093211803 + ], + [ + -1.4844082978550186, + 5.6015828580434, + 13.097216656574094 + ], + [ + -0.6620457708023826, + 6.399661357814324, + 12.745151950609149 + ], + [ + -0.7439170050197914, + 5.103803161119373, + 15.481566881066186 + ], + [ + -0.45567634150819847, + 5.7230610517919445, + 17.113339826235475 + ], + [ + -3.230314534800959, + 4.7191270272551264, + 16.02704190330942 + ], + [ + -2.076527453790355, + 6.70527489017428, + 14.826016700942134 + ], + [ + -0.9374526978740432, + 4.032244188892662, + 15.53063306244909 + ], + [ + 0.20076070592748307, + 5.220177356975171, + 14.950396712523402 + ], + [ + -1.8965496073451522, + 4.524368863761197, + 12.352095468333534 + ], + [ + -1.416494859984469, + 4.276303405202725, + 10.960391837654441 + ], + [ + -1.7232393087337425, + 5.436440292078373, + 9.97845737648792 + ], + [ + -2.9034778735150835, + 5.802918579797307, + 9.974960047648784 + ], + [ + -2.0882356560347004, + 2.986939449728979, + 10.45574588782447 + ], + [ + -1.50278571157594, + 2.4594001553355014, + 9.135130625648719 + ], + [ + -1.8577317472915433, + 2.9351529345243677, + 7.880612504166307 + ], + [ + -0.6654574924658712, + 1.439407600843296, + 8.995720739970958 + ], + [ + -0.41184289964076376, + 1.2459393880363052, + 7.698583321662873 + ], + [ + -1.0766117171546563, + 2.141094140410928, + 7.036468463004122 + ], + [ + -2.5283918318605534, + 3.8461322657314554, + 12.753182579516945 + ], + [ + -0.35919327659331396, + 4.012557953117948, + 10.934878447646874 + ], + [ + -1.8872914916801653, + 2.2955951497938543, + 11.274136205523519 + ], + [ + -3.122859053373773, + 3.2468023668313464, + 10.231857623881696 + ], + [ + -0.23402797249191656, + 0.91543552448924, + 9.743666581558157 + ], + [ + -2.6152177332591946, + 3.6610459031224423, + 7.624303538197128 + ], + [ + 0.1063917412086639, + 0.4230480692413927, + 7.228813382589179 + ], + [ + -0.79775968354998, + 5.986125528548115, + 9.185173737085114 + ], + [ + -1.006805099133389, + 7.141871783090153, + 8.377512760864425 + ], + [ + -2.1886115298157827, + 7.032964120737063, + 7.33189061483608 + ], + [ + -2.141050908434746, + 6.295841693360586, + 6.345734564320618 + ], + [ + 0.25310890422188737, + 7.31482702875644, + 7.647767828784934 + ], + [ + 1.3279983722299498, + 6.544845688116936, + 8.525074770322254 + ], + [ + 0.5128259136338542, + 5.446830921934804, + 9.125073825744929 + ], + [ + -1.2089919117883356, + 8.02748780769565, + 8.979928092031653 + ], + [ + 0.23070143782898964, + 6.830694545710173, + 6.6714404491382595 + ], + [ + 0.45738459363502487, + 8.373232835681904, + 7.486066376937319 + ], + [ + 2.1366452878165227, + 6.148343998159419, + 7.911089444823243 + ], + [ + 1.7637048741236445, + 7.206140244360938, + 9.274039876565181 + ], + [ + 0.44569483537557025, + 4.5890927394781045, + 8.455835508329905 + ], + [ + 0.8957967985114584, + 5.200439999270344, + 10.115389898714488 + ], + [ + -3.320961946983082, + 7.766825281167314, + 7.547915518675592 + ], + [ + -4.4569166014058945, + 7.786238346323103, + 6.611972929507349 + ], + [ + -4.803768079429626, + 9.230395408620154, + 6.214874508904598 + ], + [ + -4.771185139087188, + 10.165460778663487, + 7.065059091207023 + ], + [ + -5.7140336848755515, + 7.043842555270146, + 7.188675217834015 + ], + [ + -5.526474229010861, + 5.472051594448942, + 7.109102238022759 + ], + [ + -6.086271219491306, + 7.4380574169035185, + 8.539602268881174 + ], + [ + -3.5370106767314007, + 8.276231509876538, + 8.392859547249996 + ], + [ + -4.208417933861616, + 7.277178654056172, + 5.680734691224644 + ], + [ + -6.550465739336017, + 7.170318990857538, + 6.501299532659405 + ], + [ + -5.83141234512072, + 6.739187851782617, + 9.146420379219958 + ], + [ + -5.3832703572574925, + 5.095379359719203, + 6.0963292029502325 + ], + [ + -4.751502430785796, + 5.198911024291846, + 7.825281432597987 + ], + [ + -6.385908371983506, + 4.95834409922287, + 7.539891583602209 + ], + [ + -5.171669206547553, + 9.372361398788087, + 4.903751157656304 + ], + [ + -5.644495254035008, + 10.648668384042821, + 4.3361127227457885 + ], + [ + -7.21789441636707, + 10.742086491815371, + 4.334720397768776 + ], + [ + -7.93427649283102, + 9.857393003414359, + 3.831526138919146 + ], + [ + -4.958330477692335, + 10.827954944168312, + 2.9641046660016936 + ], + [ + -4.808256236508083, + 8.7510379479927, + 4.195239461448454 + ], + [ + -5.299732142060759, + 11.479934382306965, + 4.951118075963311 + ], + [ + -4.942715582354101, + 9.867441779753392, + 2.449061602873765 + ], + [ + -5.582053195357527, + 11.468345704164676, + 2.340431361789353 + ], + [ + -3.9297529774631483, + 11.176684556288194, + 3.056389445745441 + ], + [ + -7.762862082657314, + 11.88661284855067, + 4.81977187861831 + ], + [ + -9.20266872284737, + 12.086899985371645, + 5.035946672817089 + ], + [ + -9.726896508392452, + 13.405353294689121, + 4.368297743016443 + ], + [ + -8.928588226495464, + 14.35157261134691, + 4.136872201332205 + ], + [ + -9.539127514419555, + 12.13530425807022, + 6.53011153193707 + ], + [ + -9.225019454484991, + 10.915968956611039, + 7.288588526651152 + ], + [ + -8.102339698638733, + 10.594931820862826, + 7.908054382196939 + ], + [ + -10.05553999716962, + 9.723437936768278, + 7.49893545506631 + ], + [ + -9.381875427705744, + 8.834572742772536, + 8.407386211358226 + ], + [ + -11.357542156560026, + 9.2629230049468, + 7.126242612808896 + ], + [ + -8.115387012913855, + 9.336986584124759, + 8.411108278841779 + ], + [ + -9.862525287694174, + 7.6701658088793465, + 8.880515453781902 + ], + [ + -11.905320964094823, + 8.093902609543704, + 7.699094744025877 + ], + [ + -11.112825616657501, + 7.234627256989938, + 8.511550996877364 + ], + [ + -7.1594056099476155, + 12.66323067425509, + 5.049562552689465 + ], + [ + -9.765732624392557, + 11.277496221983824, + 4.571269851486882 + ], + [ + -9.047059096470992, + 12.954151139510543, + 7.054952623801121 + ], + [ + -10.61213001269027, + 12.326632179077933, + 6.542702004302549 + ], + [ + -7.218539915267178, + 11.215635564596994, + 7.903001440470368 + ], + [ + -7.280362937184217, + 8.936491139718555, + 8.814140288572727 + ], + [ + -11.983266820779047, + 9.8524626639865, + 6.472551957446242 + ], + [ + -9.280238648688364, + 7.006010766011457, + 9.50199734711485 + ], + [ + -12.886065119510038, + 7.762273478168538, + 7.391586635667461 + ], + [ + -11.433343654186393, + 6.253893222874694, + 8.830657263473054 + ], + [ + -11.043166020366934, + 13.493215892560215, + 4.1382655014398155 + ], + [ + -11.816388036631427, + 14.706455586779953, + 3.77448455922711 + ], + [ + -13.129178922716473, + 14.884661171741982, + 4.565454818844155 + ], + [ + -14.064608721288685, + 14.101520031657628, + 4.345022984973535 + ], + [ + -12.053906766716063, + 14.69160915388511, + 2.280709772349074 + ], + [ + -12.71842249068008, + 15.961566873468541, + 1.8235559834068857 + ], + [ + -13.560404577726347, + 15.903888848501197, + 0.9227578580534657 + ], + [ + -12.355089256476251, + 17.01065287936376, + 2.4099336307937214 + ], + [ + -11.566243983080522, + 12.629230298048697, + 4.133747710277008 + ], + [ + -11.206783672693788, + 15.597948682129754, + 3.921862774228379 + ], + [ + -11.116723139383767, + 14.502715573335763, + 1.7571589314049798 + ], + [ + -12.620689685139443, + 13.803042886595222, + 2.0026719019755945 + ], + [ + -13.1754384988541, + 15.984577205431833, + 5.349228888220145 + ], + [ + -14.447558206309685, + 16.48187885377274, + 5.907113960050907 + ], + [ + -15.211187238763086, + 17.53402905352482, + 5.001730516360838 + ], + [ + -16.22999350139156, + 18.184509175209314, + 5.38732803179839 + ], + [ + -14.212678341372925, + 16.986395328403205, + 7.417579645578333 + ], + [ + -14.201593784899968, + 16.01624314357764, + 8.640096255938948 + ], + [ + -15.510722548031199, + 15.19196719120805, + 8.62292406359991 + ], + [ + -13.111642936564428, + 14.972186599020574, + 8.662839659177076 + ], + [ + -12.386067553194493, + 16.587391395576333, + 5.532561044357572 + ], + [ + -15.144842538604632, + 15.650747099355613, + 6.012561007715146 + ], + [ + -13.276461791503033, + 17.50575199202865, + 7.622182814553201 + ], + [ + -14.95369350734824, + 17.74508067370641, + 7.669354760369418 + ], + [ + -14.20075402136807, + 16.559296968151102, + 9.585183061485077 + ], + [ + -15.557487746145773, + 14.518167664517136, + 9.478440619934151 + ], + [ + -16.33094158011207, + 15.902530800281397, + 8.725152318869727 + ], + [ + -15.570034876640538, + 14.699944760199742, + 7.652101464126362 + ], + [ + -13.026462076023705, + 14.738272939497392, + 9.724032593404377 + ], + [ + -13.339175263591995, + 14.086896818182822, + 8.06904405053752 + ], + [ + -12.16277545355577, + 15.33878937449299, + 8.271240153597011 + ], + [ + -14.79728694278166, + 17.811376841457104, + 3.7354711064985 + ], + [ + -15.52707090017848, + 18.65346507915558, + 2.820574698828917 + ], + [ + -15.451855434514055, + 20.15069763173483, + 2.989878169951899 + ], + [ + -14.987201617762738, + 20.68303848512153, + 3.946711877671746 + ], + [ + -13.900157141847348, + 17.48044234394149, + 3.4102961916118724 + ], + [ + -15.288642875160786, + 18.310476732958023, + 1.8137915093071875 + ], + [ + -16.573874737790977, + 18.350364326245995, + 2.7996918396276427 + ], + [ + -15.8616395151915, + 20.875754893360863, + 1.9207861097549226 + ], + [ + -15.815508136056101, + 22.385912318652686, + 1.7798752706359777 + ], + [ + -14.514064035339658, + 22.98052202437964, + 2.261708549801105 + ], + [ + -14.48779134611103, + 24.045612706593943, + 2.8541945013827754 + ], + [ + -17.078149615249515, + 23.038543463839346, + 2.40937162277026 + ], + [ + -18.513562840387667, + 22.563154782061133, + 1.879168608122323 + ], + [ + -18.928404321270225, + 21.18639983827768, + 2.4428008439763285 + ], + [ + -18.942282865075942, + 20.06569786195007, + 1.3832578188218092 + ], + [ + -19.833747778210565, + 18.944265349338707, + 1.7084276262162246 + ], + [ + -16.12507585426032, + 20.346298721710014, + 1.102020433671228 + ], + [ + -15.847298959482636, + 22.4823852544323, + 0.6946179109935801 + ], + [ + -17.08173049199548, + 23.040869316537623, + 3.4993625874419356 + ], + [ + -16.93858448178855, + 24.06122557819674, + 2.059026936123476 + ], + [ + -19.253374492199196, + 23.289182970115576, + 2.2163089573367962 + ], + [ + -18.50818996079018, + 22.513259778270708, + 0.7903237913198916 + ], + [ + -18.266660185139987, + 20.93346257685255, + 3.2711844840975557 + ], + [ + -19.94099786534557, + 21.331021046861565, + 2.819411067891471 + ], + [ + -19.205240060814187, + 20.54267717721791, + 0.4390949797646449 + ], + [ + -17.910275461211633, + 19.733711267307854, + 1.2699287618416009 + ], + [ + -20.829940153254658, + 19.02171936614127, + 1.8557286787310927 + ], + [ + -19.720314788582147, + 18.13826997478759, + 1.1104255619188272 + ], + [ + -19.597366184468335, + 18.509830406749757, + 2.589048344468121 + ], + [ + -13.369663284323344, + 22.281618898296983, + 1.9440811492693737 + ], + [ + -11.939463702269725, + 22.580849994267624, + 2.30136677982192 + ], + [ + -11.310148778941404, + 21.770255987468772, + 3.375354246774839 + ], + [ + -10.082114157009208, + 21.677651147653137, + 3.4367059766917767 + ], + [ + -13.489350973645797, + 21.40555604047904, + 1.4559289065303274 + ], + [ + -11.34541671794238, + 22.447397561560365, + 1.3972644012521127 + ], + [ + -12.007788437989998, + 23.65375647813312, + 2.4810960275602754 + ], + [ + -12.098085173831365, + 20.97172051227676, + 4.197349684067032 + ], + [ + -11.57494154136733, + 20.394581238361297, + 5.431335518423139 + ], + [ + -10.839509161482393, + 19.09451699462238, + 5.1875943754430995 + ], + [ + -11.15624886180222, + 18.149471531138488, + 5.8441451839219765 + ], + [ + -12.744530902610236, + 20.26828587586988, + 6.486805578327559 + ], + [ + -12.268796440101772, + 19.94012523086758, + 7.919222151216292 + ], + [ + -13.172850702798579, + 19.963984733211987, + 8.76847296101752 + ], + [ + -11.048222503723656, + 19.92311840862078, + 8.190132425782148 + ], + [ + -13.051044770803786, + 20.8447570525002, + 3.887756883481753 + ], + [ + -10.737554223070314, + 20.96802100160903, + 5.828890024325533 + ], + [ + -13.16406563445064, + 21.272056778522824, + 6.554138598161167 + ], + [ + -13.544170718582714, + 19.619162241430217, + 6.129989008483728 + ], + [ + -9.842379422040546, + 19.03122102075497, + 4.281003489409876 + ], + [ + -8.80699713427677, + 17.95716722028999, + 4.127999066465307 + ], + [ + -7.912801974074999, + 17.729517753302503, + 5.380403593428453 + ], + [ + -7.571408234665414, + 18.668099219455144, + 6.064139450311406 + ], + [ + -7.9825518239872455, + 18.061326396798677, + 2.780139289673687 + ], + [ + -8.835764382941987, + 18.50062533737946, + 1.5674889791570172 + ], + [ + -8.855655208844382, + 19.85705014321502, + 1.2577597803183895 + ], + [ + -9.487812434307054, + 17.577790986676632, + 0.7670624516348574 + ], + [ + -9.603288102979787, + 20.281881967817526, + 0.11010276825400363 + ], + [ + -10.368769760212858, + 17.98951374352066, + -0.22404419183335697 + ], + [ + -10.483154207719767, + 19.373500684318287, + -0.5133090547318754 + ], + [ + -9.6290628919663, + 19.88928427624819, + 3.792815936816037 + ], + [ + -9.404793502242269, + 17.05445227591474, + 4.002109623054296 + ], + [ + -7.168110067807007, + 18.775360053219856, + 2.902387757755818 + ], + [ + -7.528399353637598, + 17.101211280999905, + 2.5351431202570422 + ], + [ + -8.294990521335045, + 20.607037736011648, + 1.7958752081768659 + ], + [ + -9.425211014207635, + 16.516946156367908, + 0.9596476840507796 + ], + [ + -9.611516861913788, + 21.33362631407863, + -0.13517623706842782 + ], + [ + -10.742521746994736, + 17.27384418533586, + -0.9413505309905345 + ], + [ + -11.203379504885795, + 19.817818159412468, + -1.184322131488505 + ], + [ + -7.524476573821704, + 16.442542284647516, + 5.657032201426728 + ], + [ + -6.878701203226165, + 16.07887102015991, + 6.97580627876841 + ], + [ + -5.89186132469151, + 14.875623126692972, + 6.776232516966069 + ], + [ + -6.1094533683193, + 14.058933512654676, + 5.8493018229204745 + ], + [ + -8.003545193582582, + 15.641222030117433, + 7.978815493937032 + ], + [ + -8.789941841076091, + 16.887866588594306, + 8.501721014027977 + ], + [ + -9.697878224962121, + 16.599804268500293, + 9.687105162270935 + ], + [ + -10.775644879571377, + 17.595717223177985, + 9.92436009228525 + ], + [ + -11.362799390928295, + 17.887966078128898, + 11.069844120052485 + ], + [ + -12.12768500485411, + 18.89541775974999, + 11.167334020419082 + ], + [ + -11.198458335483132, + 17.224042840043353, + 12.186802900250768 + ], + [ + -7.905604164786318, + 15.69338513053242, + 5.097028969842756 + ], + [ + -6.257149907100307, + 16.83405041569108, + 7.456927580927829 + ], + [ + -8.663801652178345, + 14.988272446037854, + 7.408012274807726 + ], + [ + -7.61382512101396, + 15.133290142262922, + 8.860986451961345 + ], + [ + -8.055016155922534, + 17.685279722786277, + 8.611775145512413 + ], + [ + -9.32567316113927, + 17.272670332161965, + 7.633954744747786 + ], + [ + -10.201355018113368, + 15.64411763867804, + 9.541246944809119 + ], + [ + -9.04275810507876, + 16.598287000834034, + 10.558261847203095 + ], + [ + -10.879480985149907, + 18.26974465221383, + 9.179372277378578 + ], + [ + -12.365746216204785, + 19.443045240971742, + 10.352761074902142 + ], + [ + -12.678599906568143, + 18.99098845199967, + 12.00844042476812 + ], + [ + -10.417700757147426, + 16.60119978011926, + 12.337084197156123 + ], + [ + -11.77217675273179, + 17.488548486936224, + 12.974828344517622 + ], + [ + -4.910388160133618, + 14.75910883333404, + 7.681523032225489 + ], + [ + -4.129466246732888, + 13.573999468963734, + 7.876033798855018 + ], + [ + -4.365285431844792, + 13.115706585005341, + 9.275816275666983 + ], + [ + -4.947742224787334, + 13.881394464002824, + 10.088361493163156 + ], + [ + -2.632230594932561, + 13.875052222718864, + 7.6165551932321724 + ], + [ + -1.6649594868664286, + 12.646107559373377, + 7.5568752293099655 + ], + [ + -1.9762760132982817, + 14.86018352331132, + 8.592265157687498 + ], + [ + -1.9228371766728887, + 11.886036068300996, + 6.231282455240981 + ], + [ + -5.030548942837088, + 15.445560062118602, + 8.412582217839708 + ], + [ + -4.500518910177846, + 12.76060273161471, + 7.252491473920404 + ], + [ + -2.5539026667887654, + 14.398476787103846, + 6.663670487169171 + ], + [ + -0.6376231565366698, + 12.990600685437471, + 7.675211120488819 + ], + [ + -1.8399101923874572, + 11.963750767922761, + 8.38866965507396 + ], + [ + -1.0004271704497962, + 15.158893253643555, + 8.209392284439176 + ], + [ + -2.656150528624461, + 15.712049708192353, + 8.606160168823001 + ], + [ + -1.8807285038618078, + 14.374217675168325, + 9.563247798260324 + ], + [ + -2.9885321400313334, + 11.736504812963801, + 6.057976043326728 + ], + [ + -1.5830613599222416, + 12.455169101619504, + 5.36598443129773 + ], + [ + -1.3808920607662458, + 10.940801726846303, + 6.200807168378281 + ], + [ + -4.011095046524878, + 11.890139871484735, + 9.565253072307003 + ], + [ + -4.1408283994473205, + 11.13607891451619, + 10.828721077104133 + ], + [ + -2.9196766354956547, + 10.169184484443178, + 10.937874581900317 + ], + [ + -2.743295178973125, + 9.295924357175409, + 10.048770589196423 + ], + [ + -5.4373573611770505, + 10.288948727679838, + 10.734978380241119 + ], + [ + -5.994669107549202, + 9.977228271011938, + 12.07926430224573 + ], + [ + -7.432020276559461, + 9.415118064062256, + 11.8102389397401 + ], + [ + -5.208620192905675, + 9.070678791634464, + 12.969531257027548 + ], + [ + -3.518231211278414, + 11.377120766218354, + 8.848316003331407 + ], + [ + -4.136837824778079, + 11.902054012907286, + 11.604199357427623 + ], + [ + -6.185592801968622, + 10.850467325117677, + 10.175570229117998 + ], + [ + -5.29341081562953, + 9.383064223637575, + 10.14612246154158 + ], + [ + -6.084701919993139, + 10.892847795425212, + 12.66376197606001 + ], + [ + -7.787764109200701, + 9.143783932183737, + 12.804181971422048 + ], + [ + -7.956426753013588, + 10.194159303400284, + 11.256894376577545 + ], + [ + -7.332306688815138, + 8.515268289235792, + 11.203257761900833 + ], + [ + -5.771646274225712, + 8.703906650378315, + 13.82777484577203 + ], + [ + -4.8883420120234815, + 8.153953316458285, + 12.474418121659513 + ], + [ + -4.323172014108136, + 9.613729494257996, + 13.299949789875466 + ], + [ + -2.043974379929194, + 10.394813269338101, + 11.923013639226893 + ], + [ + -0.7010709806005778, + 9.714990720743629, + 12.111178995970754 + ], + [ + -0.14530272141654907, + 9.703924188727228, + 13.555824619622271 + ], + [ + -0.2095547253314456, + 10.753259950616894, + 14.19952382299818 + ], + [ + 0.27450805244407933, + 10.403478241370408, + 11.198613446338404 + ], + [ + 1.5514014662457631, + 9.569873902608265, + 11.029356130988106 + ], + [ + 2.522042505836043, + 9.875607239796807, + 9.614289342352041 + ], + [ + 4.129853228292452, + 8.959166642551793, + 9.922218941095998 + ], + [ + -2.2848841936435833, + 11.183161821906651, + 12.506597374357234 + ], + [ + -0.7578433650354911, + 8.65627662126252, + 11.858190271131232 + ], + [ + -0.09633494486531913, + 10.61898800605286, + 10.196550257087313 + ], + [ + 0.5024576670685195, + 11.35385287338579, + 11.681235634599567 + ], + [ + 2.087561938322302, + 9.430655228379237, + 11.968106945573604 + ], + [ + 1.0970006549400664, + 8.586276259919202, + 10.910383364915756 + ], + [ + 4.014286917284764, + 7.895513618280518, + 10.130514711521693 + ], + [ + 4.816311085326098, + 9.03724192739054, + 9.079140231363244 + ], + [ + 4.598921106676643, + 9.297134112773506, + 10.846260670657841 + ], + [ + 0.6494822491280577, + 8.655286182647046, + 13.95577451437438 + ], + [ + 1.6070913460006226, + 8.919675536905004, + 15.070324634948546 + ], + [ + 2.940354393782329, + 9.07224835196206, + 14.500609293020041 + ], + [ + 3.6533571003274363, + 8.09091646443511, + 14.173680268994396 + ], + [ + 1.598098848344361, + 7.807103118196608, + 16.096397235955706 + ], + [ + -0.0681440545656157, + 7.7180893012886145, + 16.785377320908736 + ], + [ + 0.6860417622507053, + 7.796956780922244, + 13.424705891505093 + ], + [ + 1.4032191669068685, + 9.822258578895685, + 15.64641334217075 + ], + [ + 1.6967041405129035, + 6.951631081145763, + 15.428156374199874 + ], + [ + 2.340443694056226, + 8.052578138800186, + 16.855847415812924 + ], + [ + 3.4565031623195175, + 10.284660729450195, + 14.411524376193318 + ], + [ + 4.724549439986947, + 10.656472478381772, + 13.734304681672992 + ], + [ + 5.961422302189155, + 10.563648321583514, + 14.631691968483763 + ], + [ + 5.837750917712624, + 10.840500499964321, + 15.843923266180179 + ], + [ + 4.68186992883875, + 12.168233805450427, + 13.237366676283388 + ], + [ + 5.70783319004143, + 12.466675828576115, + 12.208614652881884 + ], + [ + 3.5216257094543018, + 12.373271769578253, + 12.48089015230945 + ], + [ + 2.8334939975574454, + 11.028072715205553, + 14.693122693693104 + ], + [ + 4.82566086513635, + 9.964262032462784, + 12.898407296524603 + ], + [ + 4.7331791226888, + 12.873669611762807, + 14.066718886161715 + ], + [ + 2.8226314712443403, + 12.243648408460842, + 13.12603177583269 + ], + [ + 6.705661090561594, + 12.204366473459402, + 12.560230475562047 + ], + [ + 5.541516425292695, + 11.87548153607321, + 11.308099155344586 + ], + [ + 5.622911388951146, + 13.527020366408465, + 11.970796952333437 + ], + [ + 7.103069082215133, + 10.141677764092378, + 14.089079868367431 + ], + [ + 8.417498975201497, + 10.186156965240741, + 14.710764625467482 + ], + [ + 9.369072376198437, + 10.978123077291343, + 13.886029670245566 + ], + [ + 9.186829312931076, + 11.197435376989233, + 12.733996583281856 + ], + [ + 9.00799717922003, + 8.777506619991584, + 14.971931382672174 + ], + [ + 7.888962386853553, + 7.947043743347081, + 15.722994572435134 + ], + [ + 8.317537532150716, + 6.586371524630977, + 16.19627285680354 + ], + [ + 8.613568709809142, + 5.521883378753273, + 15.18587720998824 + ], + [ + 7.484410181735177, + 5.122824811802616, + 14.373207173286046 + ], + [ + 7.012680837039839, + 10.006711966156274, + 13.092227216611175 + ], + [ + 8.378938177819476, + 10.620798737012592, + 15.709612195766663 + ], + [ + 9.085977286068978, + 8.228046554160585, + 14.033785449143892 + ], + [ + 9.942984487099311, + 8.955204107602412, + 15.503271602469129 + ], + [ + 7.5950822704577785, + 8.51137912010978, + 16.608014292781917 + ], + [ + 6.9367622032327185, + 7.832915400222589, + 15.204932003666611 + ], + [ + 9.113902469946199, + 6.6089853689530855, + 16.940177294361746 + ], + [ + 7.5994399102951995, + 6.1507596069182, + 16.891020717958845 + ], + [ + 9.366877251431466, + 5.858488117830291, + 14.473608968611178 + ], + [ + 8.931210013045867, + 4.614235753487719, + 15.699082097065487 + ], + [ + 7.879279920674047, + 4.482971807681793, + 13.698844145341225 + ], + [ + 6.7804183171641546, + 4.594353615354862, + 14.868396876371593 + ], + [ + 6.968341656054179, + 5.862182165085642, + 13.918097107521607 + ], + [ + 10.451015309158702, + 11.441437617713063, + 14.540888259162342 + ], + [ + 11.48786945047454, + 12.299095800202792, + 13.86490484568323 + ], + [ + 12.565502635333946, + 11.387825152042808, + 13.3576332429671 + ], + [ + 13.539067135633722, + 11.067285186821039, + 14.029887375897774 + ], + [ + 11.9424830302449, + 13.440781182501269, + 14.739117878390863 + ], + [ + 12.935806257255742, + 14.370600896173755, + 14.09350947550978 + ], + [ + 10.929124556299458, + 14.27597927670297, + 15.480602848339208 + ], + [ + 10.673508899393774, + 11.129403405077142, + 15.475354999220434 + ], + [ + 11.123127323310475, + 12.747456200457066, + 12.9407631747919 + ], + [ + 12.500178052368542, + 13.005493947581272, + 15.568335872149937 + ], + [ + 12.35208585982487, + 15.07342519136921, + 13.499029325498746 + ], + [ + 13.398152952615806, + 14.908141357169825, + 14.921388114392794 + ], + [ + 13.629352162422613, + 13.772371289502303, + 13.50256649580988 + ], + [ + 10.304206922180855, + 14.785472139522767, + 14.747119448895932 + ], + [ + 10.268124296768656, + 13.574870492994364, + 15.99013323409785 + ], + [ + 11.509491880778132, + 14.880830539177168, + 16.177326801562774 + ], + [ + 12.28749927536731, + 10.891770722699164, + 12.114684326555684 + ], + [ + 13.158587377903899, + 9.93898906728731, + 11.3932555548074 + ], + [ + 13.149992638219327, + 10.09165163840487, + 9.874735199841648 + ], + [ + 12.261231198688895, + 10.758820923930728, + 9.350816596566252 + ], + [ + 12.615269855633285, + 8.520777750375771, + 11.656578848905218 + ], + [ + 12.164794355674326, + 8.237680111158852, + 13.083548828412479 + ], + [ + 11.521278532788495, + 8.118590209107197, + 10.78921458948139 + ], + [ + 11.334949414511986, + 11.027215739949611, + 11.807436098880117 + ], + [ + 14.205714359160979, + 9.952985549313553, + 11.695628846999986 + ], + [ + 13.396498852379356, + 7.845339199971306, + 11.30792025652201 + ], + [ + 10.710261467715009, + 8.569715876512475, + 11.034858211112569 + ], + [ + 11.94410535598763, + 7.178967572652709, + 13.219643267172904 + ], + [ + 12.932168059578808, + 8.609286591882494, + 13.76262830313707 + ], + [ + 11.272235850795152, + 8.822008455276944, + 13.307157725175486 + ], + [ + 14.082064891241883, + 9.396597096099129, + 9.196731176721364 + ], + [ + 14.063055348960447, + 9.252939789556308, + 7.7289651556722285 + ], + [ + 12.888536484543236, + 8.388000439340999, + 7.13518675826184 + ], + [ + 12.463863092648277, + 8.470803136862116, + 5.999167339787255 + ], + [ + 15.394439038789791, + 8.665017300580644, + 7.34654967130374 + ], + [ + 15.605908986848295, + 8.842688251617062, + 5.801738975016405 + ], + [ + 17.24592708530336, + 8.261862735321074, + 5.110623116493049 + ], + [ + 17.246529550854394, + 9.199445957983414, + 3.541870552432376 + ], + [ + 14.832163342910482, + 9.003878428969983, + 9.747391616679105 + ], + [ + 13.874656521175133, + 10.263563372306862, + 7.366683903450622 + ], + [ + 16.298967799399442, + 9.150795831727805, + 7.712528776505263 + ], + [ + 15.438004368073912, + 7.618922903206396, + 7.649686370459467 + ], + [ + 14.850142709296165, + 8.252393861181645, + 5.2836022721645115 + ], + [ + 15.417976888183475, + 9.885023040787416, + 5.544219824477286 + ], + [ + 16.290318426649144, + 9.28944396960702, + 3.0264516811421136 + ], + [ + 17.684804418138263, + 10.175892774356498, + 3.7481806493174608 + ], + [ + 17.86451801566785, + 8.708950160491156, + 2.789805881749683 + ], + [ + 12.267362947981344, + 7.5848413563018084, + 7.991800710759348 + ], + [ + 10.989719039062665, + 6.904109539790056, + 7.584541647431878 + ], + [ + 9.853480602413322, + 7.917279853196476, + 7.456007852219712 + ], + [ + 9.105439548957486, + 7.870138409244817, + 6.480003997251558 + ], + [ + 10.665501498664582, + 5.820080719053152, + 8.646588490020276 + ], + [ + 11.791500713677848, + 4.891035639207189, + 9.002554773470093 + ], + [ + 12.206659957384572, + 4.884722666203828, + 10.193250849369923 + ], + [ + 12.413786548727447, + 4.318991777822163, + 8.026873613121339 + ], + [ + 12.415040539802703, + 7.660930300497228, + 8.988046923810984 + ], + [ + 11.086799228204656, + 6.452429726272101, + 6.597292899799052 + ], + [ + 10.221191791496556, + 6.309480712119779, + 9.513291739975399 + ], + [ + 9.832445889317816, + 5.201320779394507, + 8.313039422898681 + ], + [ + 9.787625338990036, + 8.859031659503614, + 8.398007815259676 + ], + [ + 8.62619199748674, + 9.718909548393981, + 8.586585311559958 + ], + [ + 8.559367351402624, + 10.888580089870118, + 7.515612046982042 + ], + [ + 7.605973779467354, + 11.078479718784592, + 6.802907594117183 + ], + [ + 8.514462045523032, + 10.339766267674747, + 9.938981999242955 + ], + [ + 8.260921547769662, + 9.273566512747607, + 10.989798403574873 + ], + [ + 9.301875696363581, + 8.720168887566672, + 11.499139050023786 + ], + [ + 7.063494554567274, + 8.947478062011726, + 11.301670341409379 + ], + [ + 10.513918113054748, + 8.849049224600606, + 9.099790908842367 + ], + [ + 7.713269881469726, + 9.140665104203094, + 8.444085533134857 + ], + [ + 9.484293416456795, + 10.783969791596462, + 10.163062235162885 + ], + [ + 7.702778423297124, + 11.066955821103363, + 9.917432743540521 + ], + [ + 9.713510836235306, + 11.400696951606562, + 7.172626749899864 + ], + [ + 9.887547768049123, + 12.321297547134066, + 6.036524927204091 + ], + [ + 9.551709516172233, + 11.67899927573012, + 4.653450028785639 + ], + [ + 9.158360165172011, + 12.341071977994318, + 3.7078987976667204 + ], + [ + 11.2386894119675, + 12.879553706894455, + 6.292353030802507 + ], + [ + 11.90857629930513, + 13.61603496380394, + 5.15983051007596 + ], + [ + 12.760503416075014, + 12.902568721782643, + 4.232276935757014 + ], + [ + 11.760567667760812, + 15.037077889302509, + 4.960170829544931 + ], + [ + 13.405296073408445, + 13.592191071209186, + 3.235505581641152 + ], + [ + 12.597405513629049, + 15.732918382503271, + 4.044869286785337 + ], + [ + 13.401562118713958, + 14.950871485869584, + 3.123433763806833 + ], + [ + 10.47892322421021, + 11.121764774084511, + 7.769654384583322 + ], + [ + 9.194022917933808, + 13.159407640133509, + 6.105033380404312 + ], + [ + 11.295506510056708, + 13.53102582816939, + 7.164394005662081 + ], + [ + 11.807733536002267, + 12.001525581595217, + 6.59789438157644 + ], + [ + 12.949598440848973, + 11.863412858129095, + 4.457664977420882 + ], + [ + 11.016033304263802, + 15.523735249355127, + 5.572730978157358 + ], + [ + 14.12314167818636, + 12.96314703823549, + 2.7301325181168496 + ], + [ + 12.643101413418544, + 16.810356376692994, + 3.9862608716449386 + ], + [ + 13.846408728747305, + 15.422064266941106, + 2.259437007307333 + ], + [ + 9.85523885438963, + 10.385190639164591, + 4.4604128834774235 + ], + [ + 9.415050997851493, + 9.599932036539826, + 3.2779435715831253 + ], + [ + 7.917514869873424, + 9.146516418860472, + 3.3327393415558753 + ], + [ + 7.329837467946186, + 8.961360592865503, + 2.2598855743770714 + ], + [ + 10.374892249569966, + 8.4472363173237, + 3.060187962599308 + ], + [ + 11.767100024380996, + 8.985546338977656, + 2.6096530398327786 + ], + [ + 12.7338946420811, + 7.793130831282326, + 2.7280715373896958 + ], + [ + 11.713687329034721, + 9.442136199248921, + 1.1485990888396111 + ], + [ + 10.336866005103765, + 9.954885255846307, + 5.236927682590791 + ], + [ + 9.416949093582277, + 10.259910690888091, + 2.4104617544615534 + ], + [ + 10.421911987156145, + 7.789180784132668, + 3.9278582652256095 + ], + [ + 9.953655394119076, + 7.86700084956459, + 2.2392211258100008 + ], + [ + 12.197645738657728, + 9.769491381169132, + 3.2326792661063455 + ], + [ + 12.349860527553632, + 6.887379790599596, + 2.2587845680072185 + ], + [ + 13.745253423627094, + 8.063511987944537, + 2.4245125823011677 + ], + [ + 12.873672938198391, + 7.629375191573956, + 3.7965961704538436 + ], + [ + 11.499017436212199, + 8.55034183573082, + 0.5597706973835582 + ], + [ + 11.075172794355652, + 10.324160420459293, + 1.0992599766145499 + ], + [ + 12.680209443975466, + 9.741522612228607, + 0.7432548593933354 + ], + [ + 7.2712361139026305, + 9.125394866605177, + 4.47586436218908 + ], + [ + 5.764703674079591, + 8.974984782362526, + 4.66190494317288 + ], + [ + 4.963610052915869, + 10.276310293873394, + 4.478259728834734 + ], + [ + 3.824736370454539, + 10.360008991024586, + 3.9290529773150142 + ], + [ + 5.463970589332564, + 8.188420424179299, + 5.966901134841901 + ], + [ + 3.9921636164863425, + 7.800930242696381, + 6.239261298788811 + ], + [ + 6.271546930693002, + 7.004106376553807, + 6.104264606792417 + ], + [ + 7.805215971080812, + 9.389270660099555, + 5.291543600305717 + ], + [ + 5.2664303650725675, + 8.362387962110574, + 3.9105410092582855 + ], + [ + 5.715012773567119, + 8.898145009208804, + 6.755171596665737 + ], + [ + 7.199571894949444, + 7.2484801293193755, + 6.129776349890407 + ], + [ + 3.5052288283904587, + 7.333939606231411, + 5.383156718330689 + ], + [ + 3.844337784580135, + 7.028969585800894, + 6.994458295493489 + ], + [ + 3.431395001473697, + 8.67573105225489, + 6.56844788086026 + ], + [ + 5.641348615301354, + 11.397272953020206, + 4.764640410023665 + ], + [ + 5.091378008294732, + 12.753098344469095, + 4.696388305416433 + ], + [ + 4.859231718567207, + 13.337336932526682, + 3.354019673509096 + ], + [ + 3.8135236106718287, + 14.023780356436419, + 3.181558492123277 + ], + [ + 5.9956878152537865, + 13.595333313814308, + 5.593280346583524 + ], + [ + 6.419190641071287, + 11.325098934037726, + 5.404837968522348 + ], + [ + 4.1758127239032, + 12.804203103857617, + 5.285648977967858 + ], + [ + 6.00416082189834, + 13.137930185586129, + 6.582629030911804 + ], + [ + 7.014531878198833, + 13.651181876122337, + 5.209957531037876 + ], + [ + 5.442097340950704, + 14.505476938049355, + 5.824100918627555 + ], + [ + 5.780195651197099, + 13.070055091658048, + 2.352511375494984 + ], + [ + 5.65094455897043, + 13.383156230682744, + 0.9391684387810276 + ], + [ + 4.5519429273416705, + 12.575515588518215, + 0.2633559474827196 + ], + [ + 3.8459771294245386, + 13.11333234208314, + -0.5578762670861716 + ], + [ + 7.068968572500676, + 13.20282615879296, + 0.1633346562125403 + ], + [ + 8.20328764064413, + 14.17363239212898, + 0.5569965480074466 + ], + [ + 8.543384188712853, + 15.392283986553366, + 0.060316337372455835 + ], + [ + 9.024354249544826, + 13.894687726807206, + 1.6430433929947597 + ], + [ + 9.87161235652421, + 14.951725339175596, + 1.793698467067551 + ], + [ + 9.618998926351464, + 15.892849633546689, + 0.9204268950745801 + ], + [ + 6.544509529400534, + 12.441969497313039, + 2.5560628952573903 + ], + [ + 5.340940315500042, + 14.42658682427873, + 0.8821433570947633 + ], + [ + 7.4840428160264825, + 12.230199048159932, + 0.4275544739363057 + ], + [ + 6.944324720166545, + 13.220786736743548, + -0.9193660628484371 + ], + [ + 8.92242810694578, + 13.110271270176213, + 2.271059172453339 + ], + [ + 8.13666431208137, + 15.98238247463064, + -0.7476216236606693 + ], + [ + 10.641163642855288, + 15.027296820170022, + 2.5476743139589995 + ], + [ + 4.501820114162417, + 11.34427473099879, + 0.6161813944095965 + ], + [ + 3.6372203487161276, + 10.381147714004499, + -0.10944357977246896 + ], + [ + 2.1676451367172263, + 10.564657491898572, + 0.2538068020802406 + ], + [ + 1.338991499927132, + 10.931439779491996, + -0.5653404980713959 + ], + [ + 4.324292163354486, + 9.07905732476064, + 0.2307022700917375 + ], + [ + 3.590639873035109, + 7.890822108022348, + -0.27936592311626757 + ], + [ + 3.090355806600423, + 7.629897337699845, + -1.5355081273252322 + ], + [ + 3.3269046546654995, + 6.733466878534841, + 0.43386045429265624 + ], + [ + 2.822145521089443, + 5.771036056375067, + -0.4179555201347061 + ], + [ + 2.5862950391202704, + 6.33738040791809, + -1.5905431480235697 + ], + [ + 5.045963910110166, + 11.071356209530506, + 1.4221117815221511 + ], + [ + 3.7374251760624957, + 10.504747272730867, + -1.1877675467938442 + ], + [ + 5.335256038022866, + 9.08733049207666, + -0.17670904527973177 + ], + [ + 4.512255027595857, + 8.880176626383388, + 1.2857928349607388 + ], + [ + 3.5933201622515405, + 6.629846238389177, + 1.4025634618688343 + ], + [ + 3.2066688786646393, + 8.300724768056853, + -2.3738758156009525 + ], + [ + 2.3889059640609385, + 4.857357994574869, + -0.03862077336026436 + ], + [ + 1.833406055213241, + 10.564483443189943, + 1.55015794001861 + ], + [ + 0.4362381322983629, + 10.72275849979519, + 1.996569419621512 + ], + [ + -0.11039072532417454, + 12.149232057197992, + 1.9649645161619858 + ], + [ + -1.3111210724282047, + 12.329015787849926, + 1.678317264500996 + ], + [ + 0.2810834390883789, + 10.092140223569004, + 3.3418604107425205 + ], + [ + 0.636973674156383, + 8.586014796612517, + 3.480169086845166 + ], + [ + 0.09053102259358319, + 7.685950387728326, + 2.4058870570203443 + ], + [ + 0.6373100616286443, + 6.682536167854948, + 1.966625209555146 + ], + [ + -1.098990759685447, + 7.67268834442325, + 1.958415294340409 + ], + [ + 2.5955649832330434, + 10.257520057728755, + 2.137513287379971 + ], + [ + -0.1957402382800034, + 10.203106811901307, + 1.2763853770545803 + ], + [ + 0.8303553441466719, + 10.607375132798609, + 4.129852624244173 + ], + [ + -0.7690422088916827, + 10.202974129029258, + 3.6121424865521794 + ], + [ + 1.7174675264463595, + 8.510471413167465, + 3.35799582506555 + ], + [ + 0.2661333725607538, + 8.147554099588092, + 4.406629617768026 + ], + [ + 0.77958877966795, + 13.192803138540853, + 2.054284004523124 + ], + [ + 0.4136454623775282, + 14.55073896814281, + 1.6125581923146235 + ], + [ + 0.20469242520655725, + 14.570458764879277, + 0.11673551327859916 + ], + [ + -0.6211193833967976, + 15.259084431790484, + -0.4290724139172961 + ], + [ + 1.3414488018947515, + 15.640898908299619, + 2.175646749676759 + ], + [ + 0.9128861382602541, + 17.08285889833303, + 1.8706552215434624 + ], + [ + 2.0008188575902643, + 18.404684694063008, + 2.590381843451023 + ], + [ + 1.7615366423982972, + 18.040693429707517, + 4.2571575719142345 + ], + [ + 1.744374883977642, + 12.99637863427148, + 2.2794620243106705 + ], + [ + -0.5617508789013265, + 14.71335197417659, + 2.0710976482844825 + ], + [ + 1.4300114061624911, + 15.552344798518902, + 3.2584275709285455 + ], + [ + 2.4019630967588967, + 15.627596279645445, + 1.9241822223563017 + ], + [ + 0.8274848944595685, + 17.225472693111556, + 0.7934052247752815 + ], + [ + -0.07295099757107998, + 17.246566147817475, + 2.3058857119355336 + ], + [ + 0.6888758752593077, + 17.91471806708398, + 4.404222148956582 + ], + [ + 2.1638655246969116, + 17.076485437549763, + 4.567851712102976 + ], + [ + 2.1178531155388582, + 18.870865184520994, + 4.8670374633760565 + ], + [ + 1.0508941346189937, + 13.791919378992588, + -0.6037734239145915 + ], + [ + 0.9159235649812689, + 13.675568988005011, + -2.0025855671180377 + ], + [ + -0.5406680922897266, + 13.22471414975621, + -2.3985180032017053 + ], + [ + -1.0998491753056838, + 13.828553900452903, + -3.271109840014556 + ], + [ + 1.8188380475436545, + 13.330203276935322, + -0.13774653214468938 + ], + [ + 1.1948219185415554, + 14.574642177786245, + -2.552112025875834 + ], + [ + 1.5908848124386226, + 12.844957038251323, + -2.2090180604517657 + ], + [ + -1.0536448789276558, + 12.23470714385968, + -1.697003300304617 + ], + [ + -2.38567950703103, + 11.685546004734533, + -1.8541760312328253 + ], + [ + -3.4918344421180127, + 12.675038669380001, + -1.3860377803860966 + ], + [ + -4.498337840778198, + 12.798624959819165, + -2.0204231384146665 + ], + [ + -2.4637535237591144, + 10.39571629335552, + -1.032693481331579 + ], + [ + -3.669216372655893, + 9.4944210557112, + -1.28726177194518 + ], + [ + -3.710410795434113, + 8.212273682623845, + -1.7454322566455596 + ], + [ + -4.922769046478592, + 9.767765723345008, + -0.8134758271467926 + ], + [ + -5.728565704967233, + 8.681667440047875, + -0.9566937828809334 + ], + [ + -5.029027186263943, + 7.6775367326654305, + -1.5115598819463116 + ], + [ + -0.44505071497182996, + 11.903861621917088, + -0.961982737859676 + ], + [ + -2.594881935837505, + 11.402003487652507, + -2.8856495350561486 + ], + [ + -1.5688623361571745, + 9.801334489973499, + -1.2170294183617103 + ], + [ + -2.4933991883946125, + 10.63861726624134, + 0.029484140934462933 + ], + [ + -5.329919776378433, + 10.678110713350577, + -0.6534789395892194 + ], + [ + -2.884331478877031, + 7.578364090683351, + -2.0320532198810044 + ], + [ + -6.78546984965664, + 8.624454585620185, + -0.7420326520753223 + ], + [ + -3.2828558673306376, + 13.610697990397625, + -0.43875714834656043 + ], + [ + -4.215414394145077, + 14.704309246202683, + -0.13531398798404023 + ], + [ + -4.266822452499164, + 15.758359152487515, + -1.2275685808590284 + ], + [ + -5.323766451652921, + 16.35815441704915, + -1.4756655316170089 + ], + [ + -3.9855409793318555, + 15.383216282980015, + 1.289981213108018 + ], + [ + -4.098949641989222, + 14.442685159095731, + 2.545559667624141 + ], + [ + -5.074618457563659, + 16.366202803970168, + 1.6105330854012772 + ], + [ + -3.532834021086842, + 15.075924312288635, + 3.8735085303518653 + ], + [ + -2.3773547853851333, + 13.711639997502857, + -0.002892527779937312 + ], + [ + -5.258366525766392, + 14.39770722644596, + -0.05565696797815754 + ], + [ + -2.99947995723341, + 15.836311120304003, + 1.3924004249885236 + ], + [ + -5.147738657677081, + 14.247710020081627, + 2.769447629555684 + ], + [ + -3.4953049448242544, + 13.537508557200226, + 2.4794691715055053 + ], + [ + -6.036493534210572, + 15.857245355563464, + 1.672655075265053 + ], + [ + -4.986570537435445, + 16.942642761101183, + 2.5314376517575816 + ], + [ + -5.215670944485024, + 17.125851270826956, + 0.8416791318907613 + ], + [ + -2.553306847979948, + 15.502933696967716, + 3.6583612406234374 + ], + [ + -4.102153656533241, + 15.945081416860148, + 4.2029608690316245 + ], + [ + -3.47633642532358, + 14.306188825206164, + 4.643193707168326 + ], + [ + -3.0917062880972406, + 16.200258677360466, + -1.6734268089259463 + ], + [ + -2.9815376208081625, + 17.09715898999002, + -2.8323112525342067 + ], + [ + -3.7818841814274675, + 16.623289136853032, + -4.076596731897023 + ], + [ + -4.226802307532612, + 17.496069264318976, + -4.80532074241896 + ], + [ + -1.488530158440023, + 17.3459705945819, + -3.191292058510325 + ], + [ + -1.1762372072344591, + 18.54589517234774, + -3.997377450344945 + ], + [ + -1.3966690201108696, + 19.857276484584986, + -3.3521871302609845 + ], + [ + -0.5283578015806589, + 20.290824793393654, + -2.5054402196846963 + ], + [ + -2.341107510760456, + 20.536836008897808, + -3.58899677701029 + ], + [ + -2.226942124653908, + 15.767559538932915, + -1.38178665553672 + ], + [ + -3.4902122114309493, + 18.010145149636855, + -2.522775593125119 + ], + [ + -1.0317696682366009, + 17.400856035336346, + -2.203133659581189 + ], + [ + -1.0339598420885585, + 16.484986754928627, + -3.6813657896314425 + ], + [ + -0.19028505355260966, + 18.38741562802204, + -4.434278769549023 + ], + [ + -1.8171493365802185, + 18.595048713029655, + -4.8776701342084845 + ], + [ + 0.21526220625536552, + 19.67416163335713, + -2.210731663981691 + ], + [ + -0.5301467044304855, + 21.27522399672739, + -2.2794782095859465 + ], + [ + -3.9919284861310502, + 15.346675420017618, + -4.174529114285295 + ], + [ + -4.7818090968282805, + 14.832757193171233, + -5.224918477285672 + ], + [ + -6.315599707465287, + 15.155557450142737, + -4.958040095511499 + ], + [ + -6.989050394790758, + 15.66602592231584, + -5.864267226434464 + ], + [ + -4.563217072317395, + 13.312721918299076, + -5.466395784115257 + ], + [ + -4.814436824920011, + 12.701884316833002, + -6.793420369285399 + ], + [ + -4.2289657527204305, + 11.451427077003416, + -7.049378868688371 + ], + [ + -5.555432858350065, + 13.320142793284049, + -7.812100918954254 + ], + [ + -4.380922332131837, + 10.911304763414762, + -8.373848145270333 + ], + [ + -5.803093588673582, + 12.717805480991444, + -9.04296320289 + ], + [ + -5.232093534548397, + 11.462827657662388, + -9.347638169154457 + ], + [ + -5.423806190276914, + 10.85872956560894, + -10.578093040992867 + ], + [ + -3.6183578605015674, + 14.708832951652084, + -3.4862690942080152 + ], + [ + -4.5168539371548055, + 15.46866093062988, + -6.069624899622469 + ], + [ + -3.5415347424551733, + 13.048210027506343, + -5.19381641755515 + ], + [ + -5.163610536112324, + 12.72433269780879, + -4.772548603981824 + ], + [ + -3.5322916675067226, + 11.035766760809452, + -6.336448443607408 + ], + [ + -6.010820059293508, + 14.272261034335656, + -7.582993523061995 + ], + [ + -3.722716494383844, + 10.107089680811555, + -8.667793773626244 + ], + [ + -6.37917806952165, + 13.19153250491911, + -9.824058680808161 + ], + [ + -5.930894798691977, + 11.352591605613839, + -11.226599309255606 + ], + [ + -6.831601049129675, + 15.072466752740524, + -3.6921740553686813 + ], + [ + -8.191539633333951, + 15.38667228155316, + -3.261776919060746 + ], + [ + -8.631414684341811, + 16.852473042231395, + -3.5240781239035313 + ], + [ + -9.672730959123935, + 17.140913118267008, + -4.107357069691947 + ], + [ + -8.37281406336091, + 14.966570211095473, + -1.7880268670847863 + ], + [ + -9.777039792526237, + 14.535502291506646, + -1.3787904680153575 + ], + [ + -9.852931219877895, + 13.826732242668413, + -0.3645493402645755 + ], + [ + -10.840548450983023, + 14.858290060678428, + -2.0000149596443837 + ], + [ + -6.237516591205925, + 14.8039478392119, + -2.9207732173510403 + ], + [ + -8.792376796594596, + 14.696715102996563, + -3.854277691187183 + ], + [ + -7.746431430368568, + 14.140925283681327, + -1.4503088514646791 + ], + [ + -8.123632576504345, + 15.877881444604554, + -1.2444092885927982 + ], + [ + -7.777082229010711, + 17.779586025314075, + -3.121429977767779 + ], + [ + -7.988793471529354, + 19.242066592241144, + -3.265309387672278 + ], + [ + -7.997119747567317, + 19.713246885512945, + -4.700331059338852 + ], + [ + -8.756115793597798, + 20.5968367646135, + -4.983904020878874 + ], + [ + -6.909526064114289, + 19.89683939508018, + -2.332200385301495 + ], + [ + -7.12118813957901, + 21.407764820054922, + -1.8969253047300862 + ], + [ + -5.901551622503821, + 22.103841020475443, + -0.6955517381302431 + ], + [ + -4.396793583241784, + 21.75449170129434, + -1.6900127439119286 + ], + [ + -7.050174405874313, + 17.439324702380873, + -2.5083018575628717 + ], + [ + -8.949209876679905, + 19.52265028127647, + -2.8329060242842186 + ], + [ + -6.742275354451089, + 19.274205505801433, + -1.4533058014301552 + ], + [ + -5.919849588540327, + 19.815693672484713, + -2.7817058004059447 + ], + [ + -7.057174161899797, + 21.999466429421545, + -2.8101005661318306 + ], + [ + -8.133362557945865, + 21.500327513546495, + -1.5031851344105285 + ], + [ + -4.581151775526216, + 22.078960640503738, + -2.7141379857491663 + ], + [ + -3.533446857265937, + 22.278097338775297, + -1.2794380472195455 + ], + [ + -4.202006851116831, + 20.683761216530456, + -1.6292331209607749 + ], + [ + -7.228231819755578, + 19.049183159680524, + -5.58198533406446 + ], + [ + -7.1668566413373025, + 19.25785585401502, + -7.033880161068606 + ], + [ + -8.474186416924725, + 18.91178770421095, + -7.769564467985996 + ], + [ + -8.900910982384149, + 19.689445139242252, + -8.669205087506876 + ], + [ + -5.867113515942655, + 18.565719554406883, + -7.5934210297847615 + ], + [ + -6.872779022923987, + 18.181129664409468, + -5.207503905292011 + ], + [ + -7.0145001021583875, + 20.328686241176683, + -7.168821817359948 + ], + [ + -6.068404278884029, + 17.495725849826613, + -7.645259391837358 + ], + [ + -5.5715628370670025, + 18.94149930170022, + -8.57298280104586 + ], + [ + -5.014736126077068, + 18.75534835416488, + -6.941045930039944 + ], + [ + -9.087864127126684, + 17.7831013409359, + -7.449181304587085 + ], + [ + -10.320556662848523, + 17.405404716385192, + -8.140658021880043 + ], + [ + -11.599869330922825, + 17.743479113392027, + -7.336993922296754 + ], + [ + -12.682170507939318, + 17.28416066888144, + -7.7165176006579985 + ], + [ + -10.21588615725475, + 15.951272243572475, + -8.696002123855832 + ], + [ + -9.990852799320843, + 14.825568903456087, + -7.684597233765615 + ], + [ + -9.095397089026502, + 13.766000950668968, + -8.058712194084896 + ], + [ + -10.62454307240454, + 14.800744718583132, + -6.449496056372457 + ], + [ + -8.705813562059676, + 12.732125084835502, + -7.166080339335003 + ], + [ + -10.253120712600591, + 13.818913319067292, + -5.508938759475676 + ], + [ + -9.314366676151934, + 12.725341868123849, + -5.826153451010356 + ], + [ + -8.936292218783436, + 11.707085898280525, + -4.941986763676902 + ], + [ + -8.750224415102927, + 17.166597400345836, + -6.723909396713779 + ], + [ + -10.484603474037677, + 18.063035664385666, + -8.994303739796752 + ], + [ + -11.103191926498903, + 15.808734936567248, + -9.31282523881043 + ], + [ + -9.443824026778442, + 15.816062153054304, + -9.453455887749113 + ], + [ + -8.734256938130844, + 13.669120600423412, + -9.07192154341661 + ], + [ + -11.258437112548167, + 15.568352596787918, + -6.030737991204701 + ], + [ + -8.064324596050348, + 11.935746877045517, + -7.51346672572683 + ], + [ + -10.664289335588613, + 13.981257837407043, + -4.523553399331172 + ], + [ + -9.341739865705469, + 11.832102041787891, + -4.080835497200554 + ], + [ + -11.63970782176078, + 18.647628593760373, + -6.328681791006283 + ], + [ + -12.86025446506768, + 18.982401528715627, + -5.470040545813769 + ], + [ + -14.079819273807763, + 19.564682654166745, + -6.26160233749181 + ], + [ + -15.217865223073993, + 19.301090177628566, + -5.830153088500152 + ], + [ + -12.483017614912866, + 19.873401355976398, + -4.302073473704888 + ], + [ + -10.725320714195485, + 19.00674961622417, + -6.094107114252109 + ], + [ + -13.206455227233116, + 18.04845928015982, + -5.027324575077143 + ], + [ + -11.709482674206106, + 19.336184016798143, + -3.7533084423069507 + ], + [ + -12.01735465482868, + 20.76313211059039, + -4.725911016500648 + ], + [ + -13.305255733043673, + 20.11947969340406, + -3.6301587990998154 + ], + [ + -13.983972336471009, + 20.193597906705804, + -7.398644631436404 + ], + [ + -15.112785174191082, + 20.663449810282145, + -8.222847969666013 + ], + [ + -15.606377860539977, + 19.531305887458984, + -9.167646728042186 + ], + [ + -16.351876114227373, + 19.860996287927264, + -10.06821297220218 + ], + [ + -14.75091849546807, + 21.97083346563329, + -9.04208907025032 + ], + [ + -13.086305605153207, + 20.458766967958923, + -7.778091159752364 + ], + [ + -15.899674230746433, + 20.86980445679319, + -7.497367658448423 + ], + [ + -14.54102361660801, + 22.750620070517243, + -8.309984830403852 + ], + [ + -13.875720404143374, + 21.790199003625276, + -9.666190306356773 + ], + [ + -15.589558564482552, + 22.302158206890226, + -9.654466551344195 + ], + [ + -15.096105976740136, + 18.27998152603618, + -9.056570058582395 + ], + [ + -15.576474078462036, + 17.085304946103633, + -9.799125776350763 + ], + [ + -16.812372835990626, + 16.43247555709638, + -9.080371649075628 + ], + [ + -17.077644958300066, + 16.91869584415872, + -7.923211551116735 + ], + [ + -14.551893735149356, + 15.980671646068686, + -9.90968884915531 + ], + [ + -13.358297382707741, + 16.415318881252915, + -10.856422578236948 + ], + [ + -13.601235066726396, + 16.789119312290268, + -12.276645997598933 + ], + [ + -13.008644554902116, + 17.753186816701145, + -12.770710251905522 + ], + [ + -14.5309829365901, + 16.273073476566196, + -12.88751631634163 + ], + [ + -14.2815486435203, + 18.134492415371597, + -8.477409351332783 + ], + [ + -15.99965909385795, + 17.342024449869655, + -10.770264490077953 + ], + [ + -14.101685124256573, + 15.765041686313907, + -8.940713649707329 + ], + [ + -14.933444335674048, + 15.037396328195427, + -10.300525703053822 + ], + [ + -12.895099195301908, + 17.21508908764247, + -10.27856999396845 + ], + [ + -12.638445130418704, + 15.598279608822395, + -10.80791215499255 + ], + [ + -12.44695819463203, + 18.3091826847118, + -12.141841096983379 + ], + [ + -13.099472241105094, + 17.970216970999786, + -13.75292643726679 + ], + [ + -17.603882291024203, + 15.480930193857034, + -9.598217993230813 + ], + [ + -18.676450002090995, + 14.934805931526853, + -8.814706831324415 + ], + [ + -18.2313504171149, + 14.121216413769616, + -7.651444856461054 + ], + [ + -17.33218663298551, + 13.355629998144877, + -7.790976512009471 + ], + [ + -19.49059828501917, + 14.088866768589014, + -9.883908268545074 + ], + [ + -19.05849548304145, + 14.671837844974789, + -11.268481399812455 + ], + [ + -17.614654546587055, + 15.048168616430871, + -11.040360597947682 + ], + [ + -19.36290128996159, + 15.717424144997835, + -8.491608432338133 + ], + [ + -19.25996883644914, + 13.024283403238428, + -9.923564801084899 + ], + [ + -20.56203433417906, + 14.13802967512072, + -9.689748694265356 + ], + [ + -19.151604463949806, + 13.958956188077991, + -12.087768440962018 + ], + [ + -19.624988975417534, + 15.568867718526462, + -11.51853321346246 + ], + [ + -17.02480418580857, + 14.15118088920326, + -11.229023140776764 + ], + [ + -17.307062929011895, + 15.84699287199146, + -11.715174026241524 + ], + [ + -18.952993826814645, + 14.125491924199537, + -6.513420319342771 + ], + [ + -18.688171250911104, + 13.448748398724092, + -5.227772832133863 + ], + [ + -18.0759192968517, + 12.001360118248897, + -5.4251299824400245 + ], + [ + -17.0477768737403, + 11.758632413584223, + -4.760144925465909 + ], + [ + -20.039195077007683, + 13.364519750572185, + -4.423104613810106 + ], + [ + -20.256382808427027, + 12.286995902759372, + -3.4316552104520097 + ], + [ + -19.182745767302716, + 12.009172797950157, + -2.4908447068350688 + ], + [ + -21.3754925294141, + 11.480669601515615, + -3.571365117387881 + ], + [ + -19.289848850261436, + 10.786165302885138, + -1.7634375343796844 + ], + [ + -21.446746268291125, + 10.349996897597237, + -2.7126438584089168 + ], + [ + -20.416719740406194, + 10.001432748823675, + -1.8241603525798522 + ], + [ + -19.630099554816265, + 14.871661372231074, + -6.4437083511431625 + ], + [ + -18.019955380075455, + 14.089884524266381, + -4.652853712096372 + ], + [ + -20.17554786695728, + 14.235495390978258, + -3.782083642282893 + ], + [ + -20.924566040215883, + 13.51912339405908, + -5.039802863840497 + ], + [ + -18.321054849117324, + 12.580409245034389, + -2.1784675325857688 + ], + [ + -22.177025100534852, + 11.798498153222681, + -4.221701998475939 + ], + [ + -18.419720796991157, + 10.491185522232456, + -1.1957516475554602 + ], + [ + -22.250267443100864, + 9.629163634227268, + -2.7465825094725327 + ], + [ + -20.521284698991792, + 9.05552484667146, + -1.3135458833298677 + ], + [ + -18.587038629914524, + 11.131523989567484, + -6.3087592157949715 + ], + [ + -18.136826811322905, + 9.780115376782874, + -6.557181707984187 + ], + [ + -16.896452677699845, + 9.62671056206932, + -7.47056440278514 + ], + [ + -16.224215611183674, + 8.623166000786341, + -7.382106278482875 + ], + [ + -19.256788824677614, + 8.974273758265838, + -7.218419984949889 + ], + [ + -20.440925662315767, + 8.45334831480028, + -6.366875676624809 + ], + [ + -21.526234046858647, + 7.8517181241669505, + -7.17157185602264 + ], + [ + -19.943040135737125, + 7.478477302654653, + -5.310686823544093 + ], + [ + -19.385469541111473, + 11.414016750985354, + -6.859038380686634 + ], + [ + -17.90006121338447, + 9.28800006776413, + -5.6138540862879 + ], + [ + -19.61032784086412, + 9.506719977462694, + -8.101376896522304 + ], + [ + -18.815800846205054, + 8.140087175841643, + -7.764097010765257 + ], + [ + -20.7884736862512, + 9.378728615671491, + -5.907551793959697 + ], + [ + -22.35188519207935, + 7.5061018766153325, + -6.549517817745776 + ], + [ + -21.91295940643104, + 8.59110903841173, + -7.872889045304613 + ], + [ + -21.19701811536058, + 6.958723370900543, + -7.702866051051558 + ], + [ + -19.51103088101615, + 6.588014450781941, + -5.767351200330306 + ], + [ + -19.14497454860734, + 7.936737406138775, + -4.726570436693279 + ], + [ + -20.802054013078138, + 7.3207766848366305, + -4.658519243480122 + ], + [ + -16.625996666602177, + 10.585185873667058, + -8.341042926383064 + ], + [ + -15.436802225205215, + 10.511773221049623, + -9.270537225547656 + ], + [ + -14.231319069744224, + 11.229094290747696, + -8.655429661112482 + ], + [ + -13.112921082859986, + 11.101867026202001, + -9.185376022227878 + ], + [ + -15.835110012662772, + 11.166959682254458, + -10.704096840033902 + ], + [ + -16.963184414779416, + 10.38585171206239, + -11.387477547608734 + ], + [ + -17.57492118191855, + 10.969881909962112, + -12.688607936037851 + ], + [ + -16.478512506729093, + 8.953314547406933, + -11.834880248289295 + ], + [ + -17.181564891044527, + 11.427224940654128, + -8.390212869824154 + ], + [ + -15.120067839112025, + 9.480793744264247, + -9.42821595849552 + ], + [ + -16.183440089695406, + 12.15379322604656, + -10.399254847460414 + ], + [ + -14.947024531675094, + 11.246602966445835, + -11.331042184467535 + ], + [ + -17.71941902283836, + 10.299110674703854, + -10.607293637748482 + ], + [ + -16.78643842879242, + 11.543267819573543, + -13.176072379676691 + ], + [ + -18.10700441626364, + 10.199365935396997, + -13.246542478016972 + ], + [ + -18.326063950996616, + 11.695824244393464, + -12.377335478083445 + ], + [ + -15.707415850730877, + 8.969924101525066, + -12.60509811106777 + ], + [ + -16.037382498282085, + 8.36744474051062, + -11.02849228220763 + ], + [ + -17.318374747522565, + 8.336019192509468, + -12.15375380904124 + ], + [ + -14.445416203812966, + 11.914277227372963, + -7.490903333226264 + ], + [ + -13.426695886496265, + 12.478250457943716, + -6.644849507810207 + ], + [ + -12.622053016461312, + 11.414760555556313, + -5.9140017982358755 + ], + [ + -12.436844903503719, + 11.490242280490236, + -4.742872537049793 + ], + [ + -13.945865317087229, + 13.590352242700078, + -5.694024170191497 + ], + [ + -14.676414176219026, + 14.750356446703677, + -6.272868047541146 + ], + [ + -15.07999807400574, + 15.603515118855967, + -5.055082813874034 + ], + [ + -16.025655516317045, + 16.61865616315606, + -5.414797400105608 + ], + [ + -16.96812697313835, + 17.162448328888104, + -4.6454681393310295 + ], + [ + -17.31691274608681, + 16.708526174832514, + -3.41488324645329 + ], + [ + -17.709599517406627, + 18.088398385621645, + -5.163793396811932 + ], + [ + -15.4003489047287, + 12.205698765592274, + -7.338332050141181 + ], + [ + -12.682640818210453, + 12.996877365772889, + -7.249422191446684 + ], + [ + -14.607454861170599, + 13.1078345882554, + -4.974596124523515 + ], + [ + -13.05318590433317, + 13.902537869907633, + -5.152027958823339 + ], + [ + -14.007736254658086, + 15.363206144900005, + -6.877341219847356 + ], + [ + -15.60662255056211, + 14.457689250462067, + -6.7598574515640415 + ], + [ + -15.458091130483295, + 14.865556399141838, + -4.347581788898406 + ], + [ + -14.203632421323071, + 16.057548102134092, + -4.592549599576009 + ], + [ + -15.972568351642334, + 17.05469110508443, + -6.324278021604357 + ], + [ + -16.8819844749773, + 15.908086310182853, + -2.978725361769383 + ], + [ + -18.109959865650556, + 17.13701068085379, + -2.959274247890301 + ], + [ + -17.628908061216375, + 18.388940700563126, + -6.124658967989523 + ], + [ + -18.601812244604044, + 18.38494460465199, + -4.794850303585402 + ], + [ + -12.056981560938457, + 10.367525865969924, + -6.538140836548872 + ], + [ + -11.355533961008367, + 9.246249450855089, + -5.86829641182495 + ], + [ + -10.277545678930236, + 8.66062861946574, + -6.856445098547368 + ], + [ + -10.48697849183945, + 7.650886987570573, + -7.558230511611616 + ], + [ + -12.409894424691247, + 8.231386260098816, + -5.427772795935261 + ], + [ + -11.813482487579899, + 7.095103412155197, + -4.679376203273491 + ], + [ + -12.61688734726272, + 6.076354564466584, + -4.495482345889089 + ], + [ + -10.632147562726901, + 7.122272961913495, + -4.24115985165654 + ], + [ + -12.113927487450253, + 10.351673384709954, + -7.546409295138431 + ], + [ + -10.810289334417863, + 9.595222575069556, + -4.99135476418905 + ], + [ + -13.071620622703204, + 8.657756425529612, + -4.673832413995048 + ], + [ + -12.955263147510928, + 7.865451581911543, + -6.29769512864917 + ], + [ + -13.581208526358814, + 6.291636817047845, + -4.704857446216434 + ], + [ + -12.32519257038209, + 5.175105765827482, + -4.145103537073926 + ], + [ + -9.120358298501587, + 9.246738816506706, + -6.702093628719324 + ], + [ + -8.036592080171681, + 8.827774696798713, + -7.543059554477179 + ], + [ + -8.40032656521505, + 8.841942886071138, + -9.06825617779203 + ], + [ + -9.221430669859823, + 9.549308837928095, + -9.560044457583896 + ], + [ + -9.037170100895151, + 10.051146679518126, + -6.097025819766749 + ], + [ + -7.117824108374197, + 9.34594501945054, + -7.268350657534278 + ], + [ + -7.800023903539569, + 7.77899776394662, + -7.363611397940008 + ], + [ + -7.9043875699020365, + 7.8072545327682406, + -9.68025199913286 + ], + [ + -8.281941334077782, + 7.394453142223199, + -11.05349237323445 + ], + [ + -8.495626982053043, + 5.838645004071566, + -10.964534674078175 + ], + [ + -9.541177343965067, + 5.365958760202005, + -11.33656645411563 + ], + [ + -7.210435084111267, + 7.915727463593498, + -12.031117795328974 + ], + [ + -7.276837344755778, + 7.208372438561298, + -9.16293318957772 + ], + [ + -9.229443807740825, + 7.8657747037293575, + -11.314628634850225 + ], + [ + -7.13356183137245, + 8.993593945411192, + -11.888318295004858 + ], + [ + -6.241299062721702, + 7.5015914394531364, + -11.752967690524349 + ], + [ + -7.406699563334442, + 7.58310555214041, + -13.050403985531029 + ], + [ + -7.486913976072393, + 5.089119459864662, + -10.450009239299733 + ], + [ + -7.5074430460325745, + 3.8666247450757396, + -9.737583332758502 + ], + [ + -6.773578780185351, + 4.085610410762143, + -8.439339227479504 + ], + [ + -5.95755772649354, + 5.05010874426344, + -8.365737774720243 + ], + [ + -6.8953355112789705, + 2.804962549250817, + -10.658470347541476 + ], + [ + -5.384208336049781, + 2.8812536397042408, + -10.714042686668902 + ], + [ + -4.8154374642665525, + 3.0844822387254283, + -11.849577080861833 + ], + [ + -4.6898445065785594, + 2.6350531559855455, + -9.800521912686298 + ], + [ + -6.614108128135721, + 5.5608702894862745, + -10.26089874200265 + ], + [ + -8.538975873248228, + 3.66536199890146, + -9.448567983560977 + ], + [ + -7.124043245631997, + 1.8292940740197992, + -10.229674374369667 + ], + [ + -7.351431329804269, + 2.8954358777513534, + -11.644315778198685 + ], + [ + -5.448409304589328, + 3.1386913870761646, + -12.634757609439815 + ], + [ + -3.8574901296770556, + 2.7828345583866536, + -11.956561650745456 + ], + [ + -6.847106097944867, + 3.204554579395861, + -7.39736342082501 + ], + [ + -6.302340683541693, + 3.4591275474627423, + -6.072033271238152 + ], + [ + -4.687994819681755, + 3.5415294646615223, + -5.958146953400479 + ], + [ + -4.138715495757054, + 4.323724263673171, + -5.147357492687807 + ], + [ + -7.004981491668508, + 2.4987006269146548, + -5.016807487865719 + ], + [ + -6.664822299720845, + 1.0036301222232638, + -5.057743615603843 + ], + [ + -7.027508558669452, + 0.6018189222627264, + -3.66625069326839 + ], + [ + -6.080723755567767, + 0.2936948543539124, + -2.851240130843876 + ], + [ + -8.239282484026452, + 0.424723483183822, + -3.391320014360445 + ], + [ + -7.448342081627401, + 2.399604277584004, + -7.500663219148953 + ], + [ + -6.4897697589463945, + 4.513680477930137, + -5.869829685306736 + ], + [ + -6.791430784574046, + 2.949131075094769, + -4.047473282945503 + ], + [ + -8.091889925332836, + 2.5564533835584626, + -5.0750673212655535 + ], + [ + -7.102105205949068, + 0.5375921195113271, + -5.940744577413333 + ], + [ + -5.591019028887321, + 0.9128928913926586, + -5.2214934446272725 + ], + [ + -4.082179206668931, + 2.7699342710297827, + -6.825715758698355 + ], + [ + -2.606095718804422, + 2.7735857817173297, + -6.8570711275073375 + ], + [ + -2.0258386898122698, + 4.0622917862432075, + -7.434158970943916 + ], + [ + -0.9971639354169446, + 4.597601223770141, + -6.956945577795202 + ], + [ + -4.49817783820865, + 2.4258456326035684, + -7.67932473890366 + ], + [ + -2.3528411757575114, + 2.595301562641424, + -5.811999952499892 + ], + [ + -2.127329220800771, + 1.9586965571796213, + -7.400061717902313 + ], + [ + -2.746655602256086, + 4.582981522489007, + -8.443944301390276 + ], + [ + -2.510243312476727, + 5.913078144072557, + -9.017473108685314 + ], + [ + -2.7841082610557986, + 7.052687039423461, + -7.9424406147599695 + ], + [ + -2.087628235092889, + 8.069005058847381, + -7.918892601789917 + ], + [ + -3.4808782337729554, + 5.97881040961704, + -10.227359008637583 + ], + [ + -3.044766675709923, + 6.863080093314977, + -11.336512949887698 + ], + [ + -2.3372016541704794, + 6.262077804861434, + -12.437468597562434 + ], + [ + -3.4867761551205514, + 8.199865492624781, + -11.480832929415184 + ], + [ + -1.9238344670885583, + 7.015582664498595, + -13.510936302933546 + ], + [ + -3.1082526613759254, + 8.95874674028613, + -12.600322858399789 + ], + [ + -2.211003231823513, + 8.377323370578438, + -13.584580026816878 + ], + [ + -3.495445495778419, + 4.036844772359103, + -8.845377054660094 + ], + [ + -1.5343775737660736, + 5.975750118197595, + -9.498988662598201 + ], + [ + -3.7025264558094273, + 4.962928292452176, + -10.55439725854567 + ], + [ + -4.509017925341889, + 6.223706698752238, + -9.960794401528844 + ], + [ + -2.051287157011389, + 5.220759990880964, + -12.455052167039176 + ], + [ + -4.243875578876313, + 8.584211090040128, + -10.81339201795178 + ], + [ + -1.4436010705276625, + 6.567145776471023, + -14.368070779712289 + ], + [ + -3.4713519043981327, + 9.96353461812896, + -12.75831462609794 + ], + [ + -2.023012328773912, + 8.956492692436257, + -14.476557057939557 + ], + [ + -3.8064262652184886, + 6.883357158114052, + -7.044179860359586 + ], + [ + -4.026896088244896, + 7.683270193712929, + -5.807566152337913 + ], + [ + -2.7719050073184257, + 7.82486076940171, + -4.872125819105692 + ], + [ + -2.4644693138461085, + 8.911483540287179, + -4.383534862251056 + ], + [ + -5.3038321037642575, + 7.118401743999584, + -5.099971437140714 + ], + [ + -6.17716762720695, + 8.166548042965701, + -4.470971119107271 + ], + [ + -7.430762803662331, + 7.990408408370229, + -3.9422395675883646 + ], + [ + -5.87629292348885, + 9.476398819249482, + -4.279511756365782 + ], + [ + -6.846351882062276, + 10.032732638340121, + -3.5490320398695854 + ], + [ + -7.827682145129815, + 9.191855717214708, + -3.3203994692465044 + ], + [ + -4.457868671921319, + 6.140982049979385, + -7.255373468337321 + ], + [ + -4.352286079769127, + 8.704296113632154, + -6.006882393137695 + ], + [ + -5.8799442093057275, + 6.497896634329749, + -5.786387491682758 + ], + [ + -5.023434504911278, + 6.37556966044383, + -4.353192017927836 + ], + [ + -5.102938746253261, + 10.00701167334961, + -4.654307756185455 + ], + [ + -8.0815246162963, + 7.129036666438083, + -3.973038708287239 + ], + [ + -6.853281125555211, + 11.034376712602864, + -3.1452234695799284 + ], + [ + -1.9889834932590202, + 6.7493154573573975, + -4.656267944214986 + ], + [ + -0.6742644282391803, + 6.7749708613993675, + -3.989906912067031 + ], + [ + 0.5417653678147007, + 7.349230136503877, + -4.871533553161016 + ], + [ + 1.433334801876917, + 8.03136761097187, + -4.38931372347988 + ], + [ + -0.3734438322270246, + 5.311965806883961, + -3.5019901846604693 + ], + [ + -1.2791970871816767, + 4.5964515657082075, + -2.4361692855382997 + ], + [ + -1.1708066355641729, + 5.129147150655768, + -1.046034277740782 + ], + [ + -1.9535373893328625, + 5.825050863342625, + -0.3921236414821689 + ], + [ + -0.1269137069061565, + 5.04987850045606, + -0.34499226787700715 + ], + [ + -2.1972969003729963, + 5.850527145507328, + -5.067224994445588 + ], + [ + -0.7262289940455343, + 7.446184633060284, + -3.1326604637926403 + ], + [ + -0.3974169953057912, + 4.695580890635, + -4.400652029547409 + ], + [ + 0.6547158249445836, + 5.199508097216068, + -3.15798236671531 + ], + [ + -2.3332276760717736, + 4.592086689461524, + -2.7138407343900783 + ], + [ + -1.1478178402208363, + 3.5144309392641446, + -2.4446572404800606 + ], + [ + 0.5549264083576526, + 7.063309474062237, + -6.1859505595393 + ], + [ + 1.7273948393929097, + 7.218608531896166, + -7.035839827665355 + ], + [ + 2.2156296486587554, + 8.690319143792976, + -7.087143697033888 + ], + [ + 3.4222394728937084, + 8.942822454177758, + -7.1371456913892946 + ], + [ + 1.3575426336869514, + 6.796881486499615, + -8.472596273050954 + ], + [ + -0.2608176607330741, + 6.62431960652458, + -6.588382338543781 + ], + [ + 2.47221429408021, + 6.491715953954696, + -6.711845425629012 + ], + [ + 0.5466815066616303, + 7.421614106619188, + -8.84718108587243 + ], + [ + 2.2092861722813044, + 6.958355761296218, + -9.133325020159196 + ], + [ + 1.0785199991614418, + 5.74328231173601, + -8.485739624007918 + ], + [ + 1.2844088837548997, + 9.699619019772967, + -7.08137199551269 + ], + [ + 1.6321358482271613, + 11.176165532112236, + -7.1970387592069995 + ], + [ + 2.585202539317879, + 11.67120142529103, + -6.146554963528939 + ], + [ + 3.394503401355573, + 12.626516543071546, + -6.362279829646673 + ], + [ + 0.4024279021884726, + 12.017196989759213, + -7.406182070503943 + ], + [ + -0.4366301514394837, + 12.147006887384975, + -6.141597976236293 + ], + [ + 0.6277543821782783, + 13.472971608235412, + -7.916610811298695 + ], + [ + 0.341553105212078, + 9.337906778866795, + -7.064476725951431 + ], + [ + 2.2649055332226706, + 11.242082382946364, + -8.082113936527582 + ], + [ + -0.15031342640200318, + 11.47726355414136, + -8.174979363869946 + ], + [ + 0.1611232533083605, + 12.562760081589374, + -5.330462355426267 + ], + [ + -1.3640548356632565, + 12.713024995160254, + -6.2288061195556095 + ], + [ + -0.7082885497223298, + 11.154592858091974, + -5.781851728044537 + ], + [ + 1.1783699108544685, + 13.474195412608196, + -8.857312105575858 + ], + [ + -0.3098004369535568, + 13.94294682883401, + -8.213620619455181 + ], + [ + 1.1851483968538574, + 14.107158273232244, + -7.2272491967770005 + ], + [ + 2.5632236671502984, + 11.067378064831473, + -4.958300207248896 + ], + [ + 3.537621480065078, + 11.4474481518169, + -3.98192642566111 + ], + [ + 4.816679746462454, + 10.61608303164246, + -3.802484568095859 + ], + [ + 5.833392659204717, + 11.057788995619717, + -3.2403896444016005 + ], + [ + 1.9724735332786725, + 10.256048838823972, + -4.84489843668391 + ], + [ + 3.929216949692172, + 12.45429105320153, + -4.126896963521161 + ], + [ + 3.0392964162458984, + 11.464225510743802, + -3.0126530486918837 + ], + [ + 4.874122548547318, + 9.369776424245572, + -4.328498347737621 + ], + [ + 6.103439953736009, + 8.587367381419938, + -4.49926278457511 + ], + [ + 7.05328965581709, + 9.277482218448029, + -5.5096889756776815 + ], + [ + 8.265085464731875, + 9.058430601569341, + -5.334186652506012 + ], + [ + 5.786672975150561, + 7.128449739851135, + -4.646704207059885 + ], + [ + 5.894271030450586, + 6.453691774531535, + -3.250248758813812 + ], + [ + 7.274271664606307, + 6.014266394978563, + -3.0217259674470944 + ], + [ + 7.86960721715879, + 6.100802944616646, + -1.9329951296765806 + ], + [ + 7.8504681590901155, + 5.359316031237228, + -3.9358799280473913 + ], + [ + 4.1039059163145195, + 9.03357207524715, + -4.8887052875976815 + ], + [ + 6.582053210505105, + 8.707154258793594, + -3.5273158949401062 + ], + [ + 4.796859533076067, + 7.0896891704881, + -5.101532071878687 + ], + [ + 6.486287160375235, + 6.664260272961371, + -5.34180754012403 + ], + [ + 5.407556647279572, + 7.083274343868254, + -2.505376682345267 + ], + [ + 5.327127920243115, + 5.522883963706022, + -3.2432805010912573 + ], + [ + 6.495018227007038, + 9.933709069467227, + -6.569286591270911 + ], + [ + 7.223154832689119, + 10.851704397777667, + -7.474431265134339 + ], + [ + 8.097975084472958, + 11.77837562494517, + -6.612966723937452 + ], + [ + 9.337553092013959, + 12.007097481733808, + -6.837104061434467 + ], + [ + 6.232127666873487, + 11.683241225198287, + -8.211137295467285 + ], + [ + 5.442047276546402, + 10.835993184752056, + -9.182304822937871 + ], + [ + 6.8631400058041905, + 12.788890719935637, + -9.083531938028704 + ], + [ + 4.2832719002523305, + 11.49603661956138, + -9.876009100098376 + ], + [ + 5.49072284128184, + 9.873891728309957, + -6.658238703153932 + ], + [ + 7.845742718047322, + 10.257768252748235, + -8.143552551106694 + ], + [ + 5.622455681515211, + 12.238853093367482, + -7.498609197037084 + ], + [ + 6.162129741758135, + 10.428033938549333, + -9.891636836406944 + ], + [ + 5.0130902491998635, + 9.990334216820486, + -8.644754940376774 + ], + [ + 6.112626314098066, + 13.455746249493473, + -9.507954783533492 + ], + [ + 7.423388697321366, + 13.4880677971247, + -8.462746298160107 + ], + [ + 7.3744100832280255, + 12.198065598012022, + -9.843550352474802 + ], + [ + 3.516322806089165, + 10.799245492606758, + -10.214198164783044 + ], + [ + 3.945779294860084, + 12.314651696219357, + -9.240345773814916 + ], + [ + 4.70816886716572, + 11.872125439897843, + -10.806663970389492 + ], + [ + 7.541182303888288, + 12.240033970928721, + -5.5146678561531814 + ], + [ + 8.219569459482544, + 13.25356721101457, + -4.670524668869095 + ], + [ + 9.151863370861724, + 12.559684180420277, + -3.665794167277507 + ], + [ + 10.305318475636852, + 12.940643242648434, + -3.538472530817784 + ], + [ + 7.196126298017824, + 14.204742623187144, + -3.955886911977429 + ], + [ + 6.08996280100979, + 14.883746440412324, + -4.796566351097995 + ], + [ + 6.475109556326274, + 15.049311250105461, + -6.610186699563716 + ], + [ + 5.380778199961806, + 16.385198308322742, + -7.037214046013638 + ], + [ + 6.540506816218783, + 12.218480028608042, + -5.379447184370929 + ], + [ + 8.937723264444362, + 13.848023941194924, + -5.2353034198979636 + ], + [ + 6.668092990350255, + 13.737147889410608, + -3.1248423335162023 + ], + [ + 7.76649946626696, + 14.99521878463338, + -3.468111172846797 + ], + [ + 5.10441163303761, + 14.42166819216311, + -4.739380360210566 + ], + [ + 5.907288850691209, + 15.870772764612639, + -4.371697488499423 + ], + [ + 5.435990608435492, + 17.13404014549485, + -6.247094212249557 + ], + [ + 5.683008282255684, + 16.873010789849673, + -7.963927454039061 + ], + [ + 4.388822741112408, + 15.934224835976579, + -7.064546654583383 + ], + [ + 8.665645509112114, + 11.449053614568697, + -3.0215853878374594 + ], + [ + 9.473976945827554, + 10.612887715888519, + -2.1551800857911902 + ], + [ + 10.75264260703333, + 10.046269413239088, + -2.7930237560125235 + ], + [ + 11.755531575842054, + 9.820949701387292, + -2.149589714188091 + ], + [ + 8.658897563608832, + 9.471890723549734, + -1.5325384036957397 + ], + [ + 7.4721741045877375, + 10.088287737354676, + -1.159136093905713 + ], + [ + 7.717730994082928, + 11.178305628789644, + -3.2412506097299465 + ], + [ + 9.835236454211277, + 11.272277102187388, + -1.3660043586659538 + ], + [ + 8.312512595494509, + 8.68236285439491, + -2.199444712848555 + ], + [ + 9.155102647725077, + 9.197863909856096, + -0.6015234807162394 + ], + [ + 7.024474747910689, + 10.476650503843189, + -1.9143443648800595 + ], + [ + 10.833799274602741, + 9.805876146635, + -4.1325541228383305 + ], + [ + 12.045628648405168, + 9.5348245512252, + -4.959977041860638 + ], + [ + 13.074144819156151, + 10.694315974952701, + -4.935163098965807 + ], + [ + 14.14002380460174, + 10.550287936855625, + -4.364389131010424 + ], + [ + 11.507482561287755, + 9.108783751512078, + -6.388012312570262 + ], + [ + 12.483014691302868, + 8.513115704758661, + -7.448359208469443 + ], + [ + 13.738144641665352, + 9.414143235196434, + -7.821172417089888 + ], + [ + 13.200933713512288, + 7.20050122229884, + -6.999005221654797 + ], + [ + 9.966747137381757, + 9.903761764758201, + -4.641219635305192 + ], + [ + 12.502871844397177, + 8.638140433628337, + -4.541660707554664 + ], + [ + 10.729544988540768, + 8.349946991637239, + -6.303890133785196 + ], + [ + 10.964897747012836, + 9.938985945337379, + -6.840192431136749 + ], + [ + 11.960577458229576, + 8.31912163851024, + -8.38512210747132 + ], + [ + 13.484433056758622, + 10.472435090949432, + -7.8823970123476865 + ], + [ + 14.548704326820658, + 9.151808904480276, + -7.141266380298462 + ], + [ + 13.98828465244225, + 9.195732398540997, + -8.859355794726987 + ], + [ + 12.472399437971605, + 6.434645148248848, + -6.732915900337766 + ], + [ + 13.785177011783723, + 6.839048103236905, + -7.845237857624577 + ], + [ + 13.91510784584434, + 7.3572738404999996, + -6.190625495914496 + ], + [ + 12.732054724253697, + 11.883718800965028, + -5.536797229073768 + ], + [ + 13.700083116628631, + 13.022960476955348, + -5.637283913844578 + ], + [ + 13.963218167924452, + 13.812088736519058, + -4.36608097247848 + ], + [ + 14.988561694307268, + 14.47820514443083, + -4.354145831829959 + ], + [ + 13.427262088035635, + 13.924443031595501, + -6.82352930522554 + ], + [ + 13.254190598363607, + 13.28033012679441, + -8.06317051380039 + ], + [ + 11.754022725003875, + 12.053253169994889, + -5.723382872796387 + ], + [ + 14.673984795859058, + 12.591978410989611, + -5.869376329558779 + ], + [ + 12.529650706793195, + 14.514077910108085, + -6.6371832223574625 + ], + [ + 14.221024045970704, + 14.66370984833054, + -6.930892449861294 + ], + [ + 14.008442817332588, + 12.716510652257739, + -8.249752298750225 + ], + [ + 13.151206798801612, + 13.77308777701137, + -3.3168755147994875 + ], + [ + 13.332153408646285, + 14.397693177671272, + -2.0413627107701395 + ], + [ + 14.436919448733441, + 13.640319051338906, + -1.2045549738814019 + ], + [ + 14.947943587695734, + 14.174088196818843, + -0.20992884482961507 + ], + [ + 11.963141679720682, + 14.416997755066973, + -1.3407613800495524 + ], + [ + 12.387902578016341, + 13.118232242499175, + -3.409788194937294 + ], + [ + 13.572114206390136, + 15.441362600436946, + -2.244521122027149 + ], + [ + 11.438551136740626, + 13.493740380148552, + -1.5867257030173052 + ], + [ + 12.086343968220296, + 14.444787792373972, + -0.25810302876155244 + ], + [ + 11.313827549102301, + 15.175071198183787, + -1.778728618617099 + ], + [ + 14.7799234964348, + 12.424998577490442, + -1.5169192945923176 + ], + [ + 15.823758441068442, + 11.649855873128217, + -0.820056959899812 + ], + [ + 17.198023618054624, + 11.805193174848796, + -1.4105468317497418 + ], + [ + 18.10213412192689, + 11.17102914398896, + -0.8979783722433852 + ], + [ + 15.287994478175001, + 10.211509540139446, + -0.7383810536711259 + ], + [ + 14.394439196220858, + 12.048318147642135, + -2.3710940305707955 + ], + [ + 15.794129558430967, + 11.872661634798419, + 0.24651690838005685 + ], + [ + 16.012297844797054, + 9.471035309268757, + -0.39900104674037806 + ], + [ + 14.5115717769904, + 10.176420383894765, + 0.02583918762412584 + ], + [ + 14.695445270922686, + 10.058916432407841, + -1.640434551114097 + ], + [ + 17.3667618302013, + 12.595293141328398, + -2.4880562824562746 + ], + [ + 18.69774583672438, + 12.983757371189654, + -2.9719950846444427 + ], + [ + 19.5902316509351, + 13.794601133982951, + -2.0002777066273363 + ], + [ + 19.074301269016885, + 14.567358668598217, + -1.1747410830776808 + ], + [ + 18.720133279494124, + 13.780897334762699, + -4.286156138873804 + ], + [ + 17.85822695678693, + 13.0768968449309, + -5.390787809485826 + ], + [ + 18.385097997480113, + 15.148678233470719, + -4.309138418430468 + ], + [ + 16.564673541678467, + 13.049740563459807, + -2.9006477066726224 + ], + [ + 19.313511503784632, + 12.087987204434967, + -3.052799331726864 + ], + [ + 19.71176605046199, + 13.653145582628667, + -4.720253558387948 + ], + [ + 18.15830548723935, + 15.393840278593757, + -5.209172389105794 + ], + [ + 16.860390893882013, + 12.905633696126984, + -4.986946754382323 + ], + [ + 17.744861101894767, + 13.71318224076856, + -6.268506104111995 + ], + [ + 18.271637198817622, + 12.133172746755122, + -5.746567541855669 + ], + [ + 20.938673645110867, + 13.605023846398808, + -2.062235195117597 + ], + [ + 21.839941506975308, + 14.3827671350532, + -1.248291019191407 + ], + [ + 21.728426902737375, + 15.888674025514547, + -1.3962300434538988 + ], + [ + 21.822779990104827, + 16.476893099733616, + -0.34825982303176334 + ], + [ + 23.24186564519951, + 13.931092784947623, + -1.5650784421333612 + ], + [ + 22.983522840250007, + 12.437270962667526, + -1.7303571265745596 + ], + [ + 21.658158315091782, + 12.426435454945988, + -2.4659378376437893 + ], + [ + 21.726521088537748, + 14.084213502217494, + -0.20612899242956503 + ], + [ + 23.699738598026215, + 14.313434870995025, + -2.4773655168445834 + ], + [ + 23.866160388075034, + 14.245886801322172, + -0.728859755255574 + ], + [ + 23.770571134252926, + 11.992484414596277, + -2.339303426709052 + ], + [ + 22.87691920994501, + 12.000181582150105, + -0.7375389273413747 + ], + [ + 21.785394936021177, + 12.551817647082714, + -3.541200819383574 + ], + [ + 21.05187726540362, + 11.554169668731106, + -2.221651239725071 + ], + [ + 21.456673611217607, + 16.390185623336833, + -2.603398238028274 + ], + [ + 21.12456203763558, + 17.72721063230381, + -2.8951868444124615 + ], + [ + 19.98648324687512, + 18.271851968416968, + -2.0041918692584852 + ], + [ + 20.186564258502376, + 19.2851026720341, + -1.3347039060190433 + ], + [ + 20.92799469247697, + 17.881915739163446, + -4.363399309582208 + ], + [ + 20.24114844261605, + 19.132415905804578, + -4.882229168794967 + ], + [ + 20.56473540106813, + 19.52847896179685, + -6.336180990212353 + ], + [ + 19.957286575036992, + 20.869108261958672, + -6.755974800162735 + ], + [ + 18.475120549085776, + 20.91860521713295, + -7.0473939342956475 + ], + [ + 21.665130940836487, + 15.730172627539332, + -3.3389454268047793 + ], + [ + 22.106396526672356, + 18.156745674476724, + -2.6961967443586894 + ], + [ + 21.945549010189477, + 17.80090582138996, + -4.745657924406621 + ], + [ + 20.394352051640617, + 17.012071805607206, + -4.746415285222525 + ], + [ + 19.16242889738558, + 19.00783293285008, + -4.78769335034925 + ], + [ + 20.48496330266421, + 19.975880923422437, + -4.236305190316916 + ], + [ + 21.651136507868213, + 19.603187223635473, + -6.383560143356178 + ], + [ + 20.25234222461878, + 18.72807812152132, + -7.006908469529811 + ], + [ + 20.165195897226752, + 21.602727471269304, + -5.97707916289574 + ], + [ + 20.488909360070565, + 21.132282397206154, + -7.670425189068685 + ], + [ + 18.304504481037007, + 20.168491185364132, + -7.701856062870197 + ], + [ + 17.940700489246478, + 20.75699591800185, + -6.20574195867556 + ], + [ + 18.266180864728554, + 21.757087602661613, + -7.570262038623691 + ], + [ + 18.83706406052849, + 17.65703544176438, + -2.0442538243816366 + ], + [ + 17.731511322788187, + 17.967650728156855, + -1.131158947105027 + ], + [ + 18.253374908187652, + 18.02090026714768, + 0.3497378553723344 + ], + [ + 18.13370424256999, + 19.092173971199486, + 1.0257733639344282 + ], + [ + 16.546637736177782, + 17.033318235859724, + -1.226314327380502 + ], + [ + 15.498681837291686, + 17.54811060868667, + -2.1253552987477615 + ], + [ + 14.47156336615016, + 18.421416784715916, + -1.805813765414818 + ], + [ + 15.335361736314123, + 17.19425319380582, + -3.4279410798146803 + ], + [ + 14.199666550097893, + 17.794892945823676, + -3.9280602645799183 + ], + [ + 13.675461438476376, + 18.58635720442294, + -2.9767679860890883 + ], + [ + 18.769587856501495, + 16.851748749847502, + -2.650107975121353 + ], + [ + 17.345514918518017, + 18.972036654946123, + -1.3052703168856465 + ], + [ + 16.888361767091382, + 16.0473580575607, + -1.5412819740594805 + ], + [ + 16.031921861420482, + 16.896938975092553, + -0.27522647207734896 + ], + [ + 15.868470645329184, + 16.453233402184765, + -3.8601282093655422 + ], + [ + 14.245866642538921, + 18.902295415447043, + -0.8654861647959896 + ], + [ + 13.812660281910462, + 17.648448518480336, + -4.92564734159001 + ], + [ + 18.894203602470814, + 16.95055222125029, + 0.8222005327432413 + ], + [ + 19.26477750438219, + 16.869394010855103, + 2.2130905799912814 + ], + [ + 20.326123331145393, + 17.882791446118972, + 2.676201907855736 + ], + [ + 20.31743179376139, + 18.263958118017513, + 3.8097867894123216 + ], + [ + 19.588544112519738, + 15.443360648392513, + 2.518151575395139 + ], + [ + 18.30471719901508, + 14.534125511587263, + 2.8538463619291803 + ], + [ + 17.317737720860226, + 14.311649115634737, + 1.692276552902393 + ], + [ + 18.73462698331996, + 13.1017639566154, + 3.16267593677993 + ], + [ + 19.077788370511076, + 16.111484470109644, + 0.29082287834266407 + ], + [ + 18.389309360898835, + 17.096250502560224, + 2.8215252839718805 + ], + [ + 20.199709556110058, + 14.948227194278388, + 1.76355402821036 + ], + [ + 20.133307199272156, + 15.514992228574556, + 3.4595341841795215 + ], + [ + 17.71018863433942, + 14.926810617754654, + 3.678730322870605 + ], + [ + 17.72930597884801, + 13.812756833804201, + 0.8148819921342464 + ], + [ + 16.53209906898235, + 13.67387064724278, + 2.09738571615991 + ], + [ + 16.837717555714622, + 15.247375558575868, + 1.4057571390810737 + ], + [ + 18.918889190842652, + 12.575983100520318, + 2.225818972648445 + ], + [ + 19.649456651760595, + 13.136734478762719, + 3.7542502851697996 + ], + [ + 17.91538521378047, + 12.590927874837973, + 3.668630907980454 + ], + [ + 21.15876763159382, + 18.395521771016774, + 1.7532953032525713 + ], + [ + 22.12501573584002, + 19.484176931307047, + 1.9488910351145738 + ], + [ + 21.41669358687479, + 20.807949262818738, + 2.1456097562627185 + ], + [ + 21.438194411245256, + 21.401361700747316, + 3.227000892673316 + ], + [ + 23.142982144640253, + 19.486654198576957, + 0.8048914140445844 + ], + [ + 24.03582869838378, + 18.25352300037457, + 0.7667515910069069 + ], + [ + 24.87443753021528, + 18.15642567460884, + -0.5875491993376012 + ], + [ + 25.44726862269254, + 16.706504712252467, + -0.7838822018912832 + ], + [ + 26.84126922812743, + 16.57093871944221, + -0.3292256397322132 + ], + [ + 21.288999809021917, + 17.917704212192575, + 0.8730498282085839 + ], + [ + 22.74994583645548, + 19.25684902516241, + 2.8125365148257884 + ], + [ + 22.624797758343032, + 19.683622702621733, + -0.13361270883089948 + ], + [ + 23.816795656725592, + 20.326151217833058, + 0.9761218625667286 + ], + [ + 24.80675363775864, + 18.394336991018122, + 1.524339921299885 + ], + [ + 23.5859479816893, + 17.284277742003837, + 0.9818669788597847 + ], + [ + 24.1852389778379, + 18.257804754704352, + -1.4258966811787672 + ], + [ + 25.579687517979877, + 18.9846196741413, + -0.6569501645427471 + ], + [ + 24.788718318318764, + 15.939844345851611, + -0.3756594544749982 + ], + [ + 25.385758420964358, + 16.48426090156977, + -1.8492108228235764 + ], + [ + 27.356878041074186, + 15.905847872082632, + -0.8877097196936996 + ], + [ + 27.307666626793722, + 17.46251142451524, + -0.41682344341287814 + ], + [ + 26.836505142763254, + 16.43543984855546, + 0.6716321726935562 + ], + [ + 20.57546854229108, + 21.15287321797325, + 1.1136303991451486 + ], + [ + 19.712564617641117, + 22.28918806590366, + 1.0149668181724492 + ], + [ + 18.609390826959793, + 22.318843468294176, + 2.0827745217997475 + ], + [ + 17.956775213833605, + 23.34786782393553, + 2.1216997575682686 + ], + [ + 18.94943517728726, + 22.280240557402635, + -0.3833686195380069 + ], + [ + 19.94853410283597, + 22.002525940353507, + -1.414700469174036 + ], + [ + 20.582965952025088, + 20.530660791935134, + 0.31808173007785817 + ], + [ + 20.254141688969078, + 23.228662409736444, + 1.125357146881877 + ], + [ + 18.26171025674698, + 21.43497261369987, + -0.40899081024295214 + ], + [ + 18.469335399828665, + 23.250269425205943, + -0.512393612074051 + ], + [ + 19.856182208847216, + 21.103394994498558, + -1.7381729752118098 + ], + [ + 18.34908272140256, + 21.26379453803156, + 2.83865582819577 + ], + [ + 17.445053441351824, + 21.19431866427658, + 4.03630337628426 + ], + [ + 18.208178187501684, + 21.3526624037803, + 5.411761109592894 + ], + [ + 17.637106404507918, + 21.601257032852004, + 6.4532315229721435 + ], + [ + 16.661985770523366, + 19.824313376243026, + 3.957391502977928 + ], + [ + 15.596194210919696, + 19.819411914852026, + 2.84429991177318 + ], + [ + 15.877202506641009, + 19.534696325083587, + 5.2887888539148316 + ], + [ + 15.285721081137156, + 18.390390846305877, + 2.3774117903260144 + ], + [ + 18.62195057986718, + 20.354064572162315, + 2.495089168611702 + ], + [ + 16.67681955412369, + 21.963376688224116, + 3.9558936533489 + ], + [ + 17.3554895467161, + 18.99627703518206, + 3.810746105988415 + ], + [ + 14.679758257449933, + 20.337964676370348, + 3.125984105551056 + ], + [ + 15.878814933344376, + 20.335192384832, + 1.9265864996666204 + ], + [ + 14.974022436944338, + 18.93576271870279, + 5.171976479997003 + ], + [ + 16.591759129293308, + 19.009943371003146, + 5.922934535022246 + ], + [ + 15.501812931991537, + 20.47641066799156, + 5.689231590661113 + ], + [ + 14.905191326199319, + 17.871504036144984, + 3.2572151737192714 + ], + [ + 14.494910868216877, + 18.427894830821856, + 1.6282053033057005 + ], + [ + 16.14990808070767, + 17.869999256278447, + 1.9645272628362989 + ], + [ + 19.53550798870215, + 21.250104787585997, + 5.393164380807461 + ], + [ + 20.369591526688804, + 21.51620262894346, + 6.559129900113035 + ], + [ + 20.89770378790973, + 20.337160774263225, + 7.293312649839175 + ], + [ + 21.53892419426809, + 20.493881099803048, + 8.3479385210071 + ], + [ + 19.97218295642453, + 20.90495293008655, + 4.55038111500509 + ], + [ + 21.201770650981892, + 22.10331497191214, + 6.17070424234297 + ], + [ + 19.934764725895306, + 22.22467609253829, + 7.264177792185064 + ], + [ + 20.660025149023404, + 19.115231132411736, + 6.802691257663716 + ], + [ + 20.83792488226753, + 17.79896552950811, + 7.5246999849421 + ], + [ + 22.239143467642112, + 17.24351756371027, + 7.265057518583775 + ], + [ + 22.774180179174486, + 16.52322439767829, + 8.102924888073934 + ], + [ + 19.730272731853553, + 16.802860574909687, + 7.173749977892241 + ], + [ + 18.274437205751944, + 17.194947827665374, + 7.597251117834751 + ], + [ + 17.250303437973823, + 16.489007826439206, + 6.878534612141636 + ], + [ + 17.98752533656419, + 17.03127648060513, + 9.117648558594471 + ], + [ + 20.25823331541517, + 19.10852050103597, + 5.8760750727199484 + ], + [ + 20.713805510045308, + 17.91595435925649, + 8.601273979800222 + ], + [ + 19.744426100238016, + 16.691940815826342, + 6.089502234646249 + ], + [ + 19.893694393679876, + 15.86560905942747, + 7.7056818896632135 + ], + [ + 18.182453554108264, + 18.25278153726606, + 7.351017421179394 + ], + [ + 16.344539863948224, + 17.0922450407993, + 6.816920602023166 + ], + [ + 17.403886210590603, + 16.39950620485456, + 5.803127053336936 + ], + [ + 17.056939302159478, + 15.468640637955332, + 7.209530040734779 + ], + [ + 17.323917358015436, + 17.791644556920915, + 9.529432969720109 + ], + [ + 17.514290872727813, + 16.07112077945726, + 9.323189999804077 + ], + [ + 18.970909899407175, + 17.12085927288797, + 9.579198369917044 + ], + [ + 22.870006789681305, + 17.60454141465675, + 6.093896983146507 + ], + [ + 24.211027934173863, + 17.079832167875338, + 5.7010635486752905 + ], + [ + 25.27598584694727, + 18.226471304226152, + 5.634766894008879 + ], + [ + 24.958848721974082, + 19.35465815551231, + 5.249911602815255 + ], + [ + 24.0845406212499, + 16.424341316552272, + 4.257758812890637 + ], + [ + 23.156350658102767, + 15.1970013354711, + 4.326307171493704 + ], + [ + 23.040648104499727, + 14.76289731957479, + 2.8848814491749715 + ], + [ + 23.581213793326814, + 13.990050809386503, + 5.109294589730105 + ], + [ + 22.3395296945932, + 18.211312676338252, + 5.485191670148089 + ], + [ + 24.62409787086564, + 16.305602633867807, + 6.347624468252482 + ], + [ + 23.633078503289685, + 17.22502469329652, + 3.6719405029032317 + ], + [ + 25.06478140956102, + 16.129168755491378, + 3.8834545472379576 + ], + [ + 22.124953601781158, + 15.445127672053218, + 4.576811687673285 + ], + [ + 22.39628863190133, + 13.88542646233816, + 2.8306122698093885 + ], + [ + 22.57213546120695, + 15.50777428033507, + 2.2416438490053956 + ], + [ + 24.018611416017325, + 14.65738789972113, + 2.4152455073732835 + ], + [ + 22.786633884844626, + 13.24635082375005, + 5.169776583219195 + ], + [ + 24.510104755040206, + 13.617255646226795, + 4.677685377764348 + ], + [ + 23.783256989364375, + 14.488334310980576, + 6.057445192051443 + ], + [ + 26.494745177287783, + 17.84707633891321, + 6.048009223291836 + ], + [ + 27.644234585769063, + 18.749831868637557, + 6.022742802553489 + ], + [ + 27.909259984591, + 19.448319775379446, + 4.663494931376704 + ], + [ + 27.46376713225951, + 18.959411489426884, + 3.638861248912931 + ], + [ + 28.875413064498787, + 17.952340685697322, + 6.37123317630287 + ], + [ + 28.63585029878907, + 17.128306684447352, + 7.512909629486589 + ], + [ + 26.70279511260327, + 16.920002380204664, + 6.390573405972117 + ], + [ + 27.507096632379827, + 19.52851486422105, + 6.773040220837901 + ], + [ + 29.279071871218548, + 17.335814891457744, + 5.568080346468254 + ], + [ + 29.755500068231463, + 18.582103547642532, + 6.501418812653893 + ], + [ + 28.92306663923065, + 16.217304523981397, + 7.417129013370623 + ], + [ + 28.584266058526104, + 20.592775107753823, + 4.6621992426243315 + ], + [ + 29.37450960508307, + 20.985096506754303, + 3.502390499043581 + ], + [ + 30.31543104939648, + 19.96933575539299, + 2.865542179880397 + ], + [ + 30.846540367260737, + 18.99281635368402, + 3.351966779010812 + ], + [ + 30.144067044177397, + 22.26780895277909, + 3.947691298658326 + ], + [ + 30.349397706670523, + 22.061719672012146, + 5.384460656721577 + ], + [ + 29.006874991134737, + 21.435756223132444, + 5.792892574140302 + ], + [ + 28.681417966617687, + 21.278859507421544, + 2.7140864517167484 + ], + [ + 31.103479715471366, + 22.34424053097939, + 3.4360403426708306 + ], + [ + 29.58486642403017, + 23.202044664628374, + 3.8967090594112714 + ], + [ + 31.12505246743631, + 21.311831981613295, + 5.539793274390949 + ], + [ + 30.390479371617793, + 23.04438463215945, + 5.8543347594417865 + ], + [ + 29.208531146100963, + 20.86487021492792, + 6.69927153314237 + ], + [ + 28.25327680551936, + 22.200334248929607, + 5.981594154288972 + ], + [ + 30.506897100400526, + 20.18507810534527, + 1.5111903309990944 + ], + [ + 31.298161621640553, + 19.291857010708895, + 0.6375560132205309 + ], + [ + 32.188491733120706, + 20.05373923274101, + -0.3194269077992503 + ], + [ + 31.936890582607674, + 21.16182540939917, + -0.7392567962952838 + ], + [ + 30.337281686425143, + 18.5194335247362, + -0.26477741652271064 + ], + [ + 29.128406423971736, + 19.2378191793606, + -0.8556388340645239 + ], + [ + 28.02613332783889, + 19.10861572050885, + -0.26893190051352867 + ], + [ + 29.35451047168776, + 19.953810298388248, + -1.8993922004148707 + ], + [ + 29.934315815474285, + 20.95211154476283, + 1.1888477238754491 + ], + [ + 31.85240456876504, + 18.576607354789758, + 1.245281379106925 + ], + [ + 30.834405425026254, + 17.97099121458257, + -1.0648892058938817 + ], + [ + 29.910929530828977, + 17.74295462580369, + 0.37036376407210875 + ], + [ + 33.1634205597376, + 19.28024023501723, + -0.7832427495017066 + ], + [ + 33.91652539668413, + 19.582974158809975, + -2.0162619939025106 + ], + [ + 34.34550639566106, + 18.21980125819948, + -2.5968980060272595 + ], + [ + 34.790515450232824, + 17.324836554526883, + -1.8594110713282 + ], + [ + 35.10254162229596, + 20.446750582676145, + -1.6084854713700085 + ], + [ + 36.12502392419882, + 20.548196784695165, + -2.7362659329280548 + ], + [ + 35.97223874014387, + 21.560179976640484, + -3.731852291151 + ], + [ + 37.33084591931171, + 19.83389620155492, + -2.7004517252970786 + ], + [ + 36.95361120031836, + 21.728417175474192, + -4.671010197560606 + ], + [ + 38.345763726602605, + 20.066871715123966, + -3.6879963477330167 + ], + [ + 38.162508310085656, + 21.093949534983608, + -4.62207873067661 + ], + [ + 33.33613001861166, + 18.39591357573306, + -0.32691097996931473 + ], + [ + 33.314017117897464, + 20.109284965905772, + -2.7565879288208017 + ], + [ + 34.79699318246879, + 21.48217025275028, + -1.4579968824781033 + ], + [ + 35.55906750753608, + 20.116378036148035, + -0.6754580084386616 + ], + [ + 35.09611964029199, + 22.181855427290543, + -3.8429316488024625 + ], + [ + 37.52853721265303, + 19.06715154250594, + -1.9659989304808694 + ], + [ + 36.7513930825347, + 22.455995411669164, + -5.4431098041922255 + ], + [ + 39.219894144176656, + 19.447475287923226, + -3.5514512445105573 + ], + [ + 39.01801935282404, + 21.341460847429403, + -5.233009258367756 + ], + [ + 34.274272882265095, + 17.979133260001504, + -3.8899967755936764 + ], + [ + 34.58605587575151, + 16.68346940468973, + -4.511943012393412 + ], + [ + 34.32372164573022, + 15.349725565099789, + -3.855243116192942 + ], + [ + 35.19951919999062, + 14.526039661267077, + -3.7387089226810724 + ], + [ + 36.01698601458789, + 16.711182954223432, + -5.06445914072204 + ], + [ + 36.138579641442234, + 17.758121058566417, + -6.228685442841143 + ], + [ + 37.5301888259118, + 17.719491611100466, + -6.8863386938754925 + ], + [ + 37.75570909452497, + 18.0972725282993, + -8.178983649975534 + ], + [ + 38.53678356390845, + 17.300519686517646, + -6.319716514474455 + ], + [ + 33.990890304469936, + 18.782428147862674, + -4.4326834035326454 + ], + [ + 33.903394700823064, + 16.595514709295685, + -5.357127800494587 + ], + [ + 36.754808910366485, + 16.96434967896846, + -4.3031307178763925 + ], + [ + 36.26291457016888, + 15.760825492932668, + -5.538209938726358 + ], + [ + 35.31678877198937, + 17.615441702839348, + -6.9304049158465855 + ], + [ + 36.08374876152611, + 18.7288164626799, + -5.735894271696142 + ], + [ + 36.90450943420667, + 18.252872073814046, + -8.699897355723206 + ], + [ + 38.648390105899395, + 17.910829678445452, + -8.61311111136697 + ], + [ + 33.197325250016, + 15.12075551329167, + -3.207683519423551 + ], + [ + 32.835166661450565, + 13.913029182649325, + -2.5375937762376615 + ], + [ + 32.862611810966996, + 12.75171532064985, + -3.4521039832532505 + ], + [ + 32.535287838874176, + 12.87982375556345, + -4.657482208596075 + ], + [ + 31.3908058745078, + 14.143667916695335, + -1.7933005670609259 + ], + [ + 30.299431475284564, + 14.415773950694188, + -2.7542127198899915 + ], + [ + 29.145358928393975, + 15.048309104177747, + -2.1168182285423747 + ], + [ + 28.716515314389415, + 16.157495768186436, + -2.5369211092262867 + ], + [ + 28.601312363563512, + 14.520865029257152, + -1.094722701252779 + ], + [ + 32.42625352166941, + 15.739234087212822, + -3.415117183209294 + ], + [ + 33.60180831909718, + 13.609108917882963, + -1.8248598468231465 + ], + [ + 31.154852089488458, + 13.232603317230769, + -1.2434031829800087 + ], + [ + 31.514553667337875, + 14.918762230833636, + -1.0369823820212787 + ], + [ + 30.720941495115557, + 15.07864509165313, + -3.5098815284725875 + ], + [ + 29.98655596876613, + 13.467088293591246, + -3.190337362734274 + ], + [ + 33.22881350248496, + 11.604509550386638, + -2.845219516747991 + ], + [ + 33.4704743730956, + 10.381498933371688, + -3.6125030595075756 + ], + [ + 32.20323436405926, + 9.677737272709578, + -4.1406889016252055 + ], + [ + 31.16473643879239, + 9.84411535035963, + -3.5413989645870148 + ], + [ + 34.27822279530879, + 9.417550843545655, + -2.7740399842163996 + ], + [ + 35.42936374014549, + 9.991262216437349, + -1.9515147406660673 + ], + [ + 35.36817353866378, + 9.764003773678667, + -0.7600594150877688 + ], + [ + 36.437559967751156, + 10.508811271052991, + -2.429950707390834 + ], + [ + 33.32810088271518, + 11.517246366902214, + -1.8439071501909658 + ], + [ + 34.095785306541515, + 10.751023073491638, + -4.425238377200681 + ], + [ + 33.64851305261463, + 8.806908363950242, + -2.1269867337288035 + ], + [ + 34.73242597773982, + 8.717111718097158, + -3.474886708489391 + ], + [ + 32.32999807337416, + 8.958063033251335, + -5.261956705460787 + ], + [ + 31.139832762581992, + 8.276048095318117, + -5.889703876646474 + ], + [ + 30.497126375642022, + 7.224132822298316, + -5.0071078742808 + ], + [ + 29.320394787536575, + 6.911194805157493, + -5.067799686546847 + ], + [ + 31.473197749160718, + 7.599974228102781, + -7.277849239771342 + ], + [ + 31.829961618474414, + 8.672222761020407, + -8.306829170090303 + ], + [ + 30.949222012976215, + 9.555482493915804, + -8.80590486658942 + ], + [ + 32.99334376540965, + 8.763526528202476, + -8.702263988503107 + ], + [ + 33.198377821551375, + 8.837021132005589, + -5.76331575064739 + ], + [ + 30.422677094772997, + 9.090073905578151, + -5.9952909592389885 + ], + [ + 32.24163768489901, + 6.833370056800675, + -7.178266061453634 + ], + [ + 30.667581742567442, + 6.923912068199684, + -7.564242812861255 + ], + [ + 29.981195882166446, + 9.474512381003933, + -8.52936795929852 + ], + [ + 31.22908605248384, + 10.086208518700914, + -9.61837442024108 + ], + [ + 31.242523174092003, + 6.786686759001327, + -3.998966645429745 + ], + [ + 30.763625480887093, + 5.988051771655279, + -2.830983266926485 + ], + [ + 29.537442133374856, + 6.635491504351137, + -2.0897435476595105 + ], + [ + 28.6846160061444, + 5.877136305253089, + -1.627130790179585 + ], + [ + 31.88615381050302, + 5.8214387672729515, + -1.7642017003654178 + ], + [ + 33.06843007164899, + 4.942769861750463, + -2.1755629096542073 + ], + [ + 34.20872222260052, + 5.753261624689088, + -2.812910243983476 + ], + [ + 35.21738364119208, + 5.999992059408498, + -2.140858869006732 + ], + [ + 34.0351011839868, + 6.244993714353853, + -3.965767147769845 + ], + [ + 32.23854382878903, + 6.882759304702347, + -4.13611239264178 + ], + [ + 30.474804604389153, + 4.962470926787347, + -3.060910138934 + ], + [ + 32.27925406525575, + 6.75862277058792, + -1.3701687504640736 + ], + [ + 31.393588191427348, + 5.407909962394086, + -0.8841595850715088 + ], + [ + 33.50276202238272, + 4.512393844315, + -1.2732118677406599 + ], + [ + 32.72311437048563, + 4.165166280355464, + -2.856874579281202 + ], + [ + 29.466555036929485, + 7.977538950268922, + -2.008333685615356 + ], + [ + 28.453572769759635, + 8.656322670023997, + -1.2782946553402648 + ], + [ + 27.08876865295928, + 8.62123741621673, + -1.9287584231574546 + ], + [ + 26.093476978367853, + 8.461629286991126, + -1.2345213910075108 + ], + [ + 28.9125804734231, + 10.071316037044596, + -0.9497206290092249 + ], + [ + 30.139257035775135, + 10.129183720470223, + -0.06289302080927732 + ], + [ + 29.086032824526498, + 10.933450315247285, + -2.066733188712374 + ], + [ + 30.146855987708555, + 8.462880408425804, + -2.5755491121408562 + ], + [ + 28.39319430035988, + 8.096604657208616, + -0.34492847700230317 + ], + [ + 28.05797475007702, + 10.434252862811036, + -0.3787352091103042 + ], + [ + 30.002000449214606, + 10.895600574776495, + -2.3516421826383875 + ], + [ + 30.299397381773876, + 11.131728477287936, + 0.33380088044140305 + ], + [ + 29.988632368010162, + 9.45982204560562, + 0.7840811714464317 + ], + [ + 31.022494157547644, + 9.824352626811617, + -0.6242029423966977 + ], + [ + 27.0461790060909, + 8.699590554599297, + -3.227099352097966 + ], + [ + 25.959027083695094, + 8.447889585346672, + -4.059769583942138 + ], + [ + 25.55262580001155, + 6.9974675500264425, + -4.153594634772561 + ], + [ + 24.389171866588406, + 6.662971688127527, + -4.03440086240825 + ], + [ + 26.174146550543213, + 9.16437319197587, + -5.366866060621335 + ], + [ + 25.16374766241884, + 10.300415649774834, + -5.524974098397356 + ], + [ + 25.305095452412573, + 11.016832134480524, + -6.902316006261826 + ], + [ + 24.52339970392181, + 11.960226086451144, + -7.242518019214402 + ], + [ + 26.103334374960763, + 10.585037581045356, + -7.718991587543224 + ], + [ + 27.926606341428446, + 8.811955776500497, + -3.709097830641155 + ], + [ + 25.09725959845954, + 8.926706948636138, + -3.5948054664865725 + ], + [ + 27.198689325068358, + 9.455651120498374, + -5.598315388434419 + ], + [ + 25.822995923064813, + 8.41186696607275, + -6.072930891602352 + ], + [ + 24.215764484660912, + 9.762511481611853, + -5.534344566163775 + ], + [ + 25.19786896526519, + 10.948378699327804, + -4.649143855664097 + ], + [ + 26.49117767937034, + 6.047368430092433, + -4.190697838461453 + ], + [ + 26.190964838744737, + 4.608941706892949, + -4.102227945330512 + ], + [ + 25.531605926606026, + 4.143387947883525, + -2.6961451596058867 + ], + [ + 24.669446738752924, + 3.2698665524309405, + -2.782242414044105 + ], + [ + 27.468398131490915, + 3.760520984004046, + -4.462623522606196 + ], + [ + 27.82973572723391, + 3.9084920448634364, + -5.948291224173964 + ], + [ + 27.265936667997508, + 2.284265203252062, + -3.9803992580759293 + ], + [ + 29.203421824310105, + 3.5101433312782433, + -6.169626590060214 + ], + [ + 27.460564965057877, + 6.330886752062497, + -4.192711941176657 + ], + [ + 25.430524977878562, + 4.340086403259306, + -4.835407695196496 + ], + [ + 28.27335230408284, + 4.179835152348005, + -3.859028898493521 + ], + [ + 27.236068899624158, + 3.2563128019292265, + -6.588857929640004 + ], + [ + 27.773877721780178, + 4.932307427045629, + -6.318133455253854 + ], + [ + 27.426464213694388, + 2.2549038495206304, + -2.9026853672945485 + ], + [ + 26.264892810768053, + 1.9907585927228695, + -4.296428339305164 + ], + [ + 27.96582482384315, + 1.561597599176011, + -4.399930010700598 + ], + [ + 29.46894364865524, + 3.7386283101158995, + -7.201805307456395 + ], + [ + 29.860411154208144, + 4.270319407673298, + -5.747018045998284 + ], + [ + 29.40155645318416, + 2.49646999368926, + -5.821332454307315 + ], + [ + 25.806758935424284, + 4.783310805634045, + -1.5561033288232236 + ], + [ + 25.214294020985292, + 4.62852960124485, + -0.26039839208474624 + ], + [ + 23.706908855086223, + 5.054310888869992, + -0.42726337347486215 + ], + [ + 22.804173668493753, + 4.385983359919891, + 0.09554319276545767 + ], + [ + 25.992390025132835, + 5.4874806612495775, + 0.85639212405623 + ], + [ + 27.358199459950438, + 4.8584467746131565, + 1.303175517146344 + ], + [ + 28.33850104991288, + 5.574856234931502, + 1.7634777895241427 + ], + [ + 27.55611556621619, + 3.660836732477094, + 1.200021457091442 + ], + [ + 26.58118042064512, + 5.428460197812086, + -1.6205536081679428 + ], + [ + 25.29142187473436, + 3.5594369694632917, + -0.06242581460653361 + ], + [ + 26.218428491548536, + 6.473039278738781, + 0.4493533610982265 + ], + [ + 25.314872250137984, + 5.566113604394673, + 1.7066197992064742 + ], + [ + 28.28900245768568, + 6.582539331091198, + 1.7163296695453043 + ], + [ + 29.207948527451016, + 5.1559959200587, + 2.061339305388826 + ], + [ + 23.434798049546387, + 6.228066501830284, + -1.110859472118661 + ], + [ + 22.10396850198223, + 6.866950530741406, + -1.35653573068593 + ], + [ + 21.25799975286466, + 5.908717170263287, + -2.1618650754283024 + ], + [ + 20.15799789328582, + 5.541367858513723, + -1.76726497908229 + ], + [ + 22.3049220691918, + 8.269924390529297, + -1.8736930506951819 + ], + [ + 21.227624532685684, + 8.668124421249047, + -2.893356014663549 + ], + [ + 19.898299785995622, + 9.028754906504275, + -2.511215837409313 + ], + [ + 21.570906336068532, + 8.749029753699858, + -4.2357178204567765 + ], + [ + 18.929244946764257, + 9.291098603070225, + -3.5190987074732423 + ], + [ + 20.648674492021815, + 9.142159737732356, + -5.234799140942485 + ], + [ + 19.33628789372857, + 9.382939345640352, + -4.902753572653902 + ], + [ + 24.27659435404011, + 6.637167210976372, + -1.4904841505518132 + ], + [ + 21.666435018568077, + 6.940053329828231, + -0.36088490631170056 + ], + [ + 22.310942693765192, + 9.009914719160747, + -1.073393413718766 + ], + [ + 23.299918727947393, + 8.317839297576256, + -2.3161670599424697 + ], + [ + 19.635748482350937, + 8.994427506042655, + -1.4641767445212814 + ], + [ + 22.593480756340362, + 8.574362118496651, + -4.536110709108512 + ], + [ + 17.931210599245443, + 9.660159133625484, + -3.33437173185667 + ], + [ + 20.93223808089386, + 9.160332608278225, + -6.276749553216956 + ], + [ + 18.61536407250852, + 9.665094155978238, + -5.655784266966156 + ], + [ + 21.836339453617462, + 5.417458056013004, + -3.2535982870346616 + ], + [ + 21.21478739157278, + 4.469310935273086, + -4.104959818144434 + ], + [ + 20.81736950465402, + 3.206449603003719, + -3.4274899764932796 + ], + [ + 19.70007829397925, + 2.738175845117283, + -3.6094301247525125 + ], + [ + 22.101842645288144, + 4.334315478812641, + -5.279214195479712 + ], + [ + 22.35118801519182, + 5.501584070060943, + -6.373592342158631 + ], + [ + 23.633383795894954, + 5.27122201882753, + -7.1313138313978826 + ], + [ + 21.19812234678672, + 5.476711885207806, + -7.355278519513403 + ], + [ + 22.69302589951968, + 5.810470576679364, + -3.616554679614243 + ], + [ + 20.26106911959474, + 4.88769359180651, + -4.4266420033967915 + ], + [ + 23.09537825400739, + 4.083796167608739, + -4.90742121072599 + ], + [ + 21.792157768554272, + 3.425955268475434, + -5.79600963618842 + ], + [ + 22.312856644268823, + 6.424462908550282, + -5.794864424637046 + ], + [ + 23.79472454260747, + 6.1285246892689145, + -7.784843362203384 + ], + [ + 24.47407497065359, + 5.14334968137743, + -6.449413266039171 + ], + [ + 23.54571482903915, + 4.342459865694025, + -7.695064578606465 + ], + [ + 20.314476283179037, + 5.3364216016651085, + -6.732713268375453 + ], + [ + 21.11501440504447, + 6.451777628980352, + -7.835317384701921 + ], + [ + 21.32919279111709, + 4.689668307710235, + -8.097898281800381 + ], + [ + 21.739089362050183, + 2.6393007639879613, + -2.518785391553145 + ], + [ + 21.524239987010034, + 1.3514241249733274, + -1.7759487545081236 + ], + [ + 20.434000424279645, + 1.5216321522616454, + -0.7394924104997826 + ], + [ + 19.528748958246613, + 0.6916646412662821, + -0.6581836852934854 + ], + [ + 22.900175454860182, + 0.8756033458125358, + -1.394523975719958 + ], + [ + 23.108860740990735, + -0.5018697927963522, + -0.7733450103609208 + ], + [ + 22.587910324958496, + -0.5420399713335087, + 0.6024900558906611 + ], + [ + 22.526523507812428, + -1.6591411686599429, + -1.5495366626395775 + ], + [ + 22.67997792182004, + 3.0019794435195166, + -2.5761711809389722 + ], + [ + 21.033783265128815, + 0.6727707466278545, + -2.4737888055359925 + ], + [ + 23.543326801366355, + 0.8453548704961449, + -2.274036029636406 + ], + [ + 23.386411301109916, + 1.5453207278473542, + -0.6851924654467517 + ], + [ + 24.172601197263536, + -0.7323857464052494, + -0.7149419977240655 + ], + [ + 22.82229702638525, + -1.4227146321254551, + 1.2004646177468379 + ], + [ + 23.007135061470624, + 0.3323561066847809, + 1.1002667206601986 + ], + [ + 21.511390171172746, + -0.3714972612565397, + 0.6135083836260701 + ], + [ + 22.917672619137058, + -1.719051192705777, + -2.5651723553607164 + ], + [ + 22.686375220656515, + -2.6065038994798044, + -1.034705328576233 + ], + [ + 21.440423656701807, + -1.5685621816664437, + -1.5662679292894064 + ], + [ + 20.518559922339573, + 2.5386752445569414, + 0.12928991436654694 + ], + [ + 19.398825720185815, + 2.940072152005598, + 0.9778489612807989 + ], + [ + 18.081323818700216, + 3.024968116955165, + 0.13995619036325074 + ], + [ + 17.06296875907429, + 2.599423902402876, + 0.6848199309628683 + ], + [ + 19.697422957486587, + 4.30214924819046, + 1.5590070877758817 + ], + [ + 18.524167588321465, + 4.946951323438725, + 2.3036862180587354 + ], + [ + 17.954522620271675, + 4.085240849939112, + 3.447577710793437 + ], + [ + 16.947881025739175, + 4.865638576521974, + 4.224875350984671 + ], + [ + 16.457975321670542, + 4.271095602474787, + 5.495410678708014 + ], + [ + 21.396495913024484, + 3.02996538318466, + 0.0400201871036548 + ], + [ + 19.230477747463443, + 2.2071528448450266, + 1.7668908212514518 + ], + [ + 20.458295239288866, + 4.162109501129692, + 2.326837963141382 + ], + [ + 20.020786685229833, + 4.847736925376324, + 0.6725131231107415 + ], + [ + 19.023996387794522, + 5.838852223498208, + 2.6815556597524117 + ], + [ + 17.735691023597614, + 5.108653110336519, + 1.5686654757483407 + ], + [ + 17.423625733024743, + 3.2336029576467524, + 3.0221810688078823 + ], + [ + 18.77362240184703, + 3.791316678606705, + 4.103917709541466 + ], + [ + 17.441682895945178, + 5.822787449642959, + 4.3925895597819355 + ], + [ + 16.095335804960794, + 5.021768073037435, + 3.563900434806107 + ], + [ + 17.09289877331364, + 4.185495247572135, + 6.2762087713577985 + ], + [ + 15.555747372216482, + 4.658761783885041, + 5.73162055489734 + ], + [ + 16.162971418126915, + 3.3144993144915134, + 5.361262496119162 + ], + [ + 18.080615096564134, + 3.5481858521572462, + -1.0945425423092572 + ], + [ + 16.86114086125716, + 3.6419087402917683, + -1.9280114172850096 + ], + [ + 16.344464495029257, + 2.272570769055875, + -2.4755287673314035 + ], + [ + 15.130253892742871, + 2.0293618938581517, + -2.5073608856051863 + ], + [ + 16.93369489599288, + 4.72340644012246, + -3.0811399672554667 + ], + [ + 15.764365351010523, + 5.737158216703449, + -3.141281984405 + ], + [ + 15.993277554158107, + 6.963507759169147, + -4.027989974610227 + ], + [ + 15.100317071192508, + 7.905897223749605, + -3.8602737533317963 + ], + [ + 16.89735366379397, + 7.0285309518356485, + -4.870652693456604 + ], + [ + 18.882128878519, + 3.9915214739982616, + -1.520134030768341 + ], + [ + 16.01448362816279, + 3.9289696949455504, + -1.3044173088200142 + ], + [ + 17.867014273247502, + 5.283554891784519, + -3.0241769341037745 + ], + [ + 17.08879497406713, + 4.133345025200612, + -3.9843961606871625 + ], + [ + 14.777337491218939, + 5.400940989661564, + -3.4588240393650573 + ], + [ + 15.694010624072149, + 6.05872920588979, + -2.1021764731750947 + ], + [ + 14.510103070654262, + 7.91005019764475, + -3.0406820660936216 + ], + [ + 15.329472808846216, + 8.835396937554208, + -4.18216479303246 + ], + [ + 17.22161229972895, + 1.3549177820675098, + -2.881528012572797 + ], + [ + 16.80062369276107, + 0.06653642374906088, + -3.3419021868065935 + ], + [ + 16.168627143027937, + -0.8260367321304329, + -2.228558774946158 + ], + [ + 15.136354445134096, + -1.4439383306800408, + -2.447337344196382 + ], + [ + 18.01475163739124, + -0.6706387962885465, + -3.9337306462374086 + ], + [ + 18.190565635058498, + 1.6293979614276282, + -2.9582601328061178 + ], + [ + 16.058250522709272, + 0.24052585191520137, + -4.120817742815075 + ], + [ + 18.737481434087965, + 0.0082683563423962, + -4.3863311060086385 + ], + [ + 18.48718388175461, + -1.3219073566719146, + -3.1983699664139436 + ], + [ + 17.72815355748434, + -1.2755519611762125, + -4.793987422831404 + ], + [ + 16.767197044272574, + -0.8529348673666419, + -1.0229450537860236 + ], + [ + 16.245928224747182, + -1.361989096221194, + 0.2282447673633419 + ], + [ + 14.867109622770148, + -0.70913029259194, + 0.5537839329855521 + ], + [ + 14.004416568973655, + -1.4170144393569046, + 1.1137407460617958 + ], + [ + 17.315386503220413, + -1.2070981357797521, + 1.3494453728938895 + ], + [ + 18.308115160383874, + -2.4179258309953156, + 1.3283517325995144 + ], + [ + 19.134223716196182, + -2.6673827036134696, + 0.0518136734534399 + ], + [ + 19.264969369368075, + -2.019079166396196, + 2.466504959535722 + ], + [ + 17.608461045716602, + -0.30361128928417, + -0.9198998888214514 + ], + [ + 16.02770400411727, + -2.4152259296709815, + 0.051695481197278514 + ], + [ + 17.848295482831826, + -0.297633755166709, + 1.0719846439112843 + ], + [ + 16.776837653195148, + -1.217672960682087, + 2.2970500788363277 + ], + [ + 17.817249482925764, + -3.3596860275428924, + 1.5737885719385096 + ], + [ + 18.48014870901386, + -3.195175266195065, + -0.6422467932113811 + ], + [ + 19.521592071648445, + -1.7404250375398362, + -0.3710288435677596 + ], + [ + 20.007959205092558, + -3.260136605228567, + 0.32260691522439355 + ], + [ + 19.96576914183925, + -2.8377203893848417, + 2.630228409286449 + ], + [ + 19.80286254062127, + -1.0907748667321968, + 2.274097170006246 + ], + [ + 18.799394538176266, + -2.0320549659170126, + 3.451986915047868 + ], + [ + 14.746238556604156, + 0.505194084106801, + 0.07947117247894164 + ], + [ + 13.42859923925096, + 1.2532958728039603, + 0.17447894473436246 + ], + [ + 12.444162611834694, + 0.7325312585402948, + -0.8384732054066911 + ], + [ + 11.434237606865748, + 0.18305050979100557, + -0.4608332443760882 + ], + [ + 13.539069323477786, + 2.7641526148802313, + 0.2652084217708619 + ], + [ + 12.221308249330853, + 3.5221413751051784, + 0.5742495137695017 + ], + [ + 14.420673604951938, + 3.26046519045876, + 1.2584368539115782 + ], + [ + 15.484162907783194, + 0.8639571067184022, + -0.5094757725480942 + ], + [ + 13.012121776249154, + 0.9408834164217623, + 1.132103410495406 + ], + [ + 13.945598688470088, + 3.136907582934583, + -0.6749441753577062 + ], + [ + 15.301288288109324, + 2.964554093117414, + 1.0164620989875812 + ], + [ + 11.734753141039207, + 3.4174928329448733, + 1.5439985050916778 + ], + [ + 12.475105528939377, + 4.568825821016304, + 0.40650179447318513 + ], + [ + 11.58131555525027, + 3.293000786782102, + -0.2778093159677868 + ], + [ + 12.65749792558968, + 0.9020832373189833, + -2.1284375676129956 + ], + [ + 11.654160197584902, + 0.8478393572752694, + -3.154713780599604 + ], + [ + 11.27425646375825, + -0.600213752193735, + -3.466247620856619 + ], + [ + 10.04550850771116, + -0.9241004965215467, + -3.6482697217409576 + ], + [ + 12.08640113357536, + 1.5933538787479335, + -4.479228797432357 + ], + [ + 12.411602835339234, + 3.119114419549021, + -4.256650238527735 + ], + [ + 10.901198117486617, + 1.503556940212043, + -5.480817791595556 + ], + [ + 12.955193570859839, + 3.972660213492702, + -5.446485905919965 + ], + [ + 13.518150801113945, + 1.397942935035708, + -2.3114685757315145 + ], + [ + 10.707015971187381, + 1.272656450176541, + -2.8222229682119577 + ], + [ + 12.983479430473853, + 1.1546278159794099, + -4.916117222458206 + ], + [ + 11.506865614433151, + 3.5623493585047754, + -3.8406062925631486 + ], + [ + 13.163217741275298, + 3.162319279760098, + -3.468418013336773 + ], + [ + 10.908436434890609, + 0.4904167731346405, + -5.882805874342948 + ], + [ + 9.887046714013149, + 1.7327204553549223, + -5.153588233847143 + ], + [ + 11.124686764327887, + 2.0516018846760744, + -6.396132179127921 + ], + [ + 13.951764504988063, + 3.5951310035070208, + -5.675429448212845 + ], + [ + 12.335783876866618, + 3.952861977764229, + -6.3431699955761625 + ], + [ + 13.098121822471326, + 5.0272927536833265, + -5.211071421314705 + ], + [ + 12.289520110325777, + -1.4708691488295855, + -3.8085998760768467 + ], + [ + 12.04421532917789, + -2.7051348831489292, + -4.57489998283038 + ], + [ + 11.648120358516787, + -3.8352054409744483, + -3.6110696799034114 + ], + [ + 11.022985071310995, + -4.688935429964033, + -4.213428390958534 + ], + [ + 13.348243693975919, + -3.0380549408203876, + -5.299364116418095 + ], + [ + 13.355432079683403, + -4.309511976857976, + -6.180368185225713 + ], + [ + 13.965507746633152, + -1.9421182225607936, + -6.203480110711072 + ], + [ + 13.239791693142365, + -1.141706553021443, + -3.7151439705872313 + ], + [ + 11.227040234148241, + -2.4696694193883815, + -5.256720553953087 + ], + [ + 14.013526558458885, + -3.265911041868904, + -4.466549259865175 + ], + [ + 13.10795352242765, + -3.974612212686793, + -7.1876899195022474 + ], + [ + 14.380230904128318, + -4.68084138452528, + -6.181901481449418 + ], + [ + 12.649748133782126, + -5.043712259099436, + -5.791702916898338 + ], + [ + 13.386912061589722, + -1.6575360961518868, + -7.082308613072022 + ], + [ + 14.112300201443162, + -1.0155946050884452, + -5.648408386796004 + ], + [ + 14.962121605807068, + -2.296257978788489, + -6.467006273896659 + ], + [ + 11.872853919698676, + -3.7746681001144395, + -2.3763141045973604 + ], + [ + 11.462234079020325, + -4.931689671203117, + -1.4923910839398042 + ], + [ + 9.942091117415522, + -5.203749656440493, + -1.451659802904354 + ], + [ + 9.568259556555633, + -6.391554434332107, + -1.4551421722296798 + ], + [ + 12.50221867657946, + -3.026988018560246, + -2.12141027003038 + ], + [ + 11.918403324298794, + -5.829202666506546, + -1.9100993799964747 + ], + [ + 11.896747832004378, + -4.682137774233951, + -0.524392440321714 + ], + [ + 9.12971517770176, + -4.144223069489954, + -1.5216369555483644 + ], + [ + 7.6436545317322775, + -4.260560192190326, + -1.3084669247349139 + ], + [ + 7.0289168749186475, + -4.798366018930494, + -2.583439030893182 + ], + [ + 5.831339247988487, + -5.129174857961402, + -2.6036262728238606 + ], + [ + 7.032661505331985, + -2.8310480018957236, + -1.017288641705994 + ], + [ + 6.105854030560786, + -2.135161459933485, + -1.9950701791414618 + ], + [ + 6.242860473380935, + -2.9346627883852676, + 0.13362850754080144 + ], + [ + 9.560548882145154, + -3.2316064706661507, + -1.561780997698463 + ], + [ + 7.507235522467418, + -5.007123005913115, + -0.526077453060919 + ], + [ + 7.9337873335874605, + -2.253480825717901, + -0.8111563036413553 + ], + [ + 6.742256977940633, + -3.3030885874952673, + 0.8660662238094383 + ], + [ + 6.521315322861892, + -2.1406611649799316, + -3.002772220042601 + ], + [ + 5.142981880365774, + -2.633667985825724, + -1.8834118198987762 + ], + [ + 5.996584925744825, + -1.1184655870070301, + -1.617592423433585 + ], + [ + 7.742273858931889, + -4.933992499520656, + -3.68167079784889 + ], + [ + 7.11242673692647, + -5.36563251643426, + -4.956463981231962 + ], + [ + 6.798257223595488, + -6.863123800614005, + -5.0525302038429105 + ], + [ + 5.704887172236893, + -7.311008103503866, + -5.257071710561409 + ], + [ + 8.031244660416341, + -4.853998776449572, + -6.170839347265972 + ], + [ + 8.376129477149298, + -3.3433949123176774, + -6.075444736049616 + ], + [ + 9.273159317500381, + -2.9036397768032884, + -7.244770750734892 + ], + [ + 7.299002813896387, + -2.2364931254144267, + -6.024969831361102 + ], + [ + 8.723626804402562, + -4.732419899815767, + -3.5535401707493515 + ], + [ + 6.1390475934650794, + -4.926695331801682, + -5.175476550375319 + ], + [ + 8.826206338163068, + -5.579022086870111, + -6.345418009953258 + ], + [ + 7.526309846278993, + -4.877626083767893, + -7.13654351082377 + ], + [ + 8.967088835731175, + -3.248177000410152, + -5.164509727500929 + ], + [ + 10.194377322231427, + -3.481202465178086, + -7.3214536609262515 + ], + [ + 8.817404584223736, + -2.975008527825551, + -8.232339490694345 + ], + [ + 9.42277790615368, + -1.8270277334920735, + -7.163394057444808 + ], + [ + 7.7490162117050225, + -1.2439638766567995, + -6.046750958594774 + ], + [ + 6.692844239769886, + -2.3011455865266726, + -6.928568648488364 + ], + [ + 6.611305149959098, + -2.280958668031843, + -5.1804620504625625 + ], + [ + 7.82398019089222, + -7.839402031690838, + -4.812777329379626 + ], + [ + 7.493980041144269, + -9.220247510370825, + -4.48485621925106 + ], + [ + 6.54219351516917, + -9.324838296457415, + -3.2528611695258145 + ], + [ + 5.77448697452023, + -10.241716747180192, + -3.150519479606784 + ], + [ + 8.817252909628815, + -9.868765486523955, + -4.23452074234379 + ], + [ + 9.803062369433976, + -8.75072497251216, + -3.8669096690060023 + ], + [ + 9.241926906063357, + -7.6210676828087, + -4.7577128382720275 + ], + [ + 7.065074112165495, + -9.753813729105275, + -5.333057583086347 + ], + [ + 8.686718776595908, + -10.623445370066236, + -3.458943267759799 + ], + [ + 9.057210700848477, + -10.353956310596686, + -5.180622584915964 + ], + [ + 9.628997248559878, + -8.45922694651955, + -2.8311350773822923 + ], + [ + 10.817500218349972, + -9.066465720203155, + -4.110472916061863 + ], + [ + 9.46777649723723, + -6.671655391859417, + -4.272212992528499 + ], + [ + 9.77848551925519, + -7.693240921303698, + -5.703755004570185 + ], + [ + 6.723135423564879, + -8.454874167828848, + -2.2586315771628764 + ], + [ + 5.956819253698197, + -8.475461866646015, + -0.9889291401505461 + ], + [ + 4.4477880626889785, + -8.35420220939261, + -1.2411125851278975 + ], + [ + 3.593706123989038, + -9.01838378883491, + -0.6515992499557974 + ], + [ + 6.437462879922543, + -7.445307365129793, + 0.024973719719198498 + ], + [ + 5.93913646675291, + -7.647114111079475, + 1.3812724799910892 + ], + [ + 4.729629415523039, + -7.138545345439127, + 1.8244725227709777 + ], + [ + 6.773966215020853, + -8.232005186672552, + 2.332342515428343 + ], + [ + 4.312165018191164, + -7.346209649946047, + 3.145005663433071 + ], + [ + 6.341286998410843, + -8.488790251387115, + 3.6098491400813404 + ], + [ + 5.091221924087068, + -8.098657339287968, + 3.9693573219253535 + ], + [ + 7.372628950841109, + -7.683591754555778, + -2.316775029895836 + ], + [ + 6.185566157177904, + -9.417098941293204, + -0.4898366808997594 + ], + [ + 7.519887399451968, + -7.323623122685831, + 0.06559590336328232 + ], + [ + 6.041500433001947, + -6.467616841953117, + -0.24968343926429862 + ], + [ + 4.010430066441623, + -6.658315299806077, + 1.1775327027534308 + ], + [ + 7.614418592152179, + -8.777668961387974, + 1.9294856932577849 + ], + [ + 3.4070336482726917, + -6.865441848437456, + 3.4855948096585014 + ], + [ + 7.004235837248812, + -9.010321353139204, + 4.284315977388351 + ], + [ + 4.877213042310716, + -8.171202089824703, + 5.02545289842785 + ], + [ + 4.155749868506993, + -7.415747182212158, + -2.076982999990739 + ], + [ + 2.8209550883097454, + -7.227504528223335, + -2.665966121337933 + ], + [ + 2.2890276014950377, + -8.53151335569953, + -3.396134910358344 + ], + [ + 1.1640939472183494, + -8.897362960751195, + -3.1036978927599095 + ], + [ + 2.837833820794972, + -6.037876531572266, + -3.6178422688861365 + ], + [ + 1.4606081344109245, + -5.891016494644418, + -4.172536229994754 + ], + [ + 3.2258938639585217, + -4.855014971151974, + -2.985999671588718 + ], + [ + 4.947879843467884, + -6.893069544348066, + -2.4225803781929685 + ], + [ + 2.1734870477152586, + -7.025811733446119, + -1.812615820023201 + ], + [ + 3.4936770798847796, + -6.271900630074242, + -4.456414428913604 + ], + [ + 4.173465960177173, + -4.850134973166746, + -2.8321088499283498 + ], + [ + 0.676024642619829, + -6.39356887252481, + -3.6068786511739623 + ], + [ + 1.21895742248097, + -4.83149927354367, + -4.256965889423524 + ], + [ + 1.401053073235978, + -6.370343126016309, + -5.149674534722193 + ], + [ + 3.057252890109888, + -9.125056915525192, + -4.406549330099128 + ], + [ + 2.5830057495118726, + -10.161335121830234, + -5.283574853199751 + ], + [ + 2.3620757954825393, + -11.50042139823887, + -4.583093122992972 + ], + [ + 1.411861123563671, + -12.26499239964869, + -4.80623168761886 + ], + [ + 3.464558167191622, + -10.176602237478221, + -6.568328702101924 + ], + [ + 3.066880361207412, + -11.217818588085947, + -7.578316905145545 + ], + [ + 1.7268541917927567, + -11.337622636184221, + -8.007879981056632 + ], + [ + 4.037052898963048, + -12.015927136624953, + -8.156085259493171 + ], + [ + 1.33497295895773, + -12.24872313807299, + -8.996266637984053 + ], + [ + 3.6080205644163508, + -12.991946245857548, + -9.093166567287422 + ], + [ + 2.2804377024097278, + -13.051778416276989, + -9.575866795157204 + ], + [ + 1.9852253872565542, + -13.724238626447686, + -10.71999974390294 + ], + [ + 3.9595006811978606, + -8.707443819649654, + -4.584451753367101 + ], + [ + 1.5919333546793732, + -9.849774665096277, + -5.613431077555684 + ], + [ + 3.4773615987893303, + -9.179073673711457, + -7.0074989064110875 + ], + [ + 4.52601764319228, + -10.332889392465177, + -6.37603262593833 + ], + [ + 0.951184026449936, + -10.720861134724885, + -7.5785283464960225 + ], + [ + 5.061886817925799, + -12.024082450331093, + -7.815422810434322 + ], + [ + 0.35351879762174093, + -12.174988144125223, + -9.440912658630763 + ], + [ + 4.308839063583861, + -13.74431744742617, + -9.423605452998116 + ], + [ + 2.7520857918797326, + -14.231602319414833, + -10.995874763298437 + ], + [ + 3.158419289397987, + -11.73643378860288, + -3.467806193312791 + ], + [ + 2.8215873066066703, + -12.706858363559888, + -2.4805630315721725 + ], + [ + 1.4390880647615287, + -12.604201625455289, + -1.7126013414721892 + ], + [ + 0.6611973837003482, + -13.54392260333259, + -1.701714051375736 + ], + [ + 4.099694880460369, + -12.759528780838593, + -1.5264775278251839 + ], + [ + 3.916355699632344, + -13.561552254590538, + -0.2415036738088009 + ], + [ + 3.151816432595263, + -12.627855079104279, + 1.1004870818114276 + ], + [ + 4.532995687264218, + -11.600916186016548, + 1.5342949925677585 + ], + [ + 3.941253456704847, + -11.126152674711932, + -3.281184672720421 + ], + [ + 2.8378480532960366, + -13.64034090498842, + -3.043098759228727 + ], + [ + 4.886592928683062, + -13.178621680981223, + -2.153576504508468 + ], + [ + 4.672774379405926, + -11.841239208747197, + -1.3983260361679812 + ], + [ + 3.3467958042767556, + -14.41741609635767, + -0.6037139985435195 + ], + [ + 4.868799824795892, + -13.966701745855744, + 0.10026266726294521 + ], + [ + 5.3793142141344825, + -12.223660124030346, + 1.824184716768693 + ], + [ + 4.814839809175634, + -10.880255410380244, + 0.7666277047129434 + ], + [ + 4.315081582414867, + -10.95882396330802, + 2.3877175485087014 + ], + [ + 1.29146627986004, + -11.415406799191942, + -1.0854034995888726 + ], + [ + 0.0894397077710247, + -11.156045345297173, + -0.255409118131095 + ], + [ + -1.2260401990011698, + -11.33524214936216, + -1.040960387007927 + ], + [ + -2.110417146975331, + -12.033972007223667, + -0.5257777988007989 + ], + [ + 0.1503418715622732, + -9.781869912643856, + 0.3682536592131105 + ], + [ + 0.601500112264583, + -9.945250137873074, + 1.8367537964415934 + ], + [ + 0.9705526326048213, + -8.517670629707368, + 2.3555613085897167 + ], + [ + -0.5327663127204678, + -10.38959571051663, + 2.7719560159195797 + ], + [ + 2.0555500121032955, + -10.755050388902077, + -1.0996297023211394 + ], + [ + -0.048311234941931236, + -12.009566944128892, + 0.4083868706539772 + ], + [ + 0.7568121303429793, + -9.095684830090875, + -0.222883592256152 + ], + [ + -0.8095290149645618, + -9.26636027182036, + 0.3366814965498008 + ], + [ + 1.480068675340401, + -10.577794657206425, + 1.9636507089062099 + ], + [ + 0.09009577251217463, + -7.898160251334161, + 2.184959048968059 + ], + [ + 1.2441595500253098, + -8.59704386522975, + 3.4076730608430505 + ], + [ + 1.8219175196974806, + -8.124247182381396, + 1.8001368981268024 + ], + [ + -0.8299375304848214, + -11.372121743892023, + 2.4053095890854808 + ], + [ + -0.2472037269488385, + -10.341288218265902, + 3.822775469919826 + ], + [ + -1.292497665159192, + -9.643245969876602, + 2.5398575757440818 + ], + [ + -1.295771246773442, + -10.644211020029445, + -2.194701206121203 + ], + [ + -2.433405212712532, + -10.689217830716075, + -3.0079618918315076 + ], + [ + -2.622586098199177, + -12.1406248412394, + -3.5776532922314708 + ], + [ + -3.755914761282918, + -12.6669715507594, + -3.4939994005638173 + ], + [ + -2.2198820656500566, + -9.605018473464213, + -4.0388668887875445 + ], + [ + -2.2140739767512403, + -8.229812797333807, + -3.3919786308642053 + ], + [ + -3.5507495630425887, + -7.692119360791139, + -2.8281099506915113 + ], + [ + -4.130545307612349, + -6.612524879686873, + -3.2183059090017814 + ], + [ + -3.9474806773341102, + -8.208503147595195, + -1.769534542946923 + ], + [ + -0.559270281332761, + -10.014283475225398, + -2.4790560752792765 + ], + [ + -3.264222256852319, + -10.407090337440081, + -2.3612415494887964 + ], + [ + -1.4293291089768847, + -9.800664051225908, + -4.763331396174737 + ], + [ + -3.0388118712760264, + -9.63958080065811, + -4.7573781645893245 + ], + [ + -1.5372763983651658, + -8.284813750235685, + -2.5393235954396833 + ], + [ + -1.8045735152317417, + -7.536554156725629, + -4.126691741584893 + ], + [ + -1.6218896697669698, + -12.949856116893557, + -3.9452968561311956 + ], + [ + -1.8523380655492474, + -14.20074964922594, + -4.5779845301660975 + ], + [ + -2.328632419170266, + -15.31178450759353, + -3.5543786394886308 + ], + [ + -3.1400934861520557, + -16.125188269329897, + -4.002260920134688 + ], + [ + -0.5546502205542613, + -14.721284848950177, + -5.17928538905217 + ], + [ + -0.289899774628581, + -13.999084171510617, + -6.553709059865972 + ], + [ + -0.916540556309328, + -14.756233517447981, + -7.726192417742168 + ], + [ + -0.09081882465738847, + -15.959642191336343, + -8.201567814723953 + ], + [ + -0.7826923692879125, + -16.67312638456974, + -9.272949164618224 + ], + [ + -0.7275574834742286, + -12.554664865419397, + -4.1984671494367545 + ], + [ + -2.527942082349764, + -14.16035473907425, + -5.432401710618279 + ], + [ + 0.27106349848789724, + -14.546159067594658, + -4.489628351680732 + ], + [ + -0.6464903472349245, + -15.771702366490786, + -5.455480737286663 + ], + [ + -0.8199514566631436, + -13.05064514845219, + -6.64095743237652 + ], + [ + 0.7595094569928532, + -13.760100465300184, + -6.726122703536747 + ], + [ + -1.8908113527537014, + -15.032096818188279, + -7.322711554069758 + ], + [ + -0.9745810695724353, + -14.101632421855129, + -8.595805353080037 + ], + [ + 0.8839167114267441, + -15.549094848641175, + -8.465085425016433 + ], + [ + -0.002539955052592252, + -16.678852040742413, + -7.387290659915637 + ], + [ + -1.646180269818584, + -17.145321311568978, + -9.045965395068883 + ], + [ + -0.9943676563831713, + -15.91264123513156, + -9.902992245558945 + ], + [ + -0.15879242009847094, + -17.312061535410976, + -9.744768676481097 + ], + [ + -1.9838874083500584, + -15.078944798846464, + -2.2991914756393848 + ], + [ + -2.5886902299050076, + -15.750424716738962, + -1.0744734864680625 + ], + [ + -4.101509728893129, + -15.405847298026742, + -0.9039361399575244 + ], + [ + -4.943361804549185, + -16.261220993654774, + -0.9215042536381203 + ], + [ + -1.7137421174004135, + -15.564111427807234, + 0.19305183407185322 + ], + [ + -2.285998817179612, + -16.088188479727705, + 1.4679380507622901 + ], + [ + -2.3202689445959037, + -17.443686066433884, + 1.7861948581631997 + ], + [ + -3.0078508587612407, + -15.466648833899626, + 2.5887374948490867 + ], + [ + -3.4749319582644613, + -16.44031477337205, + 3.5341375577490246 + ], + [ + -3.401304455684743, + -14.131122360899326, + 2.968768126037324 + ], + [ + -2.904985567919051, + -17.620082481411146, + 2.9895653214342186 + ], + [ + -4.320551926687377, + -16.110961543496273, + 4.622354106640786 + ], + [ + -4.068049183104997, + -13.772371289502303, + 4.172610569306993 + ], + [ + -4.522751749555006, + -14.766944927659779, + 5.0060799470845145 + ], + [ + -1.4633726627017767, + -14.23335217235092, + -2.1144240018814817 + ], + [ + -2.609810335406723, + -16.821984079209415, + -1.2730187225871104 + ], + [ + -0.7381921935627168, + -16.013442754489915, + 0.0072975180966172 + ], + [ + -1.4793933180466774, + -14.511076155249839, + 0.3489392866089985 + ], + [ + -1.9369258277977168, + -18.179524982145153, + 1.0948305736444148 + ], + [ + -3.077972356164889, + -18.50968991900288, + 3.435402452104576 + ], + [ + -2.9654662550529385, + -13.356916241516274, + 2.354723448612351 + ], + [ + -4.757055879950018, + -16.92744510883915, + 5.178429248900753 + ], + [ + -4.0531497553347, + -12.735609180958022, + 4.474775861999044 + ], + [ + -5.1151261639369245, + -14.438389355991262, + 5.847235904016859 + ], + [ + -4.350955184493664, + -14.14524606238524, + -0.6834324703164045 + ], + [ + -5.695375749198564, + -13.528061536710311, + -0.3931308998461937 + ], + [ + -6.686660778694221, + -13.854609694573469, + -1.475454492951076 + ], + [ + -7.840305562789026, + -13.95925121234643, + -1.101659860568404 + ], + [ + -5.595931225686937, + -11.960360330298158, + -0.09149440213218621 + ], + [ + -4.8818105695653795, + -11.63380905048507, + 1.2368618698026088 + ], + [ + -4.556579599100738, + -10.11361377567897, + 1.2758192364669956 + ], + [ + -5.646711895469297, + -9.27230056205076, + 1.7925189364558758 + ], + [ + -5.957541907446845, + -8.059984184522989, + 1.4868761939710329 + ], + [ + -5.380080728394696, + -7.451359265070209, + 0.47896582654748304 + ], + [ + -6.911516584131179, + -7.448639266193197, + 2.0945800556101775 + ], + [ + -3.6028493981535386, + -13.4679312200725, + -0.6423976227360612 + ], + [ + -6.140902945693738, + -13.981015886287423, + 0.49255423717539276 + ], + [ + -5.014625745226004, + -11.488335549570138, + -0.8835638894509478 + ], + [ + -6.620666830567741, + -11.590064288057874, + -0.061522538339023713 + ], + [ + -5.491814200894259, + -11.888941823198877, + 2.1034084766828633 + ], + [ + -3.943750037106769, + -12.186150676101988, + 1.2921931471712091 + ], + [ + -3.730817611228157, + -9.94587452785919, + 1.9672532490353074 + ], + [ + -4.23135205332006, + -9.752519680859052, + 0.3001454629453983 + ], + [ + -6.2188794442673725, + -9.535260843727997, + 2.582187915227784 + ], + [ + -4.80099838850514, + -8.012779521085236, + -0.12895904518586537 + ], + [ + -5.730669920155577, + -6.547842760050287, + 0.19463424903663307 + ], + [ + -7.461780513917022, + -7.9539814965802975, + 2.774240894315883 + ], + [ + -7.022370075515451, + -6.471963766987699, + 1.8623808941182087 + ], + [ + -6.281682213290755, + -13.866490275034266, + -2.6920428858979526 + ], + [ + -7.0691066520589505, + -14.086640818288515, + -3.8819943505680774 + ], + [ + -7.438327853597573, + -15.536191829578115, + -4.02473684628018 + ], + [ + -8.589023157373976, + -15.880859784838322, + -4.377460927971828 + ], + [ + -6.336601638454558, + -13.42669182246459, + -5.109788636230245 + ], + [ + -6.1288121780983, + -11.938019656594975, + -5.132528993679237 + ], + [ + -6.538084663215818, + -11.02772617876326, + -4.214260906893939 + ], + [ + -5.3100195951497495, + -11.214665418656068, + -6.116792459600373 + ], + [ + -5.297414045530469, + -9.840946571180098, + -5.726107803449162 + ], + [ + -4.601994493707683, + -11.584291802636244, + -7.2507912257179115 + ], + [ + -6.028540383410531, + -9.766918113938857, + -4.5227584178868225 + ], + [ + -4.6284887340496885, + -8.902098958795875, + -6.497265409002996 + ], + [ + -3.7813353902882105, + -10.657702526654418, + -7.949724867187042 + ], + [ + -3.871677310370006, + -9.283861923131155, + -7.611525648286495 + ], + [ + -5.364246915920408, + -13.45361395769089, + -2.7811802730998405 + ], + [ + -7.9985104085808025, + -13.52135871020937, + -3.8129933875300237 + ], + [ + -5.407462467725187, + -13.984876177376577, + -5.224825482999481 + ], + [ + -6.8630751512158, + -13.770736948713648, + -6.000045401355962 + ], + [ + -7.050216721705753, + -11.329091127511447, + -3.3124282680587367 + ], + [ + -6.085047344340348, + -9.006232379217636, + -3.8607431122332323 + ], + [ + -4.458362863660681, + -12.638507952754878, + -7.436254523978127 + ], + [ + -4.642978562338333, + -7.86666133750964, + -6.190575629031522 + ], + [ + -3.1835477104132277, + -10.978778686776764, + -8.789938386047652 + ], + [ + -3.4398535475731613, + -8.50345717216095, + -8.220539303493823 + ], + [ + -6.4794825236827105, + -16.426949705719267, + -3.7339061400614244 + ], + [ + -6.8082830634600855, + -17.817196156127693, + -3.6278951818582335 + ], + [ + -7.613619679513643, + -18.175645959356416, + -2.3869128140753477 + ], + [ + -8.3334296497221, + -19.156756188438294, + -2.2997303366957937 + ], + [ + -5.670361118988613, + -18.78165078232996, + -3.813456478682929 + ], + [ + -5.433887045042031, + -19.115919522371428, + -5.341451941115824 + ], + [ + -3.862998258662181, + -20.03102548602112, + -5.604567568467281 + ], + [ + -4.233742961793367, + -21.612680247647972, + -4.779328799445758 + ], + [ + -5.531254644438789, + -16.136207191609856, + -3.543034468144432 + ], + [ + -7.490190278744412, + -18.02086124277355, + -4.453499485213688 + ], + [ + -4.727338315348108, + -18.4302222444951, + -3.394760122763746 + ], + [ + -5.869713548471151, + -19.75622052630729, + -3.367836708910189 + ], + [ + -6.30478694357227, + -19.574078162482806, + -5.810198226078008 + ], + [ + -5.511985423855321, + -18.19412165904555, + -5.917905593657062 + ], + [ + -5.316329432472023, + -21.734409758365928, + -4.815215171011637 + ], + [ + -3.7217649688049836, + -22.381229393756826, + -5.358386500378476 + ], + [ + -3.9424907878534303, + -21.632606093079858, + -3.7291493424474056 + ], + [ + -7.456211811197477, + -17.29223247042694, + -1.3856102485820094 + ], + [ + -8.15833833498961, + -17.498779116858714, + -0.08541091639899744 + ], + [ + -9.656689350896203, + -17.170760520578256, + -0.2545917222228375 + ], + [ + -10.585451445704397, + -17.943302640648312, + 0.06795338970821115 + ], + [ + -7.55323035376923, + -16.682390770988718, + 1.0712092024759186 + ], + [ + -8.499160148822073, + -16.162494010025284, + 2.168616572897176 + ], + [ + -6.435436021025052, + -17.510667502194337, + 1.7077607318899473 + ], + [ + -6.586731622656491, + -16.790915994475313, + -1.2725308429926796 + ], + [ + -8.027321725537186, + -18.53428464055594, + 0.22869701784407426 + ], + [ + -7.135838986562125, + -15.752254179398278, + 0.6855521808460091 + ], + [ + -9.281023673995444, + -15.591642343269996, + 1.6677001060040242 + ], + [ + -8.959420577146233, + -17.017855217853594, + 2.663208621327866 + ], + [ + -8.05431276672177, + -15.57976800670906, + 2.975238633980196 + ], + [ + -5.733404287536447, + -17.819706203871874, + 0.9333270832274352 + ], + [ + -5.952793927181357, + -16.87019323003733, + 2.4459693536274174 + ], + [ + -6.8381163758292836, + -18.36247437002669, + 2.255824560449876 + ], + [ + -9.876027495230817, + -15.997882956035937, + -0.9615051061910969 + ], + [ + -11.312277468538786, + -15.604526630633472, + -1.2550374272208904 + ], + [ + -12.007249201186617, + -16.637465911487766, + -2.228315486445988 + ], + [ + -13.050370680964908, + -17.17754139582746, + -1.841661723218858 + ], + [ + -11.35244380491971, + -14.159961373382998, + -1.8307032997182873 + ], + [ + -10.865703795398844, + -13.07112435950927, + -0.8790026883405537 + ], + [ + -9.918837530756802, + -12.062634629536262, + -1.3192918603253307 + ], + [ + -11.31823512433058, + -13.02383540342339, + 0.4239070353519152 + ], + [ + -9.335967209941309, + -11.099892392870913, + -0.43319600103981454 + ], + [ + -10.62496796336563, + -12.162810978421021, + 1.268494130907702 + ], + [ + -9.619424638388168, + -11.305190259330459, + 0.9124523428042536 + ], + [ + -9.087168547289195, + -15.422495096031525, + -1.2198252542952703 + ], + [ + -11.94872130803553, + -15.542271827067907, + -0.3723359128988559 + ], + [ + -10.67513286671774, + -14.137797089850892, + -2.68443507537974 + ], + [ + -12.396495680060593, + -13.981033057012041, + -2.0876875460470457 + ], + [ + -9.813811238089272, + -11.990654171449478, + -2.3917602057674676 + ], + [ + -12.040726869182828, + -13.744628081444262, + 0.7772683671841072 + ], + [ + -8.603591372521437, + -10.367012305206345, + -0.738009109973755 + ], + [ + -10.875099377285688, + -12.096649835004825, + 2.3170441450658115 + ], + [ + -9.084603437909175, + -10.74719400190179, + 1.6667779348217813 + ], + [ + -11.353384073266072, + -17.061634321730025, + -3.3038569060932477 + ], + [ + -11.905168351024038, + -18.118568909750707, + -4.222918309985642 + ], + [ + -11.837968275023496, + -19.492712342417235, + -3.5466395076778015 + ], + [ + -12.240108135631175, + -20.432135174076166, + -4.185045429364235 + ], + [ + -11.21471088991925, + -17.98706613477509, + -5.550646968475875 + ], + [ + -12.027121052180627, + -18.502439190289124, + -6.717631013997506 + ], + [ + -11.623266414820426, + -18.169035230378427, + -8.157784988222677 + ], + [ + -10.15518740866602, + -18.20233863126282, + -8.55874956832198 + ], + [ + -9.946819171594749, + -17.312976266740634, + -9.7320556684756 + ], + [ + -10.409854340447295, + -16.744091428441607, + -3.474201476253327 + ], + [ + -12.967731046480512, + -17.956995513043807, + -4.404444829802829 + ], + [ + -10.930803183456849, + -16.943838467924593, + -5.689087944939379 + ], + [ + -10.240955158097373, + -18.467727789986043, + -5.456490541098568 + ], + [ + -12.126822782910669, + -19.58545298705485, + -6.645191577572788 + ], + [ + -12.998223126311203, + -18.02509304590444, + -6.586478656318842 + ], + [ + -12.261641915326214, + -18.70958525110757, + -8.856627965236697 + ], + [ + -11.8435263068495, + -17.102419475623037, + -8.11400982377905 + ], + [ + -9.495665365016063, + -17.864303258630116, + -7.759461746801319 + ], + [ + -9.867462962235987, + -19.22774464693464, + -8.790836854890689 + ], + [ + -10.51389012944567, + -17.67773396980408, + -10.484038927033822 + ], + [ + -10.180145197189786, + -16.344124374061153, + -9.567773231867303 + ], + [ + -9.002995955315004, + -17.262559897311803, + -10.08808366250527 + ], + [ + -11.331498223635363, + -19.712435178530995, + -2.299386181498584 + ], + [ + -11.351000169774782, + -20.96530958809433, + -1.4806420736667611 + ], + [ + -10.660941440784331, + -22.118468916875145, + -2.2264712089130927 + ], + [ + -11.110788583725697, + -23.257140837003135, + -2.237497476387763 + ], + [ + -10.762583006446215, + -18.916099117065073, + -2.0498253686003967 + ], + [ + -10.823776199999296, + -20.86365109348003, + -0.532063517179669 + ], + [ + -12.375340020028235, + -21.2238210911205, + -1.2123179332507803 + ], + [ + -9.50552028415148, + -21.789020467526484, + -2.8488641875872824 + ], + [ + -8.714066878278812, + -22.770480355000586, + -3.5842012415417623 + ], + [ + -7.581239201895192, + -23.386731417646274, + -2.6262248791475824 + ], + [ + -7.037379052766233, + -24.45942248696656, + -2.9705716406927447 + ], + [ + -7.9524321282142365, + -22.009723595918445, + -4.720982497288895 + ], + [ + -8.68058876727629, + -21.193244713500462, + -5.752588319139782 + ], + [ + -9.447911701970089, + -22.061875769508674, + -6.7619212943279665 + ], + [ + -9.033101336450741, + -22.064445134301536, + -7.926780928980715 + ], + [ + -10.307610011430523, + -22.953409450207573, + -6.432539109866549 + ], + [ + -9.309726488516898, + -20.798942437269034, + -2.8877481258086797 + ], + [ + -9.223000843846904, + -23.674003884407853, + -3.9199551875222203 + ], + [ + -7.379103247440655, + -21.304384570053912, + -4.1194069966716995 + ], + [ + -7.303096928744082, + -22.71070594065486, + -5.245469693123925 + ], + [ + -9.350368835573413, + -20.502605388884035, + -5.240225995001836 + ], + [ + -8.081356294976137, + -20.388103192255357, + -6.177763229378048 + ], + [ + -7.234387490673133, + -22.750758997289154, + -1.5120943577016315 + ], + [ + -6.276410091538002, + -23.261386688908715, + -0.5306183434470063 + ], + [ + -7.244611014853716, + -23.828332796300856, + 0.5565940552740718 + ], + [ + -8.153800162086291, + -23.044353412660143, + 0.9285123950005874 + ], + [ + -5.29125858257441, + -22.144754174315608, + 0.031057826687987917 + ], + [ + -4.591334244584895, + -21.40348618767507, + -1.1268530326398338 + ], + [ + -4.326840980394348, + -22.79554336904323, + 1.073814888560231 + ], + [ + -3.972643866684592, + -20.100504481726034, + -0.7796422355991954 + ], + [ + -7.8019377539393835, + -21.975074634613975, + -1.2017692266286606 + ], + [ + -5.709630165973652, + -24.082681179094607, + -0.9691726390636936 + ], + [ + -5.8931846315294685, + -21.43525358919362, + 0.598857191220736 + ], + [ + -3.8253204650333466, + -22.026418223172186, + -1.588676067736522 + ], + [ + -5.3143841125267475, + -21.13697312697684, + -1.89774323099702 + ], + [ + -3.784883415305704, + -21.937036796659868, + 1.4704858830852503 + ], + [ + -4.847066681646672, + -23.26158337175434, + 1.9106359520321963 + ], + [ + -3.6798932952474406, + -23.45528163324684, + 0.4956218107608922 + ], + [ + -3.6574467739833145, + -19.49839429129088, + -1.6318239726418617 + ], + [ + -4.644683441813854, + -19.4685437670297, + -0.19904652233447767 + ], + [ + -3.088201875953987, + -20.29151474432831, + -0.17187626073680964 + ], + [ + -7.081588937119702, + -25.103326221122302, + 1.0118971841946096 + ], + [ + -7.836740977327455, + -25.610115475302223, + 2.1782128553878093 + ], + [ + -7.505927512381869, + -24.8549922748698, + 3.500650115592639 + ], + [ + -6.383408599742097, + -24.344416095424094, + 3.76611295899812 + ], + [ + -7.365574628035112, + -26.998170316859387, + 2.2927716774374503 + ], + [ + -6.636130994844873, + -27.42085423990966, + 0.9651570902007506 + ], + [ + -6.16157909456868, + -26.110610878422108, + 0.44772859166576445 + ], + [ + -8.908609418721177, + -25.53223062940924, + 1.9961862422810297 + ], + [ + -6.684653922992464, + -27.13804303959887, + 3.132345160816893 + ], + [ + -8.173717068821112, + -27.72441391945904, + 2.3798396109994866 + ], + [ + -5.760464969522269, + -28.022057503889982, + 1.2098287820656723 + ], + [ + -7.292286782272895, + -27.940474708304237, + 0.266904234756651 + ], + [ + -5.262069240490377, + -25.86624024760647, + 1.0127642596021302 + ], + [ + -6.060580498232603, + -26.16211368642678, + -0.6363594995028823 + ], + [ + -8.608873403496348, + -24.78854000962258, + 4.29596612522532 + ], + [ + -8.546993298899118, + -23.927898023486705, + 5.567460194093611 + ], + [ + -7.591801456926123, + -24.473803749321746, + 6.723249357556733 + ], + [ + -7.242608290640755, + -23.740019076664794, + 7.612454016268959 + ], + [ + -9.978642278082633, + -23.80493690352114, + 6.06452853388177 + ], + [ + -10.236495141611565, + -22.58717974775186, + 6.988150744739575 + ], + [ + -11.618389620975162, + -22.249330131140027, + 7.39651901201985 + ], + [ + -12.311198631626386, + -23.165474143141637, + 8.358755563126016 + ], + [ + -11.535484609258145, + -23.180954331872385, + 9.64641080314751 + ], + [ + -9.48590637138346, + -25.263675813456416, + 4.137353957132743 + ], + [ + -8.193564444147412, + -22.967590907767203, + 5.191971120962336 + ], + [ + -10.642062892189124, + -23.673015787254826, + 5.209795251465827 + ], + [ + -10.242749026891243, + -24.71861301410263, + 6.59702202405385 + ], + [ + -9.614203873251363, + -22.76051352984723, + 7.866107826053339 + ], + [ + -9.801419484795435, + -21.713035328166256, + 6.503709911909837 + ], + [ + -11.489314236341853, + -21.26557717144192, + 7.847814777053072 + ], + [ + -12.227259625880615, + -22.085310686662524, + 6.507432959511554 + ], + [ + -13.286556704253547, + -22.684767219656692, + 8.434239651144273 + ], + [ + -12.429010797504482, + -24.200793910817993, + 8.038861891944874 + ], + [ + -10.594051216303871, + -23.519242582449465, + 9.507254541552784 + ], + [ + -11.437016037216903, + -22.25071003300934, + 10.027266015574007 + ], + [ + -12.011111300698671, + -23.697788459953927, + 10.372192400539278 + ], + [ + -7.182698701770414, + -25.72934742607572, + 6.550367514712924 + ], + [ + -6.1288555729767324, + -26.414025387299716, + 7.3476783889079496 + ], + [ + -4.703373257691998, + -26.109181025353905, + 6.807189951054957 + ], + [ + -3.732298096452611, + -26.770995386261347, + 7.207291235764209 + ], + [ + -6.3834789593608585, + -27.980257716269534, + 7.442069063676006 + ], + [ + -6.535635734273065, + -28.514267251894125, + 5.967142092856505 + ], + [ + -7.591325077623282, + -28.208191280700703, + 5.370110567237548 + ], + [ + -5.7119919149613425, + -29.332873743189793, + 5.414907393804523 + ], + [ + -7.548531089052313, + -26.35247926636839, + 5.844694093191079 + ], + [ + -6.205125615326642, + -26.0821152804308, + 8.383109755119941 + ], + [ + -5.542161808011549, + -28.44760425502659, + 7.953801909224217 + ], + [ + -7.25713047965147, + -28.264367647751442, + 8.028681164775671 + ], + [ + -4.5852602079429685, + -25.152623371501022, + 5.852202200798061 + ], + [ + -3.356754970695944, + -24.998370947381318, + 5.0583464681097245 + ], + [ + -3.1307555629263426, + -23.558866370968303, + 4.556259968454978 + ], + [ + -2.087892594883409, + -23.346525385465384, + 3.943322020306405 + ], + [ + -3.2042267677716607, + -25.93582226765909, + 3.841698419363364 + ], + [ + -3.6116077587437347, + -27.381264792840057, + 4.033132567658205 + ], + [ + -3.42947351299387, + -28.401742810546466, + 2.874320790051387 + ], + [ + -4.1177607567399495, + -29.485764997139768, + 2.7352826810228263 + ], + [ + -2.658620775306886, + -28.173565734020713, + 1.9691548761897892 + ], + [ + -5.406467317240243, + -24.706128336330266, + 5.469631058053686 + ], + [ + -2.6181336090228675, + -25.1054756836495, + 5.8527449417955175 + ], + [ + -3.7982712327400465, + -25.574213051100628, + 3.0023826784851733 + ], + [ + -2.1900505946121673, + -26.0220474027916, + 3.4516837105558107 + ], + [ + -3.0596592756984937, + -27.752105615343226, + 4.896803227554011 + ], + [ + -4.66086898478096, + -27.371964503996878, + 4.328202149829526 + ], + [ + -4.829294491700573, + -29.75138361918289, + 3.4010646927609716 + ], + [ + -3.8519645369144424, + -29.974256502776598, + 1.892174551040727 + ], + [ + -4.011917804804724, + -22.64370733416979, + 4.911903137210065 + ], + [ + -3.7793412320528255, + -21.164017018250433, + 4.613888746379302 + ], + [ + -2.378137751283832, + -20.656898398352837, + 5.161950485469739 + ], + [ + -1.7701456694680435, + -19.8964741269383, + 4.398131033690325 + ], + [ + -4.808610342693892, + -20.208044730009533, + 5.241367905154199 + ], + [ + -6.174653878249204, + -20.181770399393827, + 4.6285377777081065 + ], + [ + -6.610241149864093, + -20.986324994051984, + 3.5918330892021233 + ], + [ + -7.319429656468988, + -19.443554118810425, + 5.104952428053531 + ], + [ + -8.36426432843556, + -19.690060163378575, + 4.160376874480483 + ], + [ + -7.4792321901201575, + -18.608532414779802, + 6.200544921818511 + ], + [ + -7.841154232228076, + -20.594429741217027, + 3.2800135472985597 + ], + [ + -9.585212161900685, + -19.095781384344264, + 4.402114558165995 + ], + [ + -8.696980806430775, + -18.000520178000897, + 6.350639715770595 + ], + [ + -9.771638681453956, + -18.301897614548807, + 5.504469588686305 + ], + [ + -4.921699653462767, + -22.903698641463052, + 5.265175627855081 + ], + [ + -3.73051901392463, + -21.08961314653004, + 3.5275278236578753 + ], + [ + -4.931462182516311, + -20.365606421055645, + 6.312900353063766 + ], + [ + -4.434633208045021, + -19.19075422318224, + 5.125777257916734 + ], + [ + -6.0107900263686025, + -21.700433577271497, + 3.046758197304195 + ], + [ + -8.333820526888298, + -21.10465938422044, + 2.5609565221551907 + ], + [ + -6.669990001255551, + -18.428205464839948, + 6.892649958671902 + ], + [ + -10.49799850125264, + -19.30107612885388, + 3.8626038053928675 + ], + [ + -8.909190710037725, + -17.47068937235838, + 7.267507225784962 + ], + [ + -10.782258378901359, + -18.07494746434577, + 5.8103122283777 + ], + [ + -2.0005956459861953, + -20.885626499041337, + 6.376253587379712 + ], + [ + -0.6060541934467063, + -20.614282220825544, + 6.8605108756050255 + ], + [ + 0.44509851757375457, + -21.565727681667113, + 6.244453369496695 + ], + [ + 1.4422564993351727, + -20.962095540640803, + 5.931112160598329 + ], + [ + -0.4969020022191604, + -20.513485384392084, + 8.384321359253565 + ], + [ + -1.4148189269816982, + -19.397897162050754, + 8.99607758584622 + ], + [ + -1.3702442486351727, + -17.642637008684574, + 8.41449023509389 + ], + [ + -2.506297541118721, + -17.57083684320628, + 7.040864312148334 + ], + [ + -2.612816427001201, + -21.40739174703822, + 6.987028018927795 + ], + [ + -0.3790450715773539, + -19.593196983857638, + 6.553989971990559 + ], + [ + -0.737420177352495, + -21.40131018857346, + 8.969143020782127 + ], + [ + 0.5479073575738319, + -20.33173794723382, + 8.636197884575285 + ], + [ + -2.4358521358364267, + -19.770551837463586, + 8.914093680614426 + ], + [ + -1.1920236079124593, + -19.350466937730516, + 10.062010402242363 + ], + [ + -2.6955158840371665, + -16.51681659544579, + 6.837541821705665 + ], + [ + -1.8770019652250387, + -17.979175406325567, + 6.250076336294446 + ], + [ + -3.423011461115556, + -18.140243047143713, + 7.194202850386236 + ], + [ + 0.2188984646753246, + -22.85866763566446, + 5.915304693745089 + ], + [ + 1.2338274277838852, + -23.720444450600098, + 5.1820179654075735 + ], + [ + 1.476053032652171, + -23.04197292583808, + 3.7767209443826433 + ], + [ + 2.620194397475202, + -22.823934381711865, + 3.4791713491505853 + ], + [ + 0.6730096655365815, + -25.094953151408504, + 5.006628463878728 + ], + [ + 1.5996858935664324, + -26.075577917276178, + 4.295673832934746 + ], + [ + 0.9949915143244079, + -27.437325647743364, + 3.893096914368248 + ], + [ + 2.1202732660163446, + -28.363683118942845, + 3.187459343346352 + ], + [ + 1.431649044545864, + -29.417853220300003, + 2.433968803785709 + ], + [ + -0.7058578617923704, + -23.169161166009644, + 6.177069322593402 + ], + [ + 2.138719738518024, + -23.73904346731149, + 5.789408114921702 + ], + [ + 0.5145195619935518, + -25.441242959657643, + 6.0279346008688535 + ], + [ + -0.2463598441924567, + -24.945886286123482, + 4.440378975235843 + ], + [ + 2.019744710703776, + -25.627539077864753, + 3.3951688009208496 + ], + [ + 2.432676100758418, + -26.26787130129992, + 4.971877623310197 + ], + [ + 0.6268594051921942, + -27.855382840996526, + 4.8300112936233885 + ], + [ + 0.14592764313334375, + -27.246309141241227, + 3.236817018964392 + ], + [ + 2.5610981997256017, + -27.634895127149775, + 2.507282792553095 + ], + [ + 2.8598210849137238, + -28.71691926578751, + 3.9060639078234143 + ], + [ + 1.0662337384212812, + -30.149051357439475, + 3.027195338506043 + ], + [ + 0.6754512716860656, + -28.93723527238808, + 1.9678400326694216 + ], + [ + 2.052291747030709, + -29.840331094654857, + 1.7583842935599314 + ], + [ + 0.44482099962219085, + -22.780197424159496, + 2.933956252792597 + ], + [ + 0.626817183322467, + -22.331932243378105, + 1.5625934743552563 + ], + [ + 1.182532110527125, + -20.853034902741115, + 1.5419904670964502 + ], + [ + 2.014633500150952, + -20.5493238086201, + 0.6974541807607233 + ], + [ + -0.6727877716500923, + -22.605625788916655, + 0.686358295135645 + ], + [ + -0.583648450069565, + -22.506672463917198, + -0.8350739629912991 + ], + [ + 0.6131891012031044, + -23.108053679043564, + -1.4365138382680191 + ], + [ + 0.4486030751789126, + -23.155541659437517, + -2.9925833328953533 + ], + [ + 1.647560902393045, + -23.546770375962296, + -3.7258480410739527 + ], + [ + -0.4796435869833714, + -22.877241676776407, + 3.328984622156322 + ], + [ + 1.4445198644900312, + -22.903567519565968, + 1.1236205716644012 + ], + [ + -0.895061355747789, + -23.668320374559244, + 0.7832000186380859 + ], + [ + -1.5857721175445758, + -22.07706249494595, + 0.9605469792245714 + ], + [ + -1.4629977546193627, + -23.032728832093653, + -1.2067082847102135 + ], + [ + -0.5137009018248089, + -21.428324421322714, + -0.9777909298720656 + ], + [ + 1.5129318086285404, + -22.53777332912557, + -1.2055554612936787 + ], + [ + 0.6538754560999743, + -24.15459685672033, + -1.1345430897049658 + ], + [ + -0.30545246007689325, + -23.89544691493336, + -3.26098783970467 + ], + [ + 0.1124553007864016, + -22.20568527111061, + -3.4083683587907276 + ], + [ + 2.0719426425423664, + -24.36404379463761, + -3.3110376585747443 + ], + [ + 1.4559884974559056, + -23.5967652821505, + -4.716252694783647 + ], + [ + 2.3023677943273144, + -22.78870785967024, + -3.5967628878343083 + ], + [ + 0.8283931712323127, + -20.04353513939293, + 2.6023980093885677 + ], + [ + 1.3123334518013383, + -18.65282664039478, + 2.7843594132954457 + ], + [ + 2.7936646415554462, + -18.60598334266149, + 2.8071121175908393 + ], + [ + 3.4156604173549607, + -17.745533356446344, + 2.175506069655605 + ], + [ + 0.6199843695493493, + -17.9769884803992, + 3.996278523416264 + ], + [ + 1.284015195202695, + -17.037567209715235, + 4.880513405332106 + ], + [ + 1.7488786391655011, + -17.38369311559302, + 6.070959347674804 + ], + [ + 1.538478590762828, + -15.591999806537046, + 4.795568195360424 + ], + [ + 2.169318883920461, + -15.1713607606913, + 5.996683360819418 + ], + [ + 1.3846140958466229, + -14.656393558668242, + 3.7864805778046935 + ], + [ + 2.3246381244909413, + -16.299655319250064, + 6.6859295578094295 + ], + [ + 2.6042212379394516, + -13.839243457015186, + 6.189791886779897 + ], + [ + 1.72336009469163, + -13.26295647543077, + 4.009953970800168 + ], + [ + 2.392656376119703, + -12.897252821538359, + 5.211744258651985 + ], + [ + 0.1142335764572891, + -20.374786514826496, + 3.2351295011703756 + ], + [ + 0.9659921786999172, + -17.987386134642975, + 1.9935770916858708 + ], + [ + -0.3890503369847498, + -17.63834901045493, + 3.7611738692984718 + ], + [ + 0.4959257006322411, + -18.776366882072466, + 4.726824993872446 + ], + [ + 1.58102297892382, + -18.38153387435284, + 6.4484991451957105 + ], + [ + 2.627135952570381, + -16.322837358459537, + 7.649287586889304 + ], + [ + 0.8960316793382312, + -14.867262544778896, + 2.846682362240603 + ], + [ + 3.0217463184238875, + -13.634900907234396, + 7.164633603462228 + ], + [ + 1.5008572080948075, + -12.579085538263826, + 3.2042159418294136 + ], + [ + 2.7825817989105044, + -11.907028840121654, + 5.395631732159411 + ], + [ + 3.4217963626347783, + -19.638764965044288, + 3.4751438594728303 + ], + [ + 4.8933348856363725, + -19.752605308287684, + 3.5306290455108194 + ], + [ + 5.514215456657738, + -20.373448759281246, + 2.3251795919755955 + ], + [ + 6.623743550746948, + -19.93379235543341, + 2.0406653002606747 + ], + [ + 5.309596999418862, + -20.305460494668182, + 4.877242349172743 + ], + [ + 5.224945254820066, + -19.348728011619187, + 6.002973748718644 + ], + [ + 4.156170271131333, + -19.212133336306806, + 6.83531100679961 + ], + [ + 6.184672390782422, + -18.321447265014058, + 6.4646015688355 + ], + [ + 5.601983019650854, + -17.649547444855898, + 7.586370857896109 + ], + [ + 7.501543622468395, + -17.93065249952963, + 6.031803233853203 + ], + [ + 4.416751167828907, + -18.299673225223273, + 7.848128488588622 + ], + [ + 6.362850532148774, + -16.64545654233507, + 8.241174803085666 + ], + [ + 8.167899559831818, + -16.868298206429472, + 6.6522208533606575 + ], + [ + 7.543387767310851, + -16.201273311087903, + 7.6639105801541945 + ], + [ + 2.91192833090554, + -20.306966835509684, + 4.035179972432459 + ], + [ + 5.319079804857642, + -18.749452551720992, + 3.5536108272218927 + ], + [ + 4.700553025383219, + -21.195489395500545, + 5.035387910382429 + ], + [ + 6.326835241682814, + -20.67762970686681, + 4.755515151720375 + ], + [ + 3.212737138387502, + -19.72503224650086, + 6.72012516679443 + ], + [ + 3.733087436814768, + -18.123855931958133, + 8.570480602798487 + ], + [ + 7.966370788566557, + -18.472854031772044, + 5.221648254645481 + ], + [ + 6.004346045854671, + -15.997205492901003, + 9.027081978143281 + ], + [ + 9.123650166657557, + -16.5640501369204, + 6.251754622158764 + ], + [ + 8.086717821108968, + -15.36225395017118, + 8.072860985035462 + ], + [ + 4.790608023242133, + -21.33654065433882, + 1.6241795648769175 + ], + [ + 5.372445487057847, + -21.939186259187068, + 0.3805624450840709 + ], + [ + 5.347505315947684, + -20.82861188843424, + -0.6898763555475222 + ], + [ + 6.2470666955211716, + -20.76068762379475, + -1.5473996047733607 + ], + [ + 4.443795430234776, + -23.21546904932984, + 0.06745550000346394 + ], + [ + 5.048168707843173, + -24.05943045698666, + -1.0596468290625964 + ], + [ + 4.073346952234875, + -25.196229207156307, + -1.3406114988094582 + ], + [ + 4.2581418846384524, + -26.28062134481638, + -0.7242460066444507 + ], + [ + 3.3108793603022044, + -25.139425328169523, + -2.285037321947529 + ], + [ + 3.943268688931576, + -21.64345174713867, + 2.0801647929248923 + ], + [ + 6.378792026324501, + -22.309010886987835, + 0.5770210922477896 + ], + [ + 4.5270188466219174, + -23.693798607942654, + 1.0433531875324455 + ], + [ + 3.439679134540443, + -22.85346802805509, + -0.15346646608404574 + ], + [ + 5.236514726138357, + -23.393384292948326, + -1.9016729577919365 + ], + [ + 5.995716442784084, + -24.438085520166055, + -0.6764053536194699 + ], + [ + 4.351687900895482, + -19.90022671075485, + -0.6285747681530491 + ], + [ + 4.234727857317501, + -18.683418627764468, + -1.4559767185274473 + ], + [ + 5.2798656863908295, + -17.611985704266203, + -1.1146537324532901 + ], + [ + 5.6800024497197885, + -16.988405864158494, + -2.114762535024812 + ], + [ + 2.7849233522260235, + -18.27954133109597, + -1.2627063135783796 + ], + [ + 1.8501089621202627, + -18.9843543083972, + -2.2245411618747677 + ], + [ + 0.0978961843477172, + -18.483911978426136, + -2.05416342140329 + ], + [ + -0.5916291193433996, + -18.76716805660203, + -3.695389628108755 + ], + [ + 3.6781951185826145, + -20.069732982235337, + 0.10475694153958819 + ], + [ + 4.374268116951745, + -19.00875703002953, + -2.4868908213646566 + ], + [ + 2.541949404299859, + -18.286684352537122, + -0.20015625352852287 + ], + [ + 2.718591982938252, + -17.22520264444256, + -1.5311582459316042 + ], + [ + 2.263256490574264, + -18.874555329338932, + -3.2272139414983516 + ], + [ + 1.967280311758382, + -20.056445963330816, + -2.0664422585778324 + ], + [ + -1.6084560942858483, + -18.384384214639454, + -3.7828038082061672 + ], + [ + 0.009261396529277328, + -18.316030681884513, + -4.4850135432095435 + ], + [ + -0.5220252147215525, + -19.82282888905104, + -3.9577504522974034 + ], + [ + 5.746641681247285, + -17.511972477265317, + 0.1416014680122555 + ], + [ + 6.869575783310455, + -16.605128754106886, + 0.547097028946725 + ], + [ + 8.269114762758033, + -17.20210958080611, + 0.12138440133424476 + ], + [ + 9.022336638867795, + -16.449572915891167, + -0.49371532516658634 + ], + [ + 6.9403316397067645, + -16.382205919314288, + 2.0514022974761166 + ], + [ + 5.789564044343775, + -15.448766304697301, + 2.4220809832044705 + ], + [ + 5.410622924247283, + -15.339429374228757, + 3.9189361818706336 + ], + [ + 6.5338040686605705, + -14.671822235225136, + 4.67316915805126 + ], + [ + 6.00576523669254, + -14.33292988733649, + 6.041903430487182 + ], + [ + 5.158262641166103, + -17.96326751045433, + 0.8273448035103067 + ], + [ + 6.769335358359928, + -15.597257170220132, + 0.1442946311849954 + ], + [ + 6.796948354695121, + -17.315010217120403, + 2.596766021796116 + ], + [ + 7.811787236107218, + -15.801958744242938, + 2.3546746941759413 + ], + [ + 5.936024397003937, + -14.459645152093572, + 1.9881556493038408 + ], + [ + 4.848561918138742, + -15.738509794828929, + 1.954467376404078 + ], + [ + 4.509141494234477, + -14.72876504098383, + 3.969127003128997 + ], + [ + 5.243185019059655, + -16.325732967020144, + 4.351684931684977 + ], + [ + 7.423115358197853, + -15.293630368747245, + 4.776020225846105 + ], + [ + 6.875616545809532, + -13.815427661969807, + 4.09191627248323 + ], + [ + 6.318297335821332, + -13.478322630416415, + 6.4801580277989075 + ], + [ + 5.01152329995643, + -14.256652845657754, + 5.88138373200737 + ], + [ + 6.0459065418042295, + -15.040126473409714, + 6.7618770160529325 + ], + [ + 8.515787929608205, + -18.4996388012014, + 0.415846654964261 + ], + [ + 9.774177318362494, + -19.22334894143239, + 0.07164124931223807 + ], + [ + 9.886433277191049, + -19.291892913133097, + -1.43740923932292 + ], + [ + 10.971348339775464, + -19.269521019930608, + -2.0247617281544965 + ], + [ + 9.716264471224523, + -20.608309930608357, + 0.6635925923775093 + ], + [ + 9.839410562953445, + -20.558374341468834, + 2.1786456178385722 + ], + [ + 10.15672408651446, + -21.798044463800807, + 2.929551884719762 + ], + [ + 9.417986525319668, + -22.924261364680774, + 2.4497812374899963 + ], + [ + 8.232308993769202, + -23.29125438389451, + 2.8969922426735906 + ], + [ + 7.749174731999155, + -22.997019968787754, + 4.026982418545471 + ], + [ + 7.540752645936417, + -23.947905039616785, + 2.1282051068145305 + ], + [ + 7.784949633390069, + -18.979014213040955, + 0.9219873281657583 + ], + [ + 10.63589555262897, + -18.63912128019956, + 0.3944674552638233 + ], + [ + 8.782906845694471, + -21.110327284319396, + 0.40878493105222125 + ], + [ + 10.609606581651278, + -21.14117995450829, + 0.33788500377642544 + ], + [ + 10.615283750742487, + -19.858263020763047, + 2.4884325473727618 + ], + [ + 8.98523409354442, + -20.007638959091196, + 2.5725670294422995 + ], + [ + 11.202034897468062, + -22.102846679422555, + 2.979734270657014 + ], + [ + 9.806884606047074, + -21.59741391248747, + 3.94220259510674 + ], + [ + 9.661685186646547, + -23.324720126175293, + 1.555162394185346 + ], + [ + 8.401204092516162, + -22.615280419076953, + 4.697229511271659 + ], + [ + 6.840769278084317, + -23.324133199588346, + 4.3234607891710635 + ], + [ + 7.8489562410089295, + -24.146604664898064, + 1.1871264661746024 + ], + [ + 6.668878695216087, + -24.35557550545093, + 2.4343790851176865 + ], + [ + 8.813896736363539, + -19.185548371673008, + -2.2580871997248675 + ], + [ + 8.903401476921921, + -19.146127509899657, + -3.7053334371137385 + ], + [ + 9.087097682115033, + -17.699606351017678, + -4.381514692617005 + ], + [ + 9.871733436676962, + -17.447259138129425, + -5.267486664842551 + ], + [ + 7.6842816418717605, + -19.833084494572972, + -4.359304205747094 + ], + [ + 7.761294691171004, + -19.938046012213817, + -5.849067491895778 + ], + [ + 6.81702511321405, + -21.010515423089032, + -6.431752431464703 + ], + [ + 7.3255283988957896, + -22.083259565558137, + -6.817185223279619 + ], + [ + 5.637709282835813, + -20.68478989903258, + -6.531554109046179 + ], + [ + 7.9268797400642175, + -19.229755182689928, + -1.7771008210160522 + ], + [ + 9.760303407464695, + -19.681555971767693, + -4.1141582579867615 + ], + [ + 7.6382532481167384, + -20.82710398661777, + -3.914442685415572 + ], + [ + 6.715857422006736, + -19.378422438383836, + -4.150646318217513 + ], + [ + 7.416676617775152, + -19.01968229381157, + -6.32440546706684 + ], + [ + 8.775653707849546, + -20.214027947051477, + -6.137185258876545 + ], + [ + 8.45920401165631, + -16.692499644863915, + -3.8665096535269687 + ], + [ + 8.347521618372209, + -15.395374716984634, + -4.4952060311444875 + ], + [ + 9.264164286581238, + -14.398075616537767, + -3.755717639625429 + ], + [ + 9.936068731595544, + -13.62893173896714, + -4.416322698168738 + ], + [ + 6.8728778981518435, + -14.913721842670725, + -4.58976907064907 + ], + [ + 5.967085958017256, + -15.922239670193107, + -5.3453089677200865 + ], + [ + 6.776812269921867, + -13.49757257368833, + -5.222980183995289 + ], + [ + 6.276635495230769, + -16.008051146959815, + -6.830148559586083 + ], + [ + 7.772424995725859, + -16.925576621805703, + -3.1635803425569167 + ], + [ + 8.74625550716573, + -15.456775667244187, + -5.507796457096593 + ], + [ + 6.447743230602262, + -14.73088484498669, + -3.6028882967731017 + ], + [ + 5.9355980484076865, + -16.94730383234753, + -4.976047415454687 + ], + [ + 4.9509275203720975, + -15.552541481364528, + -5.208023922971635 + ], + [ + 5.74074399101012, + -13.183132898630902, + -5.348645271301088 + ], + [ + 7.3115499495073895, + -12.823906510356949, + -4.553405488868929 + ], + [ + 7.282235674014467, + -13.537405532852517, + -6.18789492792018 + ], + [ + 7.2471451113776935, + -15.58491766311954, + -7.089318074478195 + ], + [ + 6.272116940923676, + -17.04084369616737, + -7.178594028919973 + ], + [ + 5.4871341196402845, + -15.438365528503596, + -7.320300932977528 + ], + [ + 9.32208426103185, + -14.37640147914476, + -2.4625240306753917 + ], + [ + 9.880071067023689, + -13.24276682522975, + -1.7016496870483644 + ], + [ + 11.130941221478507, + -13.729494429155807, + -0.8883620562267689 + ], + [ + 11.623593445324612, + -12.927343735944191, + -0.11960478387467081 + ], + [ + 8.774217047783264, + -12.755566245889213, + -0.6738243770404906 + ], + [ + 8.870019437812134, + -11.338266538357402, + -0.1609328012759146 + ], + [ + 7.326402619972469, + -12.740068105946364, + -1.1909837594523605 + ], + [ + 8.673147986796906, + -14.948720462367419, + -1.9415312167816936 + ], + [ + 10.274615235322583, + -12.460597392061288, + -2.3502225438829356 + ], + [ + 8.88285549115665, + -13.407263928046632, + 0.1931179229150262 + ], + [ + 9.840393260594723, + -11.066894162592234, + 0.25480019231688966 + ], + [ + 8.601264760972883, + -10.595320503629182, + -0.9118687070915191 + ], + [ + 8.364453967134999, + -11.06183504272974, + 0.7643178511280052 + ], + [ + 7.29447049402856, + -12.189502869839941, + -2.1311745159034508 + ], + [ + 6.994853173135638, + -13.731024184621788, + -1.5011136223830144 + ], + [ + 6.666874276197905, + -12.33338417629028, + -0.42434967467139717 + ], + [ + 11.554927876078954, + -15.02677077160672, + -0.9365579005947721 + ], + [ + 12.804085633592434, + -15.415423879438777, + -0.43523195006580156 + ], + [ + 13.01425609135218, + -15.520672616473234, + 1.0517046509584804 + ], + [ + 14.103333506358812, + -15.666216361261604, + 1.606305161228875 + ], + [ + 10.885290730894894, + -15.579924104205588, + -1.4520296343254904 + ], + [ + 13.005510011960343, + -16.35961861156659, + -0.9412202452796025 + ], + [ + 13.636772070686229, + -14.77449536356687, + -0.7249592119349836 + ], + [ + 11.903048744277367, + -15.507777402285, + 1.8294565729839276 + ], + [ + 11.837161556691257, + -15.570344400843624, + 3.294374217690462 + ], + [ + 11.205208739022348, + -16.790942531049723, + 4.004299468980581 + ], + [ + 10.112815070970798, + -17.152284820889122, + 3.5300850941648205 + ], + [ + 11.206963868644026, + -14.317671357050813, + 3.9177487623809713 + ], + [ + 12.290057197621284, + -13.29099782970718, + 4.2465173149114115 + ], + [ + 10.083256966158057, + -13.664008407412098, + 3.1914499608381925 + ], + [ + 11.006030585243067, + -15.603212289712701, + 1.3751994380579118 + ], + [ + 12.816899691873397, + -15.611335603432053, + 3.7703302728346273 + ], + [ + 10.821262589638149, + -14.651015999912829, + 4.8811880057988155 + ], + [ + 11.767458329346702, + -12.500959521738707, + 4.785801763497297 + ], + [ + 13.01915975313795, + -13.652174656200259, + 4.971820804255677 + ], + [ + 12.72342518385978, + -12.894143359407508, + 3.3284778527680268 + ], + [ + 9.576493414121783, + -12.949508019476298, + 3.8401246107729956 + ], + [ + 10.507157630415941, + -13.150380521909256, + 2.3285521297749336 + ], + [ + 9.390671945361836, + -14.447002815849714, + 2.882665567457752 + ], + [ + 11.861795439744148, + -17.386629309502723, + 5.044310744253088 + ], + [ + 11.51342260696097, + -18.66556731806145, + 5.738590723864323 + ], + [ + 11.026110406640505, + -18.516292843106044, + 7.230522220237554 + ], + [ + 11.390778285941257, + -17.619550188947983, + 7.9886658520898 + ], + [ + 12.793744489257477, + -19.585209474960266, + 5.723515982614999 + ], + [ + 13.796569422376608, + -19.33745621139485, + 6.886278764961493 + ], + [ + 12.464236058762706, + -21.12684239945213, + 5.920831104892256 + ], + [ + 12.631372448086672, + -16.85971440509536, + 5.431885942200153 + ], + [ + 10.706244829078374, + -19.131868003591762, + 5.17367550056753 + ], + [ + 13.237493753194466, + -19.369709076127606, + 4.7515339160696595 + ], + [ + 14.636612834000163, + -20.01468832203443, + 6.732077845898938 + ], + [ + 14.133808619547489, + -18.301274785537657, + 6.85977881342918 + ], + [ + 13.510962541146414, + -19.671815487984304, + 7.883641111994035 + ], + [ + 11.765526521171228, + -21.492355614398775, + 5.168297608445899 + ], + [ + 13.307658199759594, + -21.791636661568305, + 5.734317222869419 + ], + [ + 12.147301965408019, + -21.387740633200224, + 6.930576274238949 + ], + [ + 10.14756332503579, + -19.415264569514534, + 7.650700856166355 + ], + [ + 9.549528070162186, + -19.553211049146853, + 9.041722362815829 + ], + [ + 10.546768676938894, + -20.121320082888133, + 10.093238007486583 + ], + [ + 11.363574646679949, + -20.956678957511258, + 9.735035619600835 + ], + [ + 8.255663300778274, + -20.378139489051932, + 9.101435211265816 + ], + [ + 8.440087918355726, + -21.81332796968593, + 8.581344944079314 + ], + [ + 8.163153017136056, + -21.930341775033753, + 7.1090521057404965 + ], + [ + 7.048770673933866, + -22.2744368524817, + 6.796018932878863 + ], + [ + 9.05755654610951, + -21.87472267604562, + 6.265984704968238 + ], + [ + 9.80603064042651, + -20.10976262424515, + 7.001755998646562 + ], + [ + 9.318516185397916, + -18.524022791134144, + 9.316507775453196 + ], + [ + 7.7943561765287, + -20.409488549279786, + 10.088508386249774 + ], + [ + 7.466284470582789, + -19.9258110904359, + 8.50112015677368 + ], + [ + 9.447214941555252, + -22.136134470557295, + 8.845141097937866 + ], + [ + 7.835651143276657, + -22.456284192037742, + 9.221161319813733 + ], + [ + 10.424842448394388, + -19.6579836888169, + 11.365274930800263 + ], + [ + 11.335085222966882, + -20.034512704093572, + 12.430846369974509 + ], + [ + 10.971938555664064, + -21.486161665736518, + 12.890921966670497 + ], + [ + 11.812214561741051, + -22.28503431152103, + 13.22643792389943 + ], + [ + 11.14719137331072, + -19.06002100886451, + 13.581743811647339 + ], + [ + 9.857641805248583, + -18.37537426713982, + 13.350538470130068 + ], + [ + 9.44009507673909, + -18.718827783877032, + 11.883046426341322 + ], + [ + 12.374651616762185, + -19.951409518891637, + 12.113835720075809 + ], + [ + 11.180302814184635, + -19.588648302808792, + 14.534400610721656 + ], + [ + 12.00826726208098, + -18.418864590647672, + 13.393148311651702 + ], + [ + 9.126922924078562, + -18.860885871567916, + 13.997400305008151 + ], + [ + 9.93555466953016, + -17.32685801710693, + 13.638015375374318 + ], + [ + 8.471520294858578, + -19.218744065284795, + 11.8901200485863 + ], + [ + 9.355248214709409, + -17.820901910695284, + 11.270975619111859 + ], + [ + 9.67292096504779, + -21.743233949844694, + 12.93145509112546 + ], + [ + 8.918422246870637, + -22.96537588429146, + 13.375150604097682 + ], + [ + 7.5695471005082675, + -23.019067179197464, + 12.565743780068056 + ], + [ + 6.934906113662352, + -21.984148582087187, + 12.383185398918632 + ], + [ + 8.665687130627418, + -22.951122621883428, + 14.928918558394058 + ], + [ + 8.03696944190208, + -24.28202860898648, + 15.35504451690066 + ], + [ + 9.967949990640502, + -22.72642183660537, + 15.7666734628432 + ], + [ + 9.093193535026586, + -20.95363193437902, + 12.685406403048228 + ], + [ + 9.59988310166474, + -23.799485978942357, + 13.207896826164617 + ], + [ + 8.03085806027783, + -22.101369997105394, + 15.179931128292381 + ], + [ + 7.0601378409695785, + -24.22599429065758, + 14.874670121332647 + ], + [ + 8.515687751491964, + -25.185506870119752, + 14.977346349941834 + ], + [ + 7.961874065707832, + -24.380518324421246, + 16.437984955430665 + ], + [ + 10.61799700737081, + -23.595302648608026, + 15.663819270971024 + ], + [ + 10.470345033499578, + -21.84171429942967, + 15.375527417359402 + ], + [ + 9.703196137346165, + -22.575662874457976, + 16.813226011352633 + ], + [ + 7.027921658560553, + -24.218206586555766, + 12.122698575661833 + ], + [ + 5.837095231263248, + -24.32262488490869, + 11.214830129055633 + ], + [ + 4.479329122583626, + -23.857643223224045, + 11.836911472221512 + ], + [ + 4.153118157757213, + -24.154926222438007, + 12.948089187052211 + ], + [ + 5.805392331912057, + -25.805448077583378, + 10.800689488192416 + ], + [ + 7.207433932894291, + -26.249067796868076, + 10.856002594193404 + ], + [ + 7.699422746810615, + -25.50560039650145, + 12.149680835345825 + ], + [ + 6.093180935248858, + -23.740562295952714, + 10.329548896943566 + ], + [ + 5.295844102753904, + -26.444842155064407, + 11.521549338358657 + ], + [ + 5.38338745153382, + -26.05131100046583, + 9.826234505068467 + ], + [ + 7.394888375382288, + -27.32004647665144, + 10.933268552132722 + ], + [ + 7.745626060074588, + -25.70781065447966, + 10.077872136563395 + ], + [ + 7.487229312667693, + -26.025161547847347, + 13.084092969352195 + ], + [ + 8.78145858497469, + -25.402473024444816, + 12.068039451393753 + ], + [ + 3.7734323720040805, + -22.97803383028497, + 11.14830921234156 + ], + [ + 2.726146692515678, + -22.142331541169483, + 11.689428998181633 + ], + [ + 1.3191926864092804, + -22.766986893028275, + 11.585850593164496 + ], + [ + 0.9111853610632921, + -23.010673816809117, + 10.464154304270458 + ], + [ + 2.6096299589862735, + -20.83490417851931, + 10.903703611985888 + ], + [ + 3.7357537113801946, + -19.836813663765042, + 11.199254616623511 + ], + [ + 5.08332077511012, + -19.973703363345862, + 10.928386382851745 + ], + [ + 3.5551363238572664, + -18.562082482737765, + 11.703544702058773 + ], + [ + 4.768939484360093, + -17.9570407813178, + 11.794690731265115 + ], + [ + 5.716426764590729, + -18.77371634658141, + 11.272372111925081 + ], + [ + 4.041794770552861, + -22.617234759733492, + 10.243927119201865 + ], + [ + 2.9627590703366447, + -21.979475023041118, + 12.740900936849954 + ], + [ + 2.578820623375363, + -21.066999302207932, + 9.839145233726667 + ], + [ + 1.691074790281483, + -20.36141520327385, + 11.25035480539395 + ], + [ + 2.668492166679193, + -18.092717603350593, + 11.820430525699297 + ], + [ + 5.536628744172985, + -20.75062714014348, + 10.33064069256523 + ], + [ + 4.804629534936524, + -16.883767468335463, + 11.909620586559953 + ], + [ + 0.5872580306628997, + -23.00109099149722, + 12.678428525769428 + ], + [ + -0.8356100809235918, + -23.43382759332394, + 12.779045931192936 + ], + [ + -1.9001460094960176, + -22.435159517832517, + 12.294359304913165 + ], + [ + -1.643333718780042, + -21.22902694262973, + 12.394901638479931 + ], + [ + -1.06863102060855, + -23.927615487017988, + 14.205124593699344 + ], + [ + -2.4816349831199105, + -24.45050307601491, + 14.372429975099282 + ], + [ + -2.811762963037036, + -25.49565854694754, + 13.716150891534296 + ], + [ + -3.310928740581615, + -23.774110769906656, + 15.07164061993363 + ], + [ + 0.9022938201933556, + -22.582240822961694, + 13.541806868940277 + ], + [ + -0.9586637194674168, + -24.317949764887658, + 12.153513355428707 + ], + [ + -0.34922074645711526, + -24.708755457196844, + 14.450829860808595 + ], + [ + -0.9718285898211753, + -23.055647066533993, + 14.851962918443505 + ], + [ + -3.0735749535613595, + -22.89720498560746, + 11.90172187997107 + ], + [ + -4.191253968488023, + -22.079418006168567, + 11.472821387230239 + ], + [ + -5.047365671908648, + -21.326049341597127, + 12.563928843682014 + ], + [ + -5.995018401135912, + -20.69944121005676, + 12.162290779634523 + ], + [ + -5.2043668538587, + -22.90335834892062, + 10.581338518517857 + ], + [ + -4.552785016759796, + -23.662752376858066, + 9.448147186205611 + ], + [ + -3.7249099164206014, + -22.734824564843507, + 8.524811685790343 + ], + [ + -2.793808610704996, + -23.153334440836602, + 7.806080252805053 + ], + [ + -4.1406421264222955, + -21.556522612296817, + 8.411789260095773 + ], + [ + -3.2670028974996437, + -23.87423014320518, + 11.734057610111753 + ], + [ + -3.769825911534637, + -21.26168253890353, + 10.888181574441013 + ], + [ + -5.714781809680363, + -23.60481991297138, + 11.241284445364656 + ], + [ + -6.019672708861298, + -22.303725425755374, + 10.176594890170987 + ], + [ + -3.9541861795620052, + -24.456775073425433, + 9.894582912869938 + ], + [ + -5.3065918865888655, + -24.172221825053384, + 8.847885245348916 + ], + [ + -4.745437981143409, + -21.46568323516692, + 13.851370256270053 + ], + [ + -5.177826946449654, + -20.529855328853046, + 14.912310284045642 + ], + [ + -4.59697851465839, + -19.087623729175675, + 14.782332493179474 + ], + [ + -5.259265139771977, + -18.169993669007113, + 15.15530091339891 + ], + [ + -4.895255696282895, + -21.188905203096965, + 16.27608261549921 + ], + [ + -3.478919511350687, + -21.045824676803818, + 16.794121748089687 + ], + [ + -5.729862217820545, + -20.700841404600624, + 17.347852724737837 + ], + [ + -3.9524673361794167, + -22.06865664475788, + 14.017870081662357 + ], + [ + -6.241057739823304, + -20.359910423407314, + 14.742726002863655 + ], + [ + -5.150196390346526, + -22.231708284756905, + 16.08721718922542 + ], + [ + -6.316175284293905, + -21.459976310693833, + 17.387231498998524 + ], + [ + -3.389901472862415, + -20.104065065621853, + 17.335658259940168 + ], + [ + -3.287238745094747, + -21.905531638935486, + 17.436194487811502 + ], + [ + -2.7958645690224078, + -21.10972630895776, + 15.947094558536993 + ], + [ + -3.431429734703442, + -18.993245621799474, + 14.197239996742724 + ], + [ + -2.794596923356501, + -17.715596978562075, + 13.7818816455199 + ], + [ + -3.1393316363983192, + -17.369867560325474, + 12.388098025796653 + ], + [ + -3.1905311566532415, + -18.275359479163967, + 11.536259980283306 + ], + [ + -1.2690507347651407, + -17.57208562317851, + 13.852005250928656 + ], + [ + -0.6809496653461625, + -18.15397806586327, + 15.128114772578895 + ], + [ + -0.6010693650081235, + -17.3999678405811, + 16.281025869889717 + ], + [ + -0.2968709615953549, + -19.560973777649224, + 15.189039670187162 + ], + [ + -0.12308415339892269, + -17.970819507336387, + 17.50149444323302 + ], + [ + 0.13752849868929215, + -20.11822466953197, + 16.379930891198896 + ], + [ + 0.34208187813186336, + -19.31694343937602, + 17.47461137088875 + ], + [ + 0.9023138043017157, + -19.7873916353891, + 18.657110781192525 + ], + [ + -3.0659176294886863, + -19.801206263831887, + 13.713812313233326 + ], + [ + -3.2429642084964208, + -16.97888547784521, + 14.44846008941747 + ], + [ + -0.7698452443989996, + -18.07452600110514, + 13.023484227282372 + ], + [ + -1.124454290267667, + -16.496959432912377, + 13.958276373249605 + ], + [ + -0.9583730993128337, + -16.38081040769532, + 16.273420770928293 + ], + [ + -0.43316303183476407, + -20.146715584598383, + 14.29197080382246 + ], + [ + -0.018753157357190995, + -17.3582242480594, + 18.384806437451914 + ], + [ + 0.32772546382855283, + -21.18116745019404, + 16.399475896888188 + ], + [ + 1.055431732940621, + -19.03340014180651, + 19.231259187423486 + ], + [ + -3.417564595873291, + -16.062051514908944, + 12.084353325709378 + ], + [ + -3.394539095146672, + -15.389945646055367, + 10.77682993271368 + ], + [ + -2.1833650400673403, + -14.3433259806053, + 10.832779859703155 + ], + [ + -2.343509841692118, + -13.187600408981552, + 11.029166857055142 + ], + [ + -4.827251918729369, + -14.73769381778527, + 10.6460194842502 + ], + [ + -4.731836215615045, + -13.911577475931608, + 8.957737604413097 + ], + [ + -3.5018561251690747, + -15.374595018246737, + 12.819473386083953 + ], + [ + -3.198473762379335, + -16.023895042857475, + 9.912094308871863 + ], + [ + -5.542687658837338, + -15.559912405150612, + 10.631513411110795 + ], + [ + -5.085519576674328, + -13.979300374800573, + 11.385096620665763 + ], + [ + -6.005041181046458, + -13.54499187118381, + 8.786098300272133 + ], + [ + -0.9198200559117805, + -14.905094334037585, + 10.674608577257471 + ], + [ + 0.26932012772575986, + -14.148552207361718, + 10.457730532969471 + ], + [ + 0.026782527024972823, + -12.821020267646134, + 9.658153840049003 + ], + [ + 0.3171833153503982, + -11.72652159757331, + 10.185074147332866 + ], + [ + 1.4252644448253904, + -14.97823537701106, + 9.85475710911719 + ], + [ + 1.7694366053185628, + -16.40168220395617, + 10.332843202812015 + ], + [ + 2.41084303088648, + -17.146534189117006, + 9.552954358589586 + ], + [ + 1.398167225603568, + -16.772249855840414, + 11.487111636732394 + ], + [ + -0.8223745570863167, + -15.907009237456805, + 10.75689072916328 + ], + [ + 0.6007659186474521, + -13.837868238070769, + 11.448547656804603 + ], + [ + 1.1590949016186622, + -15.050266566784217, + 8.800211608064101 + ], + [ + 2.3152836422458614, + -14.383791134630428, + 10.061153056576856 + ], + [ + -0.5642537765911355, + -12.795832375606267, + 8.404946967552082 + ], + [ + -0.8604974114320086, + -11.489671744140423, + 7.732927688664202 + ], + [ + -1.8940862271126124, + -10.540243843441488, + 8.359090165530764 + ], + [ + -1.9500921485729337, + -9.335911852861159, + 7.989076609564269 + ], + [ + -1.2423664842531192, + -11.99050431785281, + 6.300620806400239 + ], + [ + -1.827863016717362, + -13.36609789626209, + 6.431059082171501 + ], + [ + -1.0875880614133957, + -13.914777474610446, + 7.681978362215914 + ], + [ + -0.018343407753087557, + -10.813288023394477, + 7.586704072901059 + ], + [ + -1.8647074492483904, + -11.312269280798034, + 5.716850508389028 + ], + [ + -0.2799546523960225, + -12.118845338036238, + 5.805249267145516 + ], + [ + -2.902637408006032, + -13.289866122857347, + 6.595828618767507 + ], + [ + -1.625717694392268, + -13.89498431205061, + 5.499652261485367 + ], + [ + -1.808919917370626, + -14.4625173460297, + 8.288410947802836 + ], + [ + -0.23915629471758182, + -14.495077722830615, + 7.319330305097655 + ], + [ + -2.838640732769518, + -10.953505721601289, + 9.239550349177957 + ], + [ + -3.68750054459264, + -10.096194075553854, + 9.954219322040565 + ], + [ + -2.8903487315580323, + -9.39455143840712, + 11.082559863846418 + ], + [ + -3.4414601833288674, + -8.473354550442878, + 11.672038628685524 + ], + [ + -5.037025014871989, + -10.701802410886216, + 10.299580435646925 + ], + [ + -2.9387877389379904, + -11.939436241375972, + 9.434515389328746 + ], + [ + -4.057115668941566, + -9.335414682334715, + 9.266690222944137 + ], + [ + -5.332893330359132, + -11.366251697535063, + 9.487750959139866 + ], + [ + -4.90100355476651, + -11.401809926756812, + 11.12395085165453 + ], + [ + -5.765185162984058, + -9.926962535667258, + 10.539393798010972 + ], + [ + -1.5397897658943647, + -9.541109816922926, + 11.173598993143337 + ], + [ + -0.6732028804671906, + -8.562751586704849, + 11.888704958720556 + ], + [ + -0.5603296651616739, + -7.185933423435301, + 11.251727205369312 + ], + [ + -0.23078431379313014, + -6.211736362230937, + 11.869013137428592 + ], + [ + 0.6790269984671805, + -9.184975720055206, + 12.079308555434814 + ], + [ + 1.3115871883919266, + -9.344732141902512, + 10.822043883114706 + ], + [ + -1.032590895553034, + -10.27430756299293, + 10.698968174589497 + ], + [ + -1.1010670045405697, + -8.456260313598023, + 12.885545146575282 + ], + [ + 1.3550786196493094, + -8.51051433997901, + 12.604813840415725 + ], + [ + 0.49139514546056956, + -10.10588929106325, + 12.631405936925725 + ], + [ + 1.0405120482825616, + -10.206302908142732, + 10.496748457170716 + ], + [ + -0.9418624984104824, + -6.985133506338229, + 9.968765011250163 + ], + [ + -0.9419987934631988, + -5.660765662877282, + 9.2486778360296 + ], + [ + -2.3232944752005964, + -4.907078559412923, + 9.35448621002275 + ], + [ + -3.3758768223124638, + -5.5373440552969555, + 9.245374913996306 + ], + [ + -0.8166397404550007, + -6.079235734008762, + 7.749415248320286 + ], + [ + 0.6383958375193373, + -6.50790638629465, + 7.309356068067576 + ], + [ + 0.6032187086225981, + -6.869659602793661, + 5.8377605954248315 + ], + [ + 1.6258466587353542, + -5.339995063604391, + 7.253929655273785 + ], + [ + -1.2924356567897395, + -7.816091212046729, + 9.514113153044656 + ], + [ + -0.13099676387013826, + -4.995739986222503, + 9.54552291724658 + ], + [ + -1.5315526041267105, + -6.8829552070604905, + 7.573249924019414 + ], + [ + -1.133102644913512, + -5.29107254721734, + 7.066223314644566 + ], + [ + 0.9587584047257437, + -7.3731754924713755, + 7.889681315705812 + ], + [ + -0.026008066386338576, + -7.741420413607273, + 5.658294588788585 + ], + [ + 0.16928739840815082, + -6.041298969183657, + 5.277743248418802 + ], + [ + 1.6295502083037916, + -7.147506122227355, + 5.59787539345463 + ], + [ + 2.6263646197617603, + -5.7723273729151, + 7.266260552175886 + ], + [ + 1.5058731884905097, + -4.5934466889000305, + 6.468835317875657 + ], + [ + 1.5518718167718788, + -4.767308080533667, + 8.178406129840694 + ], + [ + -2.277112155578684, + -3.578095303223364, + 9.455458596029409 + ], + [ + -3.2720661640249307, + -2.548095143106835, + 9.136915116256322 + ], + [ + -4.060115574117436, + -2.8215904448247926, + 7.828204678586275 + ], + [ + -5.306006579678933, + -2.7189502920791995, + 7.934559416356717 + ], + [ + -2.5918616731827546, + -1.1391149443353257, + 9.078015537057476 + ], + [ + -3.6918849077348423, + -0.09332108342236367, + 9.15901140842671 + ], + [ + -4.338963690218871, + 0.24111063216157191, + 10.410680758983078 + ], + [ + -4.113488680924665, + 0.5002785739411131, + 7.995282710637758 + ], + [ + -5.429737161766505, + 1.1448372834361962, + 10.394391993396384 + ], + [ + -5.141183940671183, + 1.4842543140350486, + 8.06551487867446 + ], + [ + -5.899672622999914, + 1.7474556687834877, + 9.24662114439598 + ], + [ + -1.3531489522075482, + -3.248094073615121, + 9.695230539784786 + ], + [ + -3.987925190177749, + -2.4867476562398423, + 9.956601050350091 + ], + [ + -2.020018800264977, + -0.96771325900324, + 9.989999518288345 + ], + [ + -1.9334416598263784, + -1.039919473094379, + 8.215028933407318 + ], + [ + -4.053512061836047, + -0.27437722818311094, + 11.315773078285662 + ], + [ + -3.5089492105499556, + 0.3327265455562305, + 7.116158761811563 + ], + [ + -6.074812018433239, + 1.1586560094382676, + 11.260467760979502 + ], + [ + -5.459457011742168, + 1.9046971648398454, + 7.123002873093242 + ], + [ + -6.732817696398224, + 2.4298548016800368, + 9.327859751591193 + ], + [ + -3.45056731464118, + -3.1306256343086574, + 6.700855277233149 + ], + [ + -4.156218126753012, + -3.3756922648369425, + 5.410753607523613 + ], + [ + -5.0894316938496225, + -4.652471445018676, + 5.538636968400321 + ], + [ + -6.169097207635986, + -4.542254124669711, + 4.9854458245344695 + ], + [ + -3.210174985387793, + -3.6373768397237995, + 4.185376522547028 + ], + [ + -2.0034065702249855, + -2.813294838493647, + 4.328507301511515 + ], + [ + -0.8289097628639575, + -3.13085373177546, + 4.8642436282335115 + ], + [ + -1.8904954927461923, + -1.5494648236973845, + 3.9304188203225174 + ], + [ + -0.6141021485705719, + -1.135051336256943, + 4.140700805938712 + ], + [ + 0.01702433260746559, + -2.0958685981072875, + 4.850975649054725 + ], + [ + -2.4461925178201698, + -3.0243759220777093, + 6.694448987428675 + ], + [ + -4.775290328743955, + -2.4837570233282236, + 5.31431851345968 + ], + [ + -2.893590256864104, + -4.680347335948767, + 4.1946335260862515 + ], + [ + -3.6992985011390895, + -3.4999505549986623, + 3.2210257165531235 + ], + [ + -2.5892296837430235, + -1.0136331424836271, + 3.4356920073075425 + ], + [ + -0.5458882972692695, + -4.061326323227178, + 5.333837999241569 + ], + [ + -0.22923255195280853, + -0.15817725176757946, + 3.887735777684239 + ], + [ + -4.60358088866871, + -5.698084671859874, + 6.126030701574489 + ], + [ + -5.3802493514466, + -6.951270495928782, + 6.183574181178828 + ], + [ + -6.5350254588127585, + -6.967627952590021, + 7.137823984737405 + ], + [ + -7.594942639428344, + -7.501682756488606, + 6.800848583780859 + ], + [ + -4.472992660942943, + -8.136295567650961, + 6.44159476972006 + ], + [ + -5.170118121765557, + -9.527305334817413, + 6.57273861172895 + ], + [ + -3.442266835831416, + -8.225808116060364, + 5.201956606233139 + ], + [ + -3.620989289352546, + -5.764208742120644, + 6.350173007998651 + ], + [ + -5.84536446965269, + -7.041843726827096, + 5.201960952204294 + ], + [ + -3.903586467909671, + -7.991865578500324, + 7.359754749686568 + ], + [ + -4.469664884577059, + -10.361306161220739, + 6.6164240629450175 + ], + [ + -5.735612133689345, + -9.507528562494713, + 7.504363616802848 + ], + [ + -5.862047575431356, + -9.749290804143357, + 5.76029996271336 + ], + [ + -2.7706268532086225, + -9.08406181049935, + 5.181953110453878 + ], + [ + -3.852487540419504, + -8.280055898541491, + 4.193554311160749 + ], + [ + -2.71660866019015, + -7.413250402755182, + 5.237632231583475 + ], + [ + -6.428429261034187, + -6.293507645543741, + 8.304343664119909 + ], + [ + -7.447845833046334, + -6.06459886200301, + 9.334227371033844 + ], + [ + -8.550517833360132, + -5.199373072881571, + 8.895658196628432 + ], + [ + -9.690468943013569, + -5.589564131298175, + 8.946127706090719 + ], + [ + -6.7485650050379276, + -5.349137303732334, + 10.60032864012518 + ], + [ + -5.80357775627106, + -4.443157580217189, + 10.180688537348882 + ], + [ + -5.481134066789616, + -5.970213339995723, + 8.439296138229578 + ], + [ + -7.983513053650246, + -6.99752296463771, + 9.5097637529994 + ], + [ + -7.545198470743247, + -4.8390766362689135, + 11.141911258320352 + ], + [ + -6.234771598604232, + -6.11186752541434, + 11.185445287482118 + ], + [ + -5.048295687631495, + -4.9597868303345365, + 9.890442402846588 + ], + [ + -8.214633575015572, + -3.9968763986166778, + 8.351683329580682 + ], + [ + -9.200850611173378, + -2.970662578400322, + 7.993509036685015 + ], + [ + -9.912303956813663, + -3.224487839458831, + 6.62656017982716 + ], + [ + -10.560363856953757, + -2.2954650035061235, + 6.21425906947721 + ], + [ + -8.516831486908828, + -1.5729535944875366, + 8.194002911693664 + ], + [ + -8.201352225527373, + -1.2682715739381152, + 9.657992914304055 + ], + [ + -7.121121620316408, + -1.6233588419697398, + 10.26326482783438 + ], + [ + -9.070250249338038, + -0.7241056034823536, + 10.331002601857021 + ], + [ + -7.226729218144003, + -3.7883047774111844, + 8.326334604819767 + ], + [ + -9.974224737560759, + -2.8824372489716694, + 8.756535483315487 + ], + [ + -7.594203184148081, + -1.582931834270326, + 7.6136948187054685 + ], + [ + -9.107905642706937, + -0.799852255136166, + 7.703037252780192 + ], + [ + -6.413750557699481, + -2.121271124204881, + 9.741912448560084 + ], + [ + -7.105797533566695, + -1.563959744542231, + 11.271400993711495 + ], + [ + -9.566744597432038, + -4.3823509711756685, + 5.945911130495496 + ], + [ + -9.973844494610411, + -4.8102563554848246, + 4.550540426019014 + ], + [ + -9.508155793714879, + -3.7181943673328135, + 3.5633844728051347 + ], + [ + -10.31145385802067, + -2.9963903726563075, + 3.012417094085497 + ], + [ + -11.460051077569412, + -5.114277303136447, + 4.63127334898949 + ], + [ + -12.078899580425546, + -5.407421767473693, + 3.3214616369443184 + ], + [ + -11.754468806908099, + -6.443141925228645, + 2.6985038764517246 + ], + [ + -13.055196598488088, + -4.675134850295933, + 2.9303470773798934 + ], + [ + -9.004190243413108, + -5.0405364555325605, + 6.465933944367547 + ], + [ + -9.419810702301085, + -5.73518319312862, + 4.390365288849523 + ], + [ + -11.574623458110338, + -5.908487316699649, + 5.36897532804597 + ], + [ + -11.888207844349875, + -4.246678441824031, + 5.133321122503726 + ], + [ + -8.247009780648064, + -3.680609602362381, + 3.2531484465598997 + ], + [ + -7.6877460813388305, + -2.7561965206040355, + 2.263350741577017 + ], + [ + -6.931224187844938, + -3.5441995123396453, + 1.13608720835891 + ], + [ + -6.680305957275685, + -4.73975218947146, + 1.3566680366292514 + ], + [ + -6.971790953371336, + -1.5821777858011572, + 2.9614822731696973 + ], + [ + -7.788404156239409, + -0.5675393266594178, + 3.7731426123357483 + ], + [ + -8.68011506484019, + 0.19067144566899064, + 2.998134743021624 + ], + [ + -7.4424062717322474, + -0.28377688283892333, + 5.072258926499296 + ], + [ + -9.30407274487138, + 1.3030451205570017, + 3.5901647211472256 + ], + [ + -8.102502864790749, + 0.8434114566643629, + 5.709729081918377 + ], + [ + -8.970977886264496, + 1.677369258695208, + 4.936661695281295 + ], + [ + -9.668004020867672, + 2.749137791811009, + 5.457131707920216 + ], + [ + -7.549602033726208, + -4.142290582482929, + 3.8193374707899346 + ], + [ + -8.487718472705218, + -2.24335009819319, + 1.7293732184898867 + ], + [ + -6.218317673872856, + -1.9742994775670155, + 3.6445760241306213 + ], + [ + -6.447625747049751, + -1.0432962521880356, + 2.172206064760777 + ], + [ + -8.82797996584753, + 0.011137842962568367, + 1.9434766561769863 + ], + [ + -6.720804966509961, + -0.8423274571119066, + 5.649935949163129 + ], + [ + -9.941122292396704, + 2.024153310642731, + 3.099684139486557 + ], + [ + -7.788471412996205, + 1.2183816433163273, + 6.67263128840045 + ], + [ + -9.415774679501856, + 2.986396815806671, + 6.352502633931316 + ], + [ + -6.617138121082371, + -2.915503576783209, + -0.02585567629850859 + ], + [ + -5.862934675089782, + -3.578547985963297, + -1.1733557857907404 + ], + [ + -4.34560612975167, + -3.5925319801898183, + -0.8702830010219337 + ], + [ + -3.8287638667093997, + -2.795717284775165, + -0.10844942175738424 + ], + [ + -6.168161530099279, + -2.860684477464787, + -2.5071693019254315 + ], + [ + -5.0919630107966, + -2.055832907319484, + -3.058197644454242 + ], + [ + -6.814374406354636, + -1.9350665181551108, + -0.16706998759695657 + ], + [ + -6.161307546009026, + -4.625785407255876, + -1.222013950785487 + ], + [ + -6.408698739563044, + -3.616743482388898, + -3.254575779054354 + ], + [ + -7.092654848953569, + -2.30428353645064, + -2.352793739815514 + ], + [ + -5.471539115482355, + -1.177969562440019, + -2.975260724866939 + ], + [ + -3.6088836334573404, + -4.503189165188445, + -1.491544395459521 + ], + [ + -2.1412645333240863, + -4.486530830602646, + -1.5783633513242752 + ], + [ + -1.6748001606380947, + -4.220380306340104, + -2.9814865113668363 + ], + [ + -0.6597806325320822, + -3.5206311318262635, + -3.0496461679372597 + ], + [ + -1.4790674494026312, + -5.665711221811051, + -0.8258062735757883 + ], + [ + -0.20049140115717326, + -5.2202230154929055, + 0.02367512808709895 + ], + [ + 1.0695054164234599, + -5.226214817897159, + -0.5535525653725621 + ], + [ + -0.3619320108744676, + -4.984009649602115, + 1.4011925332263613 + ], + [ + 2.200167857576968, + -4.976318335704406, + 0.26754420601220485 + ], + [ + 0.7854727617160816, + -4.692865964926625, + 2.1801949779921146 + ], + [ + 2.084148566731461, + -4.689258161538106, + 1.6277132955083748 + ], + [ + -4.133514785562916, + -5.111518279885303, + -2.1037507273250142 + ], + [ + -1.8359917523628584, + -3.577730035081487, + -1.059720399009615 + ], + [ + -2.3141541024363965, + -6.017771174019373, + -0.22017878879850927 + ], + [ + -1.1518930834768208, + -6.486657224335943, + -1.4638535007611353 + ], + [ + 1.1702436208777474, + -5.254599196422191, + -1.6284692954732263 + ], + [ + -1.3938956416369488, + -4.877490669189655, + 1.7013671814550502 + ], + [ + 3.129773318580961, + -4.859036823150035, + -0.26955632531663987 + ], + [ + 0.6449301600197711, + -4.354116836491045, + 3.196018549931897 + ], + [ + 2.8803573783003293, + -4.286102815791054, + 2.2359214797804867 + ], + [ + -2.426141482666433, + -4.5688262112600455, + -4.06607489355557 + ], + [ + -2.149237226744301, + -4.303942808425575, + -5.503156080017268 + ], + [ + -1.6621678803649786, + -2.8328538548086897, + -5.638685475509659 + ], + [ + -0.8146312264711723, + -2.5602687966173647, + -6.499576486114571 + ], + [ + -3.396218341855982, + -4.682656408166167, + -6.385764815290768 + ], + [ + -3.131022373708284, + -4.4187607122409815, + -7.870790566768806 + ], + [ + -4.677069381258595, + -3.94059700721823, + -5.9648014533446565 + ], + [ + -1.9294561711867435, + -5.272530506092181, + -8.485966132866071 + ], + [ + -3.2052689190704493, + -5.188722150449678, + -3.8964011463568036 + ], + [ + -1.2388966802767285, + -4.890250859043391, + -5.628147652332839 + ], + [ + -3.571282775317973, + -5.737336558093233, + -6.173385532147355 + ], + [ + -4.0167035568507705, + -4.579928255456906, + -8.485358072155222 + ], + [ + -2.8534764215231228, + -3.3648544156529567, + -7.889491105052568 + ], + [ + -4.540024055671938, + -2.864448573471705, + -6.070739023612933 + ], + [ + -5.452384934918874, + -4.320466508920617, + -6.630147079372578 + ], + [ + -4.948277057972643, + -4.155070284523731, + -4.931095712552619 + ], + [ + -0.9605032304559277, + -4.940366740791404, + -8.113276392390137 + ], + [ + -1.9845895345755598, + -6.295913107965248, + -8.114820873101241 + ], + [ + -1.9378007528793257, + -5.275551773137494, + -9.57593017016792 + ], + [ + -2.2303019635853425, + -1.8542884051639703, + -4.902720919254211 + ], + [ + -1.769424599815069, + -0.47031761070114086, + -4.758954815348437 + ], + [ + -0.30338066523609797, + -0.19056403107919184, + -4.69070243203373 + ], + [ + 0.12470805751683295, + 0.8176049795140337, + -5.213312620511393 + ], + [ + -2.659483203969258, + 0.1230430589561271, + -3.666965399563236 + ], + [ + -2.3925203410634226, + -0.49016248055670175, + -2.210323449237201 + ], + [ + -3.3218862384963797, + 0.0029853583330037153, + -1.105643593568406 + ], + [ + -3.149848565650519, + 1.4571261301133305, + -0.7095559745224823 + ], + [ + -4.048626025948955, + 2.454148840430406, + -0.7954323823860916 + ], + [ + -5.086562376483116, + 2.4352376287259574, + -1.5722254788950285 + ], + [ + -3.940346732554171, + 3.4678826657992943, + 0.030139212476972703 + ], + [ + -2.994411874909389, + -2.0808563116223837, + -4.282316058921994 + ], + [ + -2.0136313600005806, + -0.049892305620807376, + -5.734508761744135 + ], + [ + -2.5952585320223527, + 1.2094951103998852, + -3.6069916209633743 + ], + [ + -3.684807836541922, + -0.10582541972319603, + -3.9575299077040835 + ], + [ + -2.5562745337889607, + -1.564758378358846, + -2.2911208251635338 + ], + [ + -1.3829606791869322, + -0.24016499840564798, + -1.884148614569607 + ], + [ + -4.3580992535868175, + -0.268675206147023, + -1.3070507703189416 + ], + [ + -3.178338158664425, + -0.5471849448190937, + -0.17569402071208856 + ], + [ + -2.359401493546168, + 1.6714785294199572, + -0.11849965271307915 + ], + [ + -5.317817240150227, + 1.5710222782117356, + -2.041003871615404 + ], + [ + -5.726791633258651, + 3.199339362036838, + -1.7345726367946732 + ], + [ + -3.118889911824874, + 3.611634801571256, + 0.5999143649250993 + ], + [ + -4.541057567548198, + 4.244265174527698, + -0.2075089501344476 + ], + [ + 0.43330707063085727, + -1.0436810325169787, + -4.068572342335743 + ], + [ + 1.8581311920066992, + -0.7513047629845246, + -3.8202255931009894 + ], + [ + 2.870228176394179, + -1.2333256371464998, + -4.934840180478082 + ], + [ + 3.921440768704451, + -0.6127351616582501, + -5.097399796196133 + ], + [ + 2.2829411962457677, + -1.1921921907143584, + -2.462395713972034 + ], + [ + 1.4850212950303006, + -0.7216441410839671, + -1.3002591062950424 + ], + [ + 1.4806986611347674, + 0.5909059999390038, + -0.926932293222226 + ], + [ + 0.6945821797532769, + -1.6564346331920063, + -0.5637772861686993 + ], + [ + 0.6399858486084009, + 1.0899217939136676, + 0.08822357698341175 + ], + [ + -0.16947699956172096, + -1.1788934644975981, + 0.41927456876289365 + ], + [ + -0.21482736464200297, + 0.18956756807596076, + 0.7449176935549204 + ], + [ + -1.1252689499971174, + 0.6453921725656109, + 1.6257238375791616 + ], + [ + -0.021994837972309715, + -1.8643120107816884, + -3.6952569284960552 + ], + [ + 1.983521497532116, + 0.33124022909670536, + -3.7984617524480093 + ], + [ + 2.438301408616479, + -2.270252135866812, + -2.4205627153010854 + ], + [ + 3.2356851553121215, + -0.6911920073150739, + -2.290997409256923 + ], + [ + 2.126735997281929, + 1.3282014028538214, + -1.3801779226586939 + ], + [ + 0.7185000528620467, + -2.6909733280201067, + -0.872902382659298 + ], + [ + 0.6347593827361475, + 2.1202303441467762, + 0.4120088314233927 + ], + [ + -0.8004830429199866, + -1.8382624605609834, + 0.996737850168206 + ], + [ + -1.2498536533478908, + 1.597211633252769, + 1.6366129676555499 + ], + [ + 2.460628605566968, + -2.0935105503003513, + -5.816090883089111 + ], + [ + 3.2262302612763794, + -2.3660844865450485, + -6.976476376778906 + ], + [ + 2.7659012236202583, + -1.6113962127623296, + -8.221127583091961 + ], + [ + 3.6167919728417566, + -1.3275724275037462, + -9.030699200888495 + ], + [ + 3.0438936741573195, + -3.930215352967849, + -7.236029754253886 + ], + [ + 4.037977616646586, + -4.727948096783962, + -8.118865691028988 + ], + [ + 3.75926876474823, + -6.134658150151267, + -8.397291258502802 + ], + [ + 5.08763098554577, + -4.047188572966576, + -8.773093008756403 + ], + [ + 4.56567043238448, + -6.788324221739913, + -9.350915066584712 + ], + [ + 5.826096293125301, + -4.729183218225245, + -9.69615448378509 + ], + [ + 5.6105226289620225, + -6.060249985749721, + -10.004980825261544 + ], + [ + 6.443151016199362, + -6.696986113108608, + -10.94178903241634 + ], + [ + 1.5811601275987541, + -2.5833286895358043, + -5.7341517351141205 + ], + [ + 4.297349816205529, + -2.32840352649238, + -6.778024994984316 + ], + [ + 2.8063388878900155, + -4.492936681616442, + -6.333249604192657 + ], + [ + 2.103716125510613, + -4.121054298567685, + -7.75347261313359 + ], + [ + 2.9202607559819884, + -6.599333080255235, + -7.900760674808955 + ], + [ + 5.284880385069606, + -2.9873618885789597, + -8.707828700406306 + ], + [ + 4.366877614247844, + -7.787011809418402, + -9.710780621763417 + ], + [ + 6.598125980665228, + -4.166283157943127, + -10.199654822064783 + ], + [ + 6.000248625622345, + -7.501129390863412, + -11.222484276651585 + ], + [ + 1.4968164473731693, + -1.1886958019139868, + -8.254134361736316 + ], + [ + 0.9293969108198638, + -0.3475738808897244, + -9.267279711507205 + ], + [ + 1.364702183221378, + 1.0942205238461966, + -9.147514769833696 + ], + [ + 1.7977446911162842, + 1.6905948142104705, + -10.127944458827947 + ], + [ + -0.5895488381650664, + -0.5348893401394008, + -9.552038153504146 + ], + [ + -0.9333088406291584, + -1.8529709422932683, + -10.340839316171223 + ], + [ + -1.225571269282813, + -0.3920871064142837, + -8.311824009837432 + ], + [ + 0.8751235569586585, + -1.5018564531092338, + -7.5223367693464285 + ], + [ + 1.3354496422055029, + -0.6254775466412887, + -10.23989980335446 + ], + [ + -0.8593046421555497, + 0.2824076395017947, + -10.220886291538957 + ], + [ + -1.2691627991946293, + -1.2112742316165708, + -7.813195495062776 + ], + [ + -0.44506865483677227, + -1.8148899824057452, + -11.314631717622065 + ], + [ + -0.7231190563777246, + -2.7291941902888937, + -9.727525198809474 + ], + [ + -2.007631227250202, + -1.8410355325868153, + -10.524657340182534 + ], + [ + 1.3340880130943706, + 1.5766842270936365, + -7.8480249846329775 + ], + [ + 1.9393878589763591, + 2.892400171687612, + -7.570560988036046 + ], + [ + 3.3549552619798213, + 3.058770639584708, + -8.063892365701445 + ], + [ + 3.6462245297028377, + 4.057966324614398, + -8.588746059075163 + ], + [ + 1.9183330048342409, + 3.3370031100785695, + -6.05201568228213 + ], + [ + 3.0550088595122338, + 2.92259606165986, + -5.1146252715993725 + ], + [ + 2.8371250176291665, + 3.312014632590518, + -3.6904252817315344 + ], + [ + 4.043613306020755, + 3.232296031357066, + -2.7324953850149587 + ], + [ + 5.079790115750359, + 2.347538933226218, + -2.6527028392112886 + ], + [ + 5.902064493384815, + 2.5407349510236372, + -1.688591476767132 + ], + [ + 5.264615478998187, + 1.3713295801697285, + -3.4831461690762313 + ], + [ + 1.0448716941094034, + 0.9221883021890704, + -7.135219774258506 + ], + [ + 1.378551838804622, + 3.64206874022571, + -8.128735985352376 + ], + [ + 2.014035322374018, + 4.422763052051977, + -6.043853395832003 + ], + [ + 0.8955653406686751, + 3.189553805101326, + -5.705166213356129 + ], + [ + 3.1350547607850348, + 1.8541922100817345, + -5.315141048050263 + ], + [ + 3.9938552684051514, + 3.3565164678758777, + -5.458688409066073 + ], + [ + 2.523360970810858, + 4.355738689479978, + -3.707509013902941 + ], + [ + 1.9838926319336152, + 2.7487692065973306, + -3.3124702539078603 + ], + [ + 4.0638114847382365, + 3.9852420619566544, + -2.0596180380799956 + ], + [ + 5.790296285974547, + 3.314707314405638, + -1.0493915744932747 + ], + [ + 6.741291116140777, + 1.9789630853976803, + -1.7031134341189953 + ], + [ + 4.743172972328451, + 1.2421462188706585, + -4.338430860691482 + ], + [ + 6.176505866816167, + 0.9395721974509215, + -3.5294279270530367 + ], + [ + 4.272313392894591, + 2.123196196580821, + -7.83034475401136 + ], + [ + 5.7175221609531, + 2.138049653863007, + -8.251930594994898 + ], + [ + 5.764712770065769, + 2.211566891803116, + -9.854300280174893 + ], + [ + 6.340763201852699, + 3.0339770888454467, + -10.510618509358217 + ], + [ + 6.467641358336498, + 0.9135660618464385, + -7.721528451779954 + ], + [ + 7.86744800738422, + 0.8146971270560428, + -8.379001798174725 + ], + [ + 6.522593915547913, + 0.9859725685378109, + -6.39152744548007 + ], + [ + 3.985793771672331, + 1.2574462125538517, + -7.3961977609362 + ], + [ + 6.159492247811489, + 3.093463503310076, + -7.969181894764311 + ], + [ + 5.839636220435902, + 0.03627413441398297, + -7.876674468268661 + ], + [ + 6.770451697723584, + 1.8696052768889757, + -6.109818342953794 + ], + [ + 8.609441814395383, + 1.2516394832439204, + -7.710698515869521 + ], + [ + 8.219419841923015, + -0.2107089861767122, + -8.266046498299897 + ], + [ + 7.951074879964423, + 1.0759306777388673, + -9.433925085026962 + ], + [ + 5.036144552729712, + 1.3210699911639736, + -10.46363693344026 + ], + [ + 5.057396847053277, + 1.183120096898918, + -11.97626069407622 + ], + [ + 4.48467425222423, + 2.5020688206460022, + -12.642405232155951 + ], + [ + 4.9261788222414875, + 2.875449739661434, + -13.723591162857103 + ], + [ + 4.275454631921472, + -0.09081208445823741, + -12.331728164768638 + ], + [ + 5.089118006905445, + -1.4307118971163604, + -12.039535481913948 + ], + [ + 4.052967889116291, + -2.6038402908234133, + -12.231326135428237 + ], + [ + 6.252029153864395, + -1.6602049730987858, + -13.002268393530501 + ], + [ + 4.646475699259226, + 0.54197245916626, + -9.95249406899375 + ], + [ + 6.074586678668398, + 1.0814869681278054, + -12.354541163284198 + ], + [ + 3.3255494625920816, + -0.08372819713901247, + -11.797190978393756 + ], + [ + 4.0426586315388615, + -0.10492407863191211, + -13.396484007060199 + ], + [ + 5.489885063592709, + -1.465641346109905, + -11.02648694054609 + ], + [ + 4.629592110956768, + -3.5265620562068705, + -12.166608878726525 + ], + [ + 3.3057666274875714, + -2.4827094140046455, + -11.447032187965615 + ], + [ + 3.6723128164474184, + -2.467211274061796, + -13.24351926783967 + ], + [ + 6.870520539736406, + -0.7847819198947406, + -13.20026954781589 + ], + [ + 6.971486073631456, + -2.2704568187091354, + -12.456305696882731 + ], + [ + 5.999902076912818, + -2.169710128596435, + -13.93228709821906 + ], + [ + 3.4344510247066204, + 3.182354978805165, + -12.169765411121148 + ], + [ + 2.974973257491644, + 4.550047682427646, + -12.678946118647227 + ], + [ + 4.024549720983307, + 5.593605105239561, + -12.3417342518025 + ], + [ + 4.581829442311744, + 6.237214595614347, + -13.24755793031365 + ], + [ + 1.6150553410178707, + 5.0654215184291616, + -12.142551376359487 + ], + [ + 0.5550656626307358, + 4.017658829060764, + -12.372305725954881 + ], + [ + 0.3891874390834387, + 3.362924660352121, + -13.600356695262633 + ], + [ + -0.20710173045014446, + 3.70035944786693, + -11.23701717187916 + ], + [ + -0.5939394926795099, + 2.343372105678256, + -13.63313239906886 + ], + [ + -1.3709577961228363, + 2.8583512101354245, + -11.355402206054874 + ], + [ + -1.5196310460997082, + 2.1365427276558933, + -12.562473669649316 + ], + [ + -2.5296593449230294, + 1.2800847397925992, + -12.677653247826223 + ], + [ + 2.963725198917058, + 2.8029342574052976, + -11.360719073839293 + ], + [ + 2.9061081200942276, + 4.485113465334166, + -13.76483054252556 + ], + [ + 1.6794841766254567, + 5.275240358631919, + -11.074878073052863 + ], + [ + 1.3483884596637712, + 5.921363018700816, + -12.762514463230639 + ], + [ + 1.0069225402066908, + 3.4912754366290812, + -14.476900365982333 + ], + [ + -0.033595069061301865, + 4.329044456598609, + -10.376173074550191 + ], + [ + -0.7384530005859785, + 1.7846111656384664, + -14.54598584510254 + ], + [ + -2.110280506019681, + 2.7357764314737665, + -10.577726001649255 + ], + [ + -2.477130742881889, + 0.7719592910423927, + -13.490456014286183 + ], + [ + 4.410062528164202, + 5.716320371648095, + -11.066142215297221 + ], + [ + 5.523803665468845, + 6.529707352903586, + -10.650337593156413 + ], + [ + 6.795012506718205, + 6.526644329777952, + -11.551390935113524 + ], + [ + 7.254408139144546, + 7.5908464269932665, + -11.905419343351646 + ], + [ + 5.8277559446343545, + 6.338809870742551, + -9.154925922815952 + ], + [ + 7.090068733919696, + 7.0726792262913705, + -8.705832732071368 + ], + [ + 8.180604157622643, + 6.157859311304065, + -8.425006319109707 + ], + [ + 9.370832704154385, + 6.624590435681057, + -8.799040188332375 + ], + [ + 8.177181803586231, + 5.050875182971396, + -7.995338545527332 + ], + [ + 4.059100381144913, + 5.060081032829174, + -10.383298355631261 + ], + [ + 5.078165530457971, + 7.524384795896253, + -10.639138402267236 + ], + [ + 4.973262619552955, + 6.5948936674539596, + -8.5285370821009 + ], + [ + 5.878131420479538, + 5.252565246042423, + -9.079856249993584 + ], + [ + 7.3809134334698605, + 7.846468565358691, + -9.416294924308604 + ], + [ + 6.776428240384477, + 7.571501264248468, + -7.788826289495981 + ], + [ + 9.449211526557809, + 7.57913443182872, + -9.119666052327728 + ], + [ + 10.152411356461297, + 5.986654699061347, + -8.846742028575402 + ], + [ + 7.391145813312518, + 5.343813598613224, + -11.831734988846316 + ], + [ + 8.632017882066577, + 5.400784501921294, + -12.548693188595475 + ], + [ + 8.451371669896263, + 5.968350706618395, + -13.973417690462485 + ], + [ + 9.39634371545212, + 6.658497933877015, + -14.485675111419138 + ], + [ + 9.261235289753605, + 3.990252791595225, + -12.595228159620785 + ], + [ + 10.383203224168133, + 3.8923683442032484, + -11.5587634615715 + ], + [ + 11.701490257295436, + 4.320941435553806, + -11.92871928762703 + ], + [ + 10.044790896812424, + 3.6177764575721767, + -10.222309742646555 + ], + [ + 12.716212953789567, + 4.407238765778459, + -10.933906087939496 + ], + [ + 11.063405106429945, + 3.6704976065372534, + -9.27251818161026 + ], + [ + 12.38842774300847, + 4.145747361543556, + -9.58816144705833 + ], + [ + 7.097563169285185, + 4.495691802430173, + -11.368489081417582 + ], + [ + 9.37457361858632, + 6.122223813821535, + -12.20776149090794 + ], + [ + 8.494633516845957, + 3.2361654931741413, + -12.41697333747592 + ], + [ + 9.540210407304087, + 3.815189839482059, + -13.63427866200632 + ], + [ + 11.895728591878308, + 4.642110863930327, + -12.94139947742354 + ], + [ + 9.054829966665643, + 3.2603059710123006, + -9.980243051981583 + ], + [ + 13.690628911638964, + 4.8058438695017, + -11.1747958045992 + ], + [ + 10.997229163554191, + 3.275750062196977, + -8.26942394145716 + ], + [ + 13.06917047852016, + 4.249390245582475, + -8.75614543460995 + ], + [ + 7.303063092514143, + 5.681004093545965, + -14.554938558351028 + ], + [ + 6.985176737243446, + 6.310027053357629, + -15.842614918365642 + ], + [ + 6.812828595018615, + 7.844109932186143, + -15.803081725918108 + ], + [ + 7.252805719071239, + 8.64082843251856, + -16.653580550787233 + ], + [ + 5.7445435386613, + 5.709965252320671, + -16.519834460746168 + ], + [ + 5.878841744356991, + 4.189380124016992, + -16.771919369243722 + ], + [ + 4.566726814519237, + 3.6511774193918995, + -17.38579610808726 + ], + [ + 3.633382843204364, + 3.206324139640884, + -16.530523815589056 + ], + [ + 4.423146383128692, + 3.689122379335572, + -18.62269081231348 + ], + [ + 6.756792935324376, + 4.935292401422998, + -14.147997011351352 + ], + [ + 7.840360006251031, + 6.146773267100599, + -16.49844609247634 + ], + [ + 4.857286136753211, + 5.870586844542487, + -15.907398389153382 + ], + [ + 5.614486183475881, + 6.27988384629046, + -17.43982161233926 + ], + [ + 6.70131204885321, + 4.058015885569546, + -17.475044962816682 + ], + [ + 6.135796602619807, + 3.692402377981381, + -15.836458281554956 + ], + [ + 3.8166955528054167, + 3.1427946048942914, + -15.539331254442281 + ], + [ + 2.716649379976975, + 3.048101375696973, + -16.923797362330536 + ], + [ + 6.208975535721004, + 8.378081223924084, + -14.744675135450535 + ], + [ + 6.178458369108564, + 9.782637912326777, + -14.419172890875297 + ], + [ + 7.560568195960235, + 10.332986953400507, + -14.098970180716488 + ], + [ + 7.9101414268315136, + 11.501461007565752, + -14.423510991130243 + ], + [ + 5.131460533659257, + 10.098062562587302, + -13.337685695647544 + ], + [ + 3.6688180315052437, + 9.88712021065328, + -13.578906205828519 + ], + [ + 3.0184765072989315, + 9.079812836643839, + -12.643093065060956 + ], + [ + 3.0006996015920926, + 10.835602160523251, + -14.403041682706313 + ], + [ + 1.6136807954007586, + 9.069268450753327, + -12.618106476925133 + ], + [ + 1.57903765289099, + 10.823255629035316, + -14.334895696939256 + ], + [ + 0.9079120458051547, + 9.93514516643529, + -13.379171535561463 + ], + [ + 5.730839983678828, + 7.643872746564057, + -14.242259680130108 + ], + [ + 5.857713486282284, + 10.30768979311307, + -15.318918869797113 + ], + [ + 5.434116461494205, + 9.398831631761936, + -12.5582159513467 + ], + [ + 5.214661592913877, + 11.11963248228193, + -12.966774677562011 + ], + [ + 3.5661832513421676, + 8.50573073219789, + -11.910396390801903 + ], + [ + 3.4657850178360343, + 11.501526568514294, + -15.114829145590454 + ], + [ + 1.043167908525565, + 8.429348324708997, + -11.961282500072006 + ], + [ + 1.0726536176068693, + 11.47532092079706, + -15.031159220723543 + ], + [ + -0.16094689621118605, + 10.004819284010864, + -13.241020524532939 + ], + [ + 8.499270693340412, + 9.595645599285149, + -13.489222148577957 + ], + [ + 9.844254292097824, + 10.1396352283503, + -13.083083081754399 + ], + [ + 10.63749960118533, + 10.430334035160683, + -14.453573880382859 + ], + [ + 11.32479680182729, + 11.444584543243081, + -14.498486326461101 + ], + [ + 10.57076568245909, + 9.072651083503104, + -12.22481064073329 + ], + [ + 11.371588715948597, + 9.741731002386473, + -11.103037899830992 + ], + [ + 10.540780044680526, + 10.253914205558942, + -9.87527253914422 + ], + [ + 10.888246747419819, + 11.321939520707986, + -9.13234685896367 + ], + [ + 9.588815611687146, + 9.564833514445354, + -9.579544199263324 + ], + [ + 8.180850600625957, + 8.688276608050899, + -13.18037071031531 + ], + [ + 9.68146716658723, + 11.076988207205261, + -12.551135627916302 + ], + [ + 9.884779679539081, + 8.339850605561764, + -11.799921778527425 + ], + [ + 11.256465341891259, + 8.541598034462766, + -12.885036716373369 + ], + [ + 12.002692514467068, + 8.959218154725647, + -10.681747140318937 + ], + [ + 11.991283229883635, + 10.529621408802711, + -11.53117983337488 + ], + [ + 11.669621601424353, + 11.890254603144683, + -9.426576650142353 + ], + [ + 10.245116450385161, + 11.665978403057181, + -8.433690353851832 + ], + [ + 10.422840627676726, + 9.638023728130236, + -15.564841280004249 + ], + [ + 11.081465900370045, + 9.854719053298822, + -16.808896219275187 + ], + [ + 10.492177470510093, + 11.017528329315041, + -17.66801159696441 + ], + [ + 11.24433320377784, + 11.729543645106105, + -18.341489626813424 + ], + [ + 10.991695109160768, + 8.54929364104163, + -17.5920092008242 + ], + [ + 11.906410833983617, + 8.484199424014207, + -18.755727001408353 + ], + [ + 11.622593679177616, + 7.24085476661395, + -19.60378121866979 + ], + [ + 10.627447169996824, + 7.15093246227616, + -20.31380936590018 + ], + [ + 12.398502115477761, + 6.264437608765206, + -19.449840980778625 + ], + [ + 9.929501580044036, + 8.767021551149753, + -15.430419422206297 + ], + [ + 12.129441257376124, + 10.05606687260871, + -16.58685070702273 + ], + [ + 11.133919502340921, + 7.732642270889983, + -16.884231902583753 + ], + [ + 9.972352711977514, + 8.40046950736371, + -17.948229880740318 + ], + [ + 11.654717599184233, + 9.41696157549626, + -19.260405847205675 + ], + [ + 12.928685536368786, + 8.45116919374874, + -18.378943590453584 + ], + [ + 9.202279834502471, + 11.311809573670757, + -17.400101420152474 + ], + [ + 8.362429956497504, + 12.35033792538826, + -17.983662553759643 + ], + [ + 8.681929430437478, + 13.69431473636314, + -17.38263106973836 + ], + [ + 8.961906606632327, + 14.67535472157158, + -18.04388353477911 + ], + [ + 6.893996646704319, + 11.884576556708453, + -17.895642212870722 + ], + [ + 8.72545432055512, + 10.711972943272542, + -16.74212388864731 + ], + [ + 8.6384532463192, + 12.494084207504102, + -19.02828887252775 + ], + [ + 6.503049275881946, + 12.149949325194541, + -16.913376856825494 + ], + [ + 6.296367199375497, + 12.355205825817507, + -18.676312324033674 + ], + [ + 6.940444317570275, + 10.82115143478211, + -18.130311339823606 + ], + [ + 8.722943258067804, + 13.814782979309143, + -16.000848232650323 + ], + [ + 8.846761255870335, + 15.10513639778901, + -15.304409947853253 + ], + [ + 10.242723169551493, + 15.721877606573798, + -15.339580362774175 + ], + [ + 10.369450049265039, + 16.945166857620052, + -15.282732835499443 + ], + [ + 8.318791932671953, + 14.842903530445597, + -13.827623010828496 + ], + [ + 6.8468276938082635, + 14.426137263488727, + -13.76645144132981 + ], + [ + 6.571941609016926, + 13.821872927601476, + -12.397521626618452 + ], + [ + 5.901768476092823, + 15.693730105999748, + -13.841543717108289 + ], + [ + 8.444886067999695, + 13.007000288422773, + -15.462079236893004 + ], + [ + 8.205700786568169, + 15.781257094253306, + -15.870099471930873 + ], + [ + 8.930335156852154, + 14.021293723316717, + -13.454704521464226 + ], + [ + 8.471347511075024, + 15.716164438200849, + -13.193397366297395 + ], + [ + 6.668485584769921, + 13.615079647125185, + -14.472480374880963 + ], + [ + 6.833894233689973, + 14.453203008411833, + -11.548462113771635 + ], + [ + 5.506067334239498, + 13.598430288145437, + -12.351841979363954 + ], + [ + 7.161394703045654, + 12.906621012792527, + -12.343115390937228 + ], + [ + 4.8517845369715715, + 15.460309714565597, + -13.665056709483657 + ], + [ + 6.227817849617551, + 16.3935776219364, + -13.072123591812185 + ], + [ + 5.9531491002371855, + 16.191350193233575, + -14.809961682745005 + ], + [ + 11.216870730861206, + 14.913106818534402, + -15.458974662172906 + ], + [ + 12.633930022352166, + 15.256112335456578, + -15.710073172023804 + ], + [ + 12.903531423570236, + 15.897838509535745, + -17.1285920408389 + ], + [ + 13.456703402150362, + 17.033212089562085, + -17.214762615656294 + ], + [ + 13.509731510021286, + 14.022199088796583, + -15.370611052619264 + ], + [ + 13.30662839084772, + 13.80385147162724, + -13.579893334494399 + ], + [ + 10.950339012012845, + 13.938914830498675, + -15.455924462856979 + ], + [ + 12.864277575164452, + 16.042924888659286, + -14.991764049634186 + ], + [ + 13.184116877794889, + 13.192937382387868, + -15.998620889197207 + ], + [ + 14.534756623138565, + 14.348870563681999, + -15.545855527156677 + ], + [ + 12.231461493542826, + 15.415679879333084, + -18.17908443472491 + ], + [ + 12.268968552463784, + 16.045431814453536, + -19.517241179708535 + ], + [ + 11.428470071931677, + 17.31481509524974, + -19.539183823542725 + ], + [ + 11.777689760822536, + 18.233623691517096, + -20.24034105290253 + ], + [ + 11.806517297980355, + 15.160871008924573, + -20.621504469796943 + ], + [ + 12.604999800267278, + 13.833102581501748, + -20.92647056465422 + ], + [ + 11.803066938812448, + 12.829774995738944, + -21.755786826276278 + ], + [ + 11.040386346772891, + 11.919984151846052, + -21.196800057126087 + ], + [ + 11.87140173959622, + 12.833372262546447, + -22.988534027781455 + ], + [ + 11.69855641242522, + 14.558450184471326, + -18.143466047202274 + ], + [ + 13.29747464126626, + 16.352068175659497, + -19.70763179361052 + ], + [ + 10.819071877201797, + 14.827087732097311, + -20.302695568058937 + ], + [ + 11.679601405542632, + 15.722444240486197, + -21.54704713106402 + ], + [ + 13.547574220959268, + 14.090352816755967, + -21.40966573467983 + ], + [ + 12.773494589405146, + 13.443225669296908, + -19.922623164551055 + ], + [ + 11.0021736875233, + 11.815337170660712, + -20.192963587280005 + ], + [ + 10.547216647419802, + 11.28083124499716, + -21.80373517168355 + ], + [ + 10.359099195691634, + 17.32370172572712, + -18.792624085414626 + ], + [ + 9.538564024853361, + 18.58165710880246, + -18.52251924044152 + ], + [ + 10.31621591816486, + 19.61887033911171, + -17.722516528112415 + ], + [ + 10.198404365925274, + 20.79353209803935, + -17.971969739611417 + ], + [ + 8.198997770822332, + 18.287881620335497, + -17.967355300691732 + ], + [ + 10.15835085058583, + 16.531396101621567, + -18.199283408926686 + ], + [ + 9.233323934697648, + 18.860554944875275, + -19.531054237537067 + ], + [ + 7.816337300840338, + 17.559936555023683, + -18.682734468986876 + ], + [ + 8.240817887935542, + 17.800209626555443, + -16.99343178086123 + ], + [ + 7.583307031654064, + 19.169165939412323, + -17.78744670365204 + ], + [ + 11.059020712185967, + 19.254260928669964, + -16.72660983386603 + ], + [ + 12.03742804765395, + 20.12132476581303, + -16.04828668239382 + ], + [ + 13.272887424507132, + 20.32675999806952, + -16.913318193115582 + ], + [ + 14.18817441349348, + 20.95935134665183, + -16.414653881289887 + ], + [ + 12.424908911156468, + 19.48727546661314, + -14.667109485755857 + ], + [ + 11.055889470322276, + 18.275204942642404, + -16.478530283600097 + ], + [ + 11.630958677237011, + 21.11232689324993, + -15.846296547436456 + ], + [ + 11.604021831051776, + 19.5453531011716, + -13.952356186532223 + ], + [ + 12.830109990946873, + 18.475971298777722, + -14.70142281094918 + ], + [ + 13.15568943503495, + 20.182099765111502, + -14.253246694549587 + ], + [ + 13.35936860663637, + 19.70286952394372, + -18.10340860510921 + ], + [ + 14.523091050209633, + 19.73992550864466, + -18.98679717092693 + ], + [ + 15.88549285483787, + 19.40017306355014, + -18.224541920579536 + ], + [ + 16.832506657654932, + 20.063741960318566, + -18.28111796762219 + ], + [ + 14.628950023882435, + 21.12503791239226, + -19.750749310935447 + ], + [ + 13.343140579913907, + 21.437796417412073, + -20.545482208578616 + ], + [ + 13.18957956743994, + 22.765831771553962, + -21.180513412369574 + ], + [ + 11.781654249076132, + 23.374935129833602, + -21.028232464713412 + ], + [ + 11.45851208086826, + 24.13944603370726, + -19.817248398611355 + ], + [ + 12.711875468551883, + 18.934584182604, + -18.20632362268492 + ], + [ + 14.333947770054161, + 18.993039573104056, + -19.757826665340488 + ], + [ + 14.89137483127967, + 21.91799914598323, + -19.05043198766663 + ], + [ + 15.366701141166434, + 21.029137854424903, + -20.547381985700973 + ], + [ + 13.233499313414898, + 20.721382274168832, + -21.359622714390568 + ], + [ + 12.463184670194808, + 21.17736179322867, + -19.95730366986059 + ], + [ + 13.948920472077946, + 23.430096863156905, + -20.767896279098228 + ], + [ + 13.400774809789969, + 22.60064003487753, + -22.237020295260642 + ], + [ + 11.801782963686444, + 24.137433936977004, + -21.806881153057407 + ], + [ + 11.043236659067516, + 22.628618950155328, + -21.32123364469782 + ], + [ + 10.702887759795628, + 24.770938455914006, + -20.04163073957052 + ], + [ + 11.068649257559429, + 23.608023033600148, + -19.051942918209686 + ], + [ + 12.274017661168584, + 24.592793748975623, + -19.430566857623795 + ], + [ + 15.965702070651634, + 18.364416222883506, + -17.413852652539486 + ], + [ + 17.08247978462226, + 17.984197062788894, + -16.48274984964153 + ], + [ + 18.301446732662306, + 17.49845287309097, + -17.16923545192551 + ], + [ + 18.186112606989752, + 16.563160381190187, + -17.93725538159678 + ], + [ + 16.626528423556294, + 17.18358549089305, + -15.308665596524932 + ], + [ + 17.817087168014968, + 16.96524099567364, + -14.412794008894334 + ], + [ + 18.611369070465294, + 15.852114430852566, + -14.451453100947479 + ], + [ + 18.40972529557698, + 17.84981897192722, + -13.619731376501784 + ], + [ + 19.569965243484553, + 17.363921806682697, + -13.26456277212655 + ], + [ + 19.829188645201455, + 16.117442711552144, + -13.787807781236205 + ], + [ + 15.139835528504404, + 17.78543343753404, + -17.4669491545758 + ], + [ + 17.36278086541825, + 18.934827694698583, + -16.029061895636467 + ], + [ + 15.772661027431873, + 17.731122435566817, + -14.909644479583315 + ], + [ + 16.314442772239047, + 16.210147453765558, + -15.686975628044973 + ], + [ + 18.046356793272672, + 18.736730605753905, + -13.301214457719826 + ], + [ + 18.45240724742733, + 15.023587943652501, + -15.125752096462799 + ], + [ + 20.29724530363406, + 17.758993643572012, + -12.57074613202784 + ], + [ + 19.476792157335524, + 18.04534513510407, + -16.827616156053907 + ], + [ + 20.7662355419193, + 17.853171946152656, + -17.46773457388203 + ], + [ + 21.40835674917546, + 16.442393992025814, + -17.474145464465405 + ], + [ + 22.27606216193403, + 16.24497436621607, + -18.347589035590715 + ], + [ + 21.66756738211434, + 18.917585165232026, + -16.86262427548904 + ], + [ + 22.236175961923173, + 18.466199595495027, + -15.490983090815844 + ], + [ + 23.027299848257197, + 19.52216013513737, + -14.719213734092229 + ], + [ + 22.68680590850964, + 19.939980060195808, + -13.584164840238696 + ], + [ + 24.18413056564008, + 19.846888196191003, + -15.0948655461994 + ], + [ + 19.42025359627188, + 18.678752873593226, + -16.042946846694292 + ], + [ + 20.67070073496133, + 18.080098681731215, + -18.529564385137174 + ], + [ + 22.483696598070175, + 19.024474486955, + -17.577191825694765 + ], + [ + 21.14776264643973, + 19.874355111680188, + -16.81262158352637 + ], + [ + 21.52204243631927, + 18.02625285030365, + -14.794878742399497 + ], + [ + 22.97814020022189, + 17.713547418432654, + -15.75762102904411 + ], + [ + 21.082031875420743, + 15.58557015065503, + -16.49650991393918 + ], + [ + 21.667155634545022, + 14.284058883123294, + -16.255988616073644 + ], + [ + 20.76662302022316, + 13.13102131038977, + -15.95906299036233 + ], + [ + 19.61208847103564, + 13.150389887759047, + -16.337348052855273 + ], + [ + 20.361429614912787, + 15.869456862716902, + -15.848249479565883 + ], + [ + 22.309898022483278, + 14.03032084154097, + -17.098960382606393 + ], + [ + 22.440134817901914, + 14.412584878840107, + -15.498305456104195 + ], + [ + 21.344304031746766, + 12.08072476840897, + -15.465147076062445 + ], + [ + 20.557116937497298, + 10.849632203511248, + -15.24004815394643 + ], + [ + 19.483228580848067, + 11.108322438170944, + -14.16299412396473 + ], + [ + 19.547940288373155, + 12.043922442139888, + -13.416269012570565 + ], + [ + 21.5859946402269, + 9.80675575602794, + -14.828322274540565 + ], + [ + 22.72818650212291, + 10.558812421141056, + -14.168710532109372 + ], + [ + 22.7671608289031, + 11.832398627031296, + -15.024337163055627 + ], + [ + 19.97815446444888, + 10.58967133522981, + -16.126233897743756 + ], + [ + 21.319125741926403, + 8.949913182957573, + -14.20968911497886 + ], + [ + 21.892179919937824, + 9.273364366489602, + -15.728233697946662 + ], + [ + 22.49118209695952, + 10.760260923336205, + -13.124035839911857 + ], + [ + 23.69115511757341, + 10.063233308674342, + -14.291994794322996 + ], + [ + 23.125950858270482, + 12.71194323950931, + -14.489759486672998 + ], + [ + 23.39101697532361, + 11.650354604629626, + -15.899418186932623 + ], + [ + 18.488555104430148, + 10.258797715737842, + -14.088983537323127 + ], + [ + 17.366619937278013, + 10.53167877380696, + -13.16883090449733 + ], + [ + 17.763277701201886, + 10.843345376838556, + -11.727261969654565 + ], + [ + 17.121712243208584, + 11.69549565916327, + -11.049564697680287 + ], + [ + 16.275437637522508, + 9.485244864377762, + -13.258875651931724 + ], + [ + 15.417024722587016, + 9.499153151318467, + -14.584953506552674 + ], + [ + 14.007508080992979, + 8.906277688777948, + -14.297829244885461 + ], + [ + 15.14439722008138, + 10.861686052193193, + -15.143550006496778 + ], + [ + 18.287181574200535, + 9.660540011517014, + -14.877422591486672 + ], + [ + 16.88197772693379, + 11.445237811266054, + -13.513258488361435 + ], + [ + 16.780661303691957, + 8.559660075786098, + -12.982942088943418 + ], + [ + 15.637000427304454, + 9.622874466092128, + -12.386203990334872 + ], + [ + 16.015707054348155, + 8.938213675592749, + -15.30260550459318 + ], + [ + 13.297965292192707, + 9.665957375134042, + -13.969901187344545 + ], + [ + 13.552830452817387, + 8.406089017238742, + -15.15292192328121 + ], + [ + 14.072722556479004, + 8.066701059798618, + -13.605760033352386 + ], + [ + 14.560127360681358, + 11.5483690857601, + -14.531018751669992 + ], + [ + 16.043397013198817, + 11.270179932321525, + -15.605105385284983 + ], + [ + 14.531931531164146, + 10.736680835510583, + -16.036497898278352 + ], + [ + 18.670455533358876, + 10.043906097141644, + -11.240358760754313 + ], + [ + 19.18090057318222, + 10.278684536795595, + -9.834312934809489 + ], + [ + 19.790768703891803, + 11.67346561947818, + -9.570950009217208 + ], + [ + 20.19503466315604, + 11.940633509174347, + -8.458276936972856 + ], + [ + 20.094180289427115, + 9.042827876303818, + -9.532885532962402 + ], + [ + 21.474836108411687, + 9.059214211001915, + -10.23372120711873 + ], + [ + 22.55933902831102, + 9.681526539437812, + -9.655724252067104 + ], + [ + 21.969118879669974, + 8.416809012812848, + -11.35185069022891 + ], + [ + 23.30218055154774, + 8.703603040747566, + -11.45296993879884 + ], + [ + 23.716777004767245, + 9.478930720643177, + -10.468106397426165 + ], + [ + 19.082902640949584, + 9.270867587032626, + -11.74275151318255 + ], + [ + 18.398216807420333, + 10.164010632920736, + -9.084406473486307 + ], + [ + 20.388739381186827, + 9.124152330532809, + -8.486596810635367 + ], + [ + 19.59494466607019, + 8.076364275321225, + -9.602271586589131 + ], + [ + 21.368586870588064, + 7.944433793205121, + -12.012397492566274 + ], + [ + 22.519037728831282, + 10.31500061936299, + -8.781945907039267 + ], + [ + 23.997281165322004, + 8.402839067361015, + -12.222886516214285 + ], + [ + 19.945256769731817, + 12.541032090560066, + -10.625491667291529 + ], + [ + 20.38014897523448, + 13.902011821344331, + -10.566740550535606 + ], + [ + 19.247243222174305, + 14.888184292238634, + -10.76924192393093 + ], + [ + 19.20959866474608, + 16.016233777727848, + -10.233591070793453 + ], + [ + 21.385014098657795, + 14.202421453413763, + -11.691864825995243 + ], + [ + 22.714071941163425, + 13.543310701146197, + -11.486627866843657 + ], + [ + 23.24193901455721, + 13.884279145738674, + -10.113154130415243 + ], + [ + 24.75963440863195, + 13.610423258803735, + -9.963975709790152 + ], + [ + 25.143300309439947, + 12.180051946912613, + -9.952473620005486 + ], + [ + 19.723515617897082, + 12.211100519459649, + -11.553972820816902 + ], + [ + 20.78378430280635, + 14.140124503524135, + -9.582624692209764 + ], + [ + 21.037107130872776, + 14.062971754889872, + -12.7153968699182 + ], + [ + 21.45309125715415, + 15.28443466522674, + -11.579101605749942 + ], + [ + 22.672946576957937, + 12.454141980092345, + -11.475688504880203 + ], + [ + 23.524286614341722, + 13.764561731750973, + -12.181393673867618 + ], + [ + 23.161845307674625, + 14.96263655418295, + -9.975911694127763 + ], + [ + 22.71840833890513, + 13.420285581207054, + -9.277258237238005 + ], + [ + 25.191773125814972, + 14.024103478254233, + -10.875141809599382 + ], + [ + 25.160155567685013, + 14.159313568772404, + -9.111682639756207 + ], + [ + 26.10744431492607, + 12.003862361118252, + -10.196359602536983 + ], + [ + 25.132685713130233, + 11.736937203029186, + -9.044929779741985 + ], + [ + 24.55885258345197, + 11.74672919898643, + -10.653009481413672 + ], + [ + 18.137658546708977, + 14.39599171495911, + -11.34789683452178 + ], + [ + 16.879303495913668, + 15.165931689762033, + -11.406973471708724 + ], + [ + 16.249134748845627, + 15.584908297269749, + -10.055102020615406 + ], + [ + 16.464747590964773, + 14.881723416857312, + -9.089780251507468 + ], + [ + 15.950752908034454, + 14.461985053566536, + -12.327947068894211 + ], + [ + 14.403734557649543, + 15.286680908201788, + -12.539932901018814 + ], + [ + 18.122087893825583, + 13.437086354758435, + -11.664691978206125 + ], + [ + 17.073857099837447, + 16.11760973587343, + -11.901500537152213 + ], + [ + 16.431085214170555, + 14.241544168968744, + -13.281250881792168 + ], + [ + 15.720157952472375, + 13.519112467234322, + -11.832047124778233 + ], + [ + 15.46647274500421, + 16.685222379575748, + -9.976961969200618 + ], + [ + 14.823260481352907, + 17.233650640954693, + -8.80898586190616 + ], + [ + 13.270085714726902, + 17.144122482795638, + -8.753198105816955 + ], + [ + 12.777762790774107, + 17.213841868645204, + -7.6488473237781385 + ], + [ + 15.238262739258325, + 18.655420980787085, + -8.697252915153783 + ], + [ + 16.72252201749422, + 18.806509308652153, + -8.908029094737314 + ], + [ + 17.198901888753593, + 19.19886192715194, + -9.973183034411216 + ], + [ + 17.44937441102231, + 18.664889854926514, + -7.904121632356249 + ], + [ + 15.286337764982042, + 17.082624752088236, + -10.887852529453614 + ], + [ + 15.169391104901402, + 16.773428391939206, + -7.883518921937271 + ], + [ + 14.75508162469117, + 19.261560047607645, + -9.463562848049596 + ], + [ + 15.0040306077284, + 19.09402684848328, + -7.7272740074828254 + ], + [ + 12.569826121063683, + 16.883661322037824, + -9.911978463453332 + ], + [ + 11.201456715692803, + 17.136661022461567, + -10.244932813819672 + ], + [ + 10.802184965078764, + 18.601345686039622, + -10.014779589558545 + ], + [ + 10.321240717751227, + 19.33842401587333, + -10.906946256801847 + ], + [ + 10.308819502793494, + 16.11543998067168, + -9.464202515911802 + ], + [ + 10.62338416719715, + 14.640577760319957, + -9.885307462066468 + ], + [ + 8.845768379485355, + 16.380762017471397, + -9.642500926529868 + ], + [ + 10.318534369216772, + 14.277947666134196, + -11.256075257194091 + ], + [ + 13.170075658376536, + 16.499063627165583, + -10.627438860419224 + ], + [ + 11.013721390485433, + 16.97880586812198, + -11.306976457795496 + ], + [ + 10.480330844089826, + 16.148911966852324, + -8.38830131053551 + ], + [ + 11.680364805781828, + 14.616702648225896, + -9.620125177684619 + ], + [ + 10.109163168031515, + 13.887920900332688, + -9.287660043680077 + ], + [ + 8.239607513780568, + 15.655373829152722, + -9.099836507006387 + ], + [ + 8.54820823016627, + 17.401304035151384, + -9.401564472240404 + ], + [ + 8.50172872432191, + 16.27912693748158, + -10.671775018684608 + ], + [ + 9.326601154073485, + 13.829453022032908, + -11.311041805683631 + ], + [ + 10.343293707113467, + 15.158968180441889, + -11.897393275912732 + ], + [ + 11.025477348635446, + 13.5921364370854, + -11.722973016572322 + ], + [ + 11.085645502210909, + 18.982339089717016, + -8.770446864049466 + ], + [ + 11.009760943821446, + 20.33223745922271, + -8.235699823442692 + ], + [ + 11.82724423898036, + 21.320996465634494, + -8.982562423312174 + ], + [ + 12.703117461403565, + 21.01551054297795, + -9.770879000826355 + ], + [ + 11.274065226606545, + 20.31021366343748, + -6.708903196098811 + ], + [ + 10.758404859633982, + 21.529650428269406, + -6.130021124397651 + ], + [ + 11.487767537642826, + 18.252360074025432, + -8.199896451131393 + ], + [ + 9.964693648750258, + 20.58686837848518, + -8.412040008770134 + ], + [ + 10.831973768736182, + 19.423787492825, + -6.254037764849096 + ], + [ + 12.344169760530502, + 20.308608981173165, + -6.5016010844894465 + ], + [ + 10.936701763165303, + 21.5093343390962, + -5.186942106031838 + ], + [ + 11.63613709936249, + 22.600074961940095, + -8.642674220952417 + ], + [ + 12.099481982838753, + 23.87106760792551, + -9.247820583505357 + ], + [ + 11.548577212206975, + 24.168697143581767, + -10.64208185045349 + ], + [ + 11.83123457288431, + 25.27600439373225, + -11.14700970274459 + ], + [ + 13.596925252691099, + 24.061102261174483, + -9.123879245023591 + ], + [ + 14.089164692175604, + 23.624586538956805, + -7.72726870211745 + ], + [ + 14.727648806296916, + 22.49813080890715, + -7.674816800003965 + ], + [ + 13.844402215451098, + 24.170198801498373, + -6.655643011361535 + ], + [ + 10.879452136051903, + 22.698427311577916, + -7.980969099515914 + ], + [ + 11.731389971495684, + 24.742002662982486, + -8.705525414744994 + ], + [ + 14.145414432176356, + 23.530191260855986, + -9.90194799772661 + ], + [ + 13.805512012928519, + 25.127012455245563, + -9.215719262816268 + ], + [ + 15.044144323287359, + 21.99608067472184, + -8.492053527656743 + ], + [ + 14.957160538936831, + 22.19985971254016, + -6.737554354691423 + ], + [ + 10.750520246016986, + 23.23919899075213, + -11.2462430864792 + ], + [ + 10.079547638754985, + 23.32176051764111, + -12.580343583128446 + ], + [ + 8.59106042969599, + 23.569751049401248, + -12.390276095181374 + ], + [ + 7.90719892568128, + 22.67830322232544, + -11.86677341318917 + ], + [ + 10.379819215597877, + 22.11566228388756, + -13.539901391269668 + ], + [ + 9.548159840931653, + 22.257531493607644, + -14.677984793684061 + ], + [ + 10.694133996255436, + 22.332921901506097, + -10.80399620259712 + ], + [ + 10.378151934326484, + 24.235038579606453, + -13.094986155331787 + ], + [ + 11.423063273252724, + 22.108149311379634, + -13.855627354971734 + ], + [ + 10.129184464685373, + 21.156180923924694, + -13.087486305647205 + ], + [ + 10.027400187328157, + 22.80203078099896, + -15.306831408073728 + ], + [ + 8.126156729052441, + 24.731467642941766, + -12.811671463856463 + ], + [ + 6.660216236328177, + 25.059776580565767, + -12.767528603085669 + ], + [ + 5.944991218496522, + 24.361323015273115, + -13.914624262819975 + ], + [ + 4.8078498626054875, + 23.986696828479126, + -13.699340773426034 + ], + [ + 6.344016059732187, + 26.543545724069418, + -12.735654325818059 + ], + [ + 4.847584266593456, + 26.817946391267242, + -12.683395172026033 + ], + [ + 6.915997435929519, + 27.155338642214247, + -11.61810635115223 + ], + [ + 8.797166739036832, + 25.452594369605208, + -13.034879237432456 + ], + [ + 6.252581705474154, + 24.628560368355238, + -11.853206992688701 + ], + [ + 6.723016451034757, + 27.04141244534776, + -13.628173020049134 + ], + [ + 7.849149839751961, + 27.041440542897135, + -11.812663965173861 + ], + [ + 4.496930003127183, + 26.41017602303532, + -11.7353120181079 + ], + [ + 4.746628519542494, + 27.896317848486206, + -12.560770484889686 + ], + [ + 4.286474668571758, + 26.50038476627924, + -13.562262282961175 + ], + [ + 6.615371052477229, + 24.18655001425975, + -15.074906342031056 + ], + [ + 5.899349926227278, + 23.63625950974722, + -16.24635243717797 + ], + [ + 5.516780045523989, + 22.20987492791744, + -16.03815263918604 + ], + [ + 4.478355142776413, + 21.75451823786875, + -16.597178294309053 + ], + [ + 6.789708571523814, + 23.788545105410662, + -17.44450067100874 + ], + [ + 7.213761359963971, + 25.24096518868646, + -17.876538038074244 + ], + [ + 8.61899473235714, + 25.223176317982052, + -18.46352712466779 + ], + [ + 9.566873337033504, + 25.5989420165007, + -17.777653514478715 + ], + [ + 8.704935803663009, + 24.77790508718408, + -19.587447815667 + ], + [ + 7.522013376755911, + 24.6250950039323, + -15.15092744261549 + ], + [ + 5.049612471394139, + 24.292715043598832, + -16.4337349855123 + ], + [ + 7.6560138242360205, + 23.13419220483729, + -17.3473690130585 + ], + [ + 6.1969954815653585, + 23.375478349121522, + -18.26069072909411 + ], + [ + 6.509643372170008, + 25.699203438521067, + -18.571040764982016 + ], + [ + 7.126304564845039, + 25.913021106341148, + -17.022847099012434 + ], + [ + 6.3947516463984, + 21.40299604153597, + -15.432032307172625 + ], + [ + 6.13556278460956, + 20.02054353912922, + -15.036431228011653 + ], + [ + 4.992551753238724, + 19.90243549033073, + -14.016173252650084 + ], + [ + 4.069274925406535, + 19.117336887639908, + -14.190543447446943 + ], + [ + 7.443559950281053, + 19.395903797020082, + -14.454699595618813 + ], + [ + 7.288665781564376, + 21.831550791430686, + -15.238743078927978 + ], + [ + 5.814837103167101, + 19.493374195802517, + -15.934943990717679 + ], + [ + 8.285412471522545, + 19.518254575774222, + -15.136180722260567 + ], + [ + 7.748895195697833, + 19.96751721955843, + -13.578271507991639 + ], + [ + 7.262945857199465, + 18.385917092055365, + -14.086726232084061 + ], + [ + 4.888485782320713, + 20.732438659847958, + -12.959205915886857 + ], + [ + 3.6268246310531036, + 20.912902975584757, + -12.232141973682333 + ], + [ + 2.444476213535484, + 21.278703409925015, + -13.113249086408157 + ], + [ + 1.4112713241333799, + 20.618034804642093, + -12.951440688927422 + ], + [ + 5.577903198066722, + 21.470423916136497, + -12.945719935068015 + ], + [ + 3.4732680833151837, + 19.962002295006073, + -11.721938818975971 + ], + [ + 3.6976198609506015, + 21.680432805041278, + -11.461437157790773 + ], + [ + 2.5118318272979905, + 22.149533879659316, + -14.092813991283819 + ], + [ + 1.3353684756915116, + 22.57930775100192, + -14.963151160290257 + ], + [ + 0.8307918914232387, + 21.44736519394928, + -15.857901938858088 + ], + [ + -0.36305665504928, + 21.322704172246517, + -16.239908357654073 + ], + [ + 1.6862663869140313, + 23.77465242821961, + -15.924324684703905 + ], + [ + 0.5129074880477245, + 24.65189538311131, + -16.38486067674378 + ], + [ + -0.23831328375394936, + 25.414339556130926, + -15.353930371160402 + ], + [ + -1.505847265449948, + 25.642285608361817, + -15.646897229153518 + ], + [ + 0.1761180605276765, + 25.69514490361132, + -14.218716040970284 + ], + [ + 3.289688628285285, + 22.79320502854523, + -14.119770530096314 + ], + [ + 0.4631828627176686, + 22.868690655916566, + -14.376934791476538 + ], + [ + 2.5095594668260235, + 24.352086726403513, + -15.503780919558778 + ], + [ + 2.3124308368266266, + 23.436813738432534, + -16.750086697843564 + ], + [ + 0.9065436616248401, + 25.36911811138657, + -17.105096135259227 + ], + [ + -0.14946346357961884, + 24.07973874128504, + -17.03447596433459 + ], + [ + -2.01209473837903, + 25.306157747136695, + -16.45364027389161 + ], + [ + -1.9863960795421065, + 26.130820821297675, + -14.904937730952458 + ], + [ + 1.7637284560577997, + 20.49686100101178, + -16.263193478077227 + ], + [ + 1.4880658425697202, + 19.146238339122192, + -16.926053621124222 + ], + [ + 0.7863414244355356, + 18.184128297317784, + -15.96195326351056 + ], + [ + -0.24810229997205452, + 17.606225706644295, + -16.347468741184496 + ], + [ + 2.8354032829220057, + 18.544910197144645, + -17.326359439681244 + ], + [ + 2.959661779520053, + 18.395045673652362, + -18.842993348984766 + ], + [ + 4.3494864033881155, + 18.03816152831382, + -19.356900694157652 + ], + [ + 4.335858728313448, + 17.685621576303674, + -20.81768446529176 + ], + [ + 5.677056246628177, + 17.37746014255663, + -21.351439607152447 + ], + [ + 2.7371801377269334, + 20.682154973291176, + -16.06785468254659 + ], + [ + 0.8572966276165358, + 19.304653883474316, + -17.80077245884982 + ], + [ + 3.652166411832305, + 19.155168676898597, + -16.940895466080363 + ], + [ + 2.920648980727296, + 17.558611287278154, + -16.87023314958838 + ], + [ + 2.278818806237932, + 17.56461323601968, + -19.029890376493565 + ], + [ + 2.705071182952798, + 19.28953427996055, + -19.411480166638476 + ], + [ + 4.953180134894797, + 18.939256180675102, + -19.248776707013526 + ], + [ + 4.889069853640904, + 17.200113093825507, + -18.91574261934689 + ], + [ + 3.638201711796332, + 16.873685131034676, + -21.022947924315645 + ], + [ + 3.911658643181418, + 18.548516049314458, + -21.33107822372575 + ], + [ + 6.234534977395922, + 18.218012380889263, + -21.29861627543702 + ], + [ + 6.119909583954216, + 16.62579294069735, + -20.842539901320773 + ], + [ + 5.526219660244429, + 16.92356452507545, + -22.241006432961402 + ], + [ + 1.4296911263614545, + 17.967937947550467, + -14.769914749941075 + ], + [ + 1.0273608201979028, + 17.116068640719504, + -13.6751077324898 + ], + [ + -0.39915818257392915, + 17.523412862785904, + -13.268128734015736 + ], + [ + -1.3136875502007666, + 16.732986652538557, + -13.153012999699726 + ], + [ + 2.116714904309604, + 17.15208657706853, + -12.543938687724031 + ], + [ + 1.9196112583767269, + 16.12466378174156, + -11.396727400522687 + ], + [ + 3.2782624281455752, + 15.814866446230894, + -10.692326566459148 + ], + [ + 0.9950030145311753, + 16.657348049620623, + -10.301756518391327 + ], + [ + 2.286633954254107, + 18.468868862685667, + -14.58332678877 + ], + [ + 0.9673485305875152, + 16.11131744578836, + -14.093408391295254 + ], + [ + 3.0265149384736567, + 16.893228537600066, + -13.085561907195384 + ], + [ + 2.2260078569478825, + 18.150913872006413, + -12.121444471569518 + ], + [ + 1.5245671027373309, + 15.177548465453697, + -11.764171482833738 + ], + [ + 3.011969133125001, + 15.040655643922946, + -9.972753744891769 + ], + [ + 3.9169037637517787, + 15.30753865568795, + -11.415413102931403 + ], + [ + 3.7118590594947145, + 16.711360905369474, + -10.24916192951696 + ], + [ + 1.2882573529918706, + 17.677915042900054, + -10.055700092042134 + ], + [ + -0.03705350281274423, + 16.67548189579236, + -10.65194091485889 + ], + [ + 1.0753188297496405, + 16.081175019208672, + -9.379979706552872 + ], + [ + -0.7159445927814571, + 18.874080792949485, + -13.07894954024014 + ], + [ + -2.0440774934853216, + 19.329816799914738, + -12.664548892709487 + ], + [ + -3.1148920561503166, + 19.0698738828454, + -13.70570118517438 + ], + [ + -4.289451741326104, + 18.73856006841322, + -13.385061251731013 + ], + [ + -1.9559389110408771, + 20.824873353392377, + -12.438061640787314 + ], + [ + -3.2673840779400978, + 21.48463034929557, + -12.086387220909227 + ], + [ + -3.992133025134637, + 21.194875932339187, + -10.918020829671239 + ], + [ + -3.757696931450005, + 22.548664251458376, + -12.873053067543344 + ], + [ + -5.2347374403709255, + 21.859971462623662, + -10.519444578741142 + ], + [ + -5.010681821995759, + 23.105019143711047, + -12.594898225103345 + ], + [ + -5.672036064505679, + 22.826514673329484, + -11.382309416361604 + ], + [ + 0.019588885145173256, + 19.566020409711996, + -13.096435644198113 + ], + [ + -2.3803260945900724, + 18.792605704636344, + -11.777734781637996 + ], + [ + -1.3047839824208598, + 21.11698952547124, + -11.614190022165424 + ], + [ + -1.4914782581798502, + 21.26765326814575, + -13.31915243862519 + ], + [ + -3.6070236602092716, + 20.393419872987124, + -10.305032186503906 + ], + [ + -3.2536079889878557, + 22.815555068098206, + -13.790148527486892 + ], + [ + -5.7111727471478595, + 21.744531120040847, + -9.557112072132476 + ], + [ + -5.419911759472492, + 23.86864653575435, + -13.239731535342122 + ], + [ + -6.5392841421674355, + 23.4288199856353, + -11.155342864340417 + ], + [ + -2.6914276444869807, + 19.05490101097837, + -14.969127803358782 + ], + [ + -3.686044390687679, + 18.87091981864478, + -16.056894717375656 + ], + [ + -4.425043789040977, + 17.527585348868115, + -15.988896995891096 + ], + [ + -5.629152947626267, + 17.490249949648387, + -16.16152672401186 + ], + [ + -2.9005301812345103, + 18.9083004861385, + -17.369442113881846 + ], + [ + -3.891212322046251, + 19.083705682012805, + -18.494917516016418 + ], + [ + -3.957757003596075, + 18.137135145987827, + -19.390113199699204 + ], + [ + -4.800352300425093, + 19.892290714031333, + -18.465229328756237 + ], + [ + -1.7379195706979882, + 19.324409582634985, + -15.164796068717228 + ], + [ + -4.421596147710516, + 19.674984267163836, + -16.08032807654933 + ], + [ + -2.3207164414975825, + 19.830970934469974, + -17.393791828041024 + ], + [ + -2.292034949665328, + 18.005488761315405, + -17.42206881099654 + ], + [ + -3.2589796761432854, + 17.408946568581428, + -19.35073136101438 + ], + [ + -4.827022591750471, + 18.08180638834324, + -19.901404265263714 + ], + [ + -3.7317171652979817, + 16.458365887870627, + -15.551400964964419 + ], + [ + -4.394284990887653, + 15.18704231519257, + -15.326896777998906 + ], + [ + -4.884027607448441, + 15.047823640963543, + -13.883277444084625 + ], + [ + -5.870578560986229, + 14.335411837531296, + -13.710255782718294 + ], + [ + -3.5093459435967254, + 13.92109161834503, + -15.7939154953587 + ], + [ + -2.345731176646377, + 13.552180160898956, + -14.927983399803052 + ], + [ + -2.8072934516037473, + 12.610884939769164, + -13.436470198175764 + ], + [ + -1.3275586734651577, + 12.949533775563225, + -12.328264686416828 + ], + [ + -2.8674670005264202, + 16.65700151317833, + -15.067959259800503 + ], + [ + -5.279001886905645, + 15.094225182781656, + -15.956786036186937 + ], + [ + -4.154032831497123, + 13.054257244521864, + -15.939097027884431 + ], + [ + -3.048793947375512, + 14.037064253391009, + -16.775010139891616 + ], + [ + -1.6604348235810371, + 12.881522876813165, + -15.446333235215779 + ], + [ + -1.7347244713023409, + 14.436759698127503, + -14.74828871009829 + ], + [ + -0.928067596615049, + 13.946750924824414, + -12.512831305414457 + ], + [ + -1.4790466926070092, + 12.739259520914345, + -11.269522473573213 + ], + [ + -0.4985328661465546, + 12.260349279614445, + -12.489018577379607 + ], + [ + -4.256559039030399, + 15.717669218067385, + -12.899306785086262 + ], + [ + -4.681628512706393, + 15.593626342450875, + -11.471102862931978 + ], + [ + -6.129327862139929, + 16.185649512660348, + -11.31759342549296 + ], + [ + -6.974811959019308, + 15.631248961064216, + -10.63362642717475 + ], + [ + -3.7159294629700814, + 16.438113798670997, + -10.633844360901863 + ], + [ + -3.5898124034346233, + 15.929042399091827, + -9.131258427939697 + ], + [ + -2.730970517413224, + 14.68047471945772, + -9.163840641354668 + ], + [ + -2.7511636564710584, + 16.955836121507787, + -8.362152875796799 + ], + [ + -3.5090639832344586, + 16.38291772389846, + -13.036412741452756 + ], + [ + -4.6205646546000425, + 14.55466638115547, + -11.14716695392803 + ], + [ + -2.7249513308091413, + 16.375673239084563, + -11.083469971953166 + ], + [ + -3.993376842515108, + 17.490576193416132, + -10.692594029059862 + ], + [ + -4.5553975548864, + 15.785076799993362, + -8.646469506420525 + ], + [ + -2.5444989440127754, + 14.142292697750918, + -8.234493107235428 + ], + [ + -3.1127675660160006, + 13.858466863712692, + -9.769339655819477 + ], + [ + -1.7817961022097204, + 14.974329817647913, + -9.611966949698694 + ], + [ + -2.572000004241868, + 16.705733590619616, + -7.31647057271255 + ], + [ + -1.7798208478774213, + 17.08678943329562, + -8.839063556349059 + ], + [ + -3.234173872285349, + 17.93292371810412, + -8.352431145309804 + ], + [ + -6.488126634617187, + 17.395534671679684, + -11.913374680133531 + ], + [ + -7.79735541071892, + 18.035838797565475, + -11.674141969176512 + ], + [ + -9.080461159341308, + 17.200138069424952, + -12.120709497067182 + ], + [ + -10.120265649161771, + 17.74411130825297, + -11.720196079775407 + ], + [ + -7.674085324581155, + 19.451387091186234, + -12.262891061660184 + ], + [ + -7.938577713399613, + 19.586659620703017, + -13.779041844682848 + ], + [ + -7.82356440500635, + 21.011024300927716, + -14.326761490715903 + ], + [ + -8.322498071319629, + 21.258000198960417, + -15.734927922712398 + ], + [ + -9.079432084644166, + 22.34322745822692, + -16.011300115641536 + ], + [ + -9.399366462665666, + 23.28479350851319, + -15.1854382398796 + ], + [ + -9.555250053334962, + 22.592202965190154, + -17.25702368897329 + ], + [ + -5.767586079723605, + 17.73554936056837, + -12.534107348262898 + ], + [ + -7.962387940491352, + 18.201968680196046, + -10.60959294532313 + ], + [ + -8.427579698654121, + 20.127125348784034, + -11.858265274097008 + ], + [ + -6.698118542944861, + 19.914114705021007, + -12.116350697243808 + ], + [ + -7.2123801115673585, + 18.950958809989856, + -14.2856110053484 + ], + [ + -8.95312322213124, + 19.273813701085146, + -14.025867831096761 + ], + [ + -8.369119747653393, + 21.74868331344851, + -13.738267693300063 + ], + [ + -6.775632762704955, + 21.31046300656874, + -14.310121556481374 + ], + [ + -7.917440638030572, + 20.73418695180908, + -16.497585944111275 + ], + [ + -9.052445236319706, + 23.23547606545992, + -14.238171522028777 + ], + [ + -10.008785194779602, + 24.038341685205637, + -15.469815104380672 + ], + [ + -9.60501465277251, + 21.758494041105337, + -17.82495941587557 + ], + [ + -10.233266609996189, + 23.335291048640215, + -17.34765702025214 + ], + [ + -8.877668567617546, + 16.006945976684392, + -12.740234661410819 + ], + [ + -9.972008733791851, + 15.146795697662583, + -13.221915547840613 + ], + [ + -10.441667774010783, + 14.048100346395586, + -12.308301027215302 + ], + [ + -11.664934380678847, + 13.912451621912169, + -12.146185912795374 + ], + [ + -9.556089247152995, + 14.503060548803091, + -14.605757308008327 + ], + [ + -9.732795576080614, + 15.303344315956224, + -15.915248306820047 + ], + [ + -11.305348303976235, + 15.452902888355311, + -16.087440954014745 + ], + [ + -8.896760116073803, + 16.59164193040681, + -15.972832766147024 + ], + [ + -7.944150876660939, + 15.641487395861532, + -12.617411712560331 + ], + [ + -10.816170774816888, + 15.78370314202391, + -13.486185478454344 + ], + [ + -8.53614349353009, + 14.127160606437428, + -14.525072101179756 + ], + [ + -10.16022941734018, + 13.599852336338813, + -14.691361109216361 + ], + [ + -9.294270829093563, + 14.64121932103069, + -16.661829842468542 + ], + [ + -11.704147021326598, + 16.151351770723068, + -15.3517550269482 + ], + [ + -11.53202687341666, + 15.8354479011482, + -17.082618696296926 + ], + [ + -11.715292253731088, + 14.444712865575639, + -16.02747603873465 + ], + [ + -9.16268706813177, + 17.087804067023058, + -16.906219317679092 + ], + [ + -9.16946638223713, + 17.0855671898978, + -15.040217355981499 + ], + [ + -7.831126197423296, + 16.3645060241829, + -16.003395131644282 + ], + [ + -9.53491609207702, + 13.302406995728461, + -11.70305016219007 + ], + [ + -9.839274109126361, + 11.962041500335772, + -11.099602924803998 + ], + [ + -10.339726510564912, + 10.970361129276455, + -12.166282614309768 + ], + [ + -10.021030060082435, + 11.01414101364037, + -13.327811906698795 + ], + [ + -8.578668312610722, + 13.578652735335254, + -11.874446828227521 + ], + [ + -8.949606549426901, + 11.636581342023419, + -10.560465611080726 + ], + [ + -10.602441801334848, + 12.05863307021275, + -10.32736672669017 + ], + [ + -11.272653283544077, + 10.157600489225786, + -11.652898164595092 + ], + [ + -12.092430436491, + 9.236082040418694, + -12.353826579580758 + ], + [ + -12.935768279836484, + 9.834605890871103, + -13.436994121679408 + ], + [ + -13.472221455488553, + 8.95669171674433, + -14.096131348697423 + ], + [ + -12.943308464537356, + 8.445574659473152, + -11.376410326006996 + ], + [ + -12.099361038372699, + 7.5543906371664775, + -10.478466499548368 + ], + [ + -12.985275154965317, + 6.836076006902999, + -9.447964610979303 + ], + [ + -12.340718066643634, + 5.6950778438329905, + -8.691199243183268 + ], + [ + -12.539653305480227, + 4.454454746284711, + -9.485669096153096 + ], + [ + -11.441720926826973, + 10.233995384514401, + -10.66008374117264 + ], + [ + -11.416797487191037, + 8.474308306146668, + -12.742824659114806 + ], + [ + -13.718665067276287, + 9.039054219325237, + -10.891945347343027 + ], + [ + -13.421046352624732, + 7.63742513946994, + -11.930269163082249 + ], + [ + -11.667486038330365, + 6.807396994353269, + -11.144488454700465 + ], + [ + -11.414267129791252, + 8.249387423398503, + -9.992953394470984 + ], + [ + -13.24546007972827, + 7.5854212585014125, + -8.700377819061165 + ], + [ + -13.955157271901912, + 6.581499721764317, + -9.875304868828252 + ], + [ + -11.288652179935804, + 5.965232659125235, + -8.600224899514977 + ], + [ + -12.877559201570563, + 5.572098382411582, + -7.750573651471911 + ], + [ + -12.460930227362374, + 4.604544830659478, + -10.481347914587737 + ], + [ + -11.747480319574406, + 3.8627519661868632, + -9.279634458272763 + ], + [ + -13.417095253554166, + 4.042180575034195, + -9.202423888426676 + ], + [ + -12.983261043039445, + 11.157611003187355, + -13.653245405224789 + ], + [ + -13.80428630966367, + 11.748618759181909, + -14.68599267610397 + ], + [ + -13.325994187010695, + 11.385173836064268, + -16.072664498862018 + ], + [ + -13.975275486498193, + 11.472280141564681, + -17.054033825214685 + ], + [ + -13.826722318505835, + 13.280662614462017, + -14.408900954053047 + ], + [ + -14.55021237503777, + 13.463065661105702, + -13.307829775237222 + ], + [ + -12.551507121160723, + 11.769645872451804, + -12.97567773059313 + ], + [ + -14.809054643670374, + 11.329414249329261, + -14.632988147938864 + ], + [ + -12.847100514731133, + 13.753229053502992, + -14.337324071471953 + ], + [ + -14.400647585445121, + 13.816801319939259, + -15.164723469618217 + ], + [ + -14.530402113243216, + 14.409978050648078, + -13.151106370004259 + ], + [ + -12.097779242227608, + 10.891996283581648, + -16.133363042516695 + ], + [ + -11.386852661916976, + 10.301809600418835, + -17.267796920891637 + ], + [ + -10.63197210120139, + 9.084686200485464, + -16.91737363072914 + ], + [ + -10.23680815673378, + 8.951499133522304, + -15.73165705854871 + ], + [ + -10.4260788908553, + 11.31074420825695, + -17.9296862946961 + ], + [ + -11.114490781349343, + 12.332667688781214, + -18.84850271041654 + ], + [ + -10.130595837781902, + 13.191665187791159, + -19.66719669686565 + ], + [ + -10.563584595679911, + 13.968036379451064, + -20.531346208758247 + ], + [ + -8.854405143200227, + 13.16567963754403, + -19.50239369760377 + ], + [ + -11.599505879650417, + 10.795034762637897, + -15.26019424982629 + ], + [ + -12.136874579156329, + 10.076551547078168, + -18.02597022377539 + ], + [ + -9.990308576873417, + 11.876188657732484, + -17.105987946828154 + ], + [ + -9.570311792384404, + 10.818656216300099, + -18.391866022214973 + ], + [ + -11.825817671223104, + 11.856394714685166, + -19.523246575049814 + ], + [ + -11.715776830623904, + 13.04290037116192, + -18.280944705600216 + ], + [ + -10.470471990109216, + 8.022290541548728, + -17.758636073291584 + ], + [ + -9.698674362501944, + 6.795823925960633, + -17.540165119225765 + ], + [ + -8.230546199275183, + 6.943175279758805, + -17.065684995492198 + ], + [ + -7.583696193836417, + 7.856630512382708, + -17.61769732359455 + ], + [ + -9.818347226438998, + 5.971110510357022, + -18.8151663076416 + ], + [ + -11.177135375581258, + 6.331508020098681, + -19.3720893511406 + ], + [ + -11.30738792110588, + 7.808319898182049, + -18.96703669918322 + ], + [ + -10.116393571220385, + 6.352702547933603, + -16.636145162151003 + ], + [ + -8.976892769027575, + 6.294975742498593, + -19.42767264228331 + ], + [ + -9.813366077320191, + 4.937908595464819, + -18.4679367475184 + ], + [ + -11.136115275436126, + 6.072959834160827, + -20.430185295026998 + ], + [ + -11.942257355944285, + 5.732689535621574, + -18.87802042233307 + ], + [ + -10.88701897274751, + 8.454938948289907, + -19.73727954976894 + ], + [ + -12.326941082573612, + 8.092145732220274, + -18.706171213749737 + ], + [ + -7.769729142780949, + 5.936299988143645, + -16.36454965134022 + ], + [ + -6.361521350025441, + 6.149431607466482, + -15.77834586667233 + ], + [ + -5.230732338823205, + 5.955400468062635, + -16.807337482786398 + ], + [ + -4.101302987305734, + 6.430129637918014, + -16.708935252069683 + ], + [ + -6.072934863592944, + 5.235579887201396, + -14.590278427411592 + ], + [ + -6.141691796300004, + 3.751082939120181, + -14.892479990846288 + ], + [ + -7.254978694707662, + 3.0015111510299306, + -14.846187635847606 + ], + [ + -5.067766322486674, + 2.9094801646359087, + -15.391913941144923 + ], + [ + -5.660282665241552, + 1.6439665407786492, + -15.708133046445708 + ], + [ + -3.713679877982756, + 3.18543009948678, + -15.729293775543356 + ], + [ + -6.96715667458911, + 1.8071840343677366, + -15.414284142164565 + ], + [ + -4.9074321639915635, + 0.5794730778299702, + -16.27235055597618 + ], + [ + -2.9848841930727317, + 2.081240506585715, + -16.27166387667303 + ], + [ + -3.5541585969015705, + 0.8514593557807046, + -16.460062549519165 + ], + [ + -8.428951457057519, + 5.304480931925411, + -15.932886943856408 + ], + [ + -6.2801696572433, + 7.189311373260182, + -15.461908192669918 + ], + [ + -5.078831093829801, + 5.433330829947522, + -14.189340498700354 + ], + [ + -6.827622948869115, + 5.323202485171578, + -13.80869823313417 + ], + [ + -8.26542122607415, + 3.2890940566877305, + -14.595785366168904 + ], + [ + -7.663305410102, + 1.1416885042484068, + -15.718572737503374 + ], + [ + -3.240937706924367, + 4.149537018515531, + -15.613474178850645 + ], + [ + -5.409825642087165, + -0.355414755701295, + -16.47231294717881 + ], + [ + -1.937653995085386, + 2.131520290705083, + -16.530857573732714 + ], + [ + -2.975690088707929, + 0.0024922489710417217, + -16.793269814760365 + ], + [ + -5.6134513371067385, + 5.118052911333734, + -17.794093704986913 + ], + [ + -4.800518573085264, + 4.7673030073650295, + -18.978778504369313 + ], + [ + -4.519923274492757, + 6.062107936202153, + -19.78344399711294 + ], + [ + -3.3838332232765875, + 6.2782627737890095, + -20.243722500335675 + ], + [ + -5.57056539958703, + 3.7727551252944806, + -19.833067245263585 + ], + [ + -5.664655796346921, + 2.4352483604288437, + -19.153453024249878 + ], + [ + -6.929531890109939, + 4.13303165947633, + -19.89019888533896 + ], + [ + -6.4722657726271375, + 4.599166101172841, + -17.678796911879672 + ], + [ + -3.884612573334079, + 4.28474945049615, + -18.637666469022466 + ], + [ + -5.154017268382066, + 3.6336851339308964, + -20.830687918682255 + ], + [ + -7.392562271184967, + 3.313101461410099, + -20.077063142353445 + ], + [ + -5.773275790439554, + 1.6587618517433782, + -19.91066789244655 + ], + [ + -4.711433932954892, + 2.2625288219823148, + -18.653817752452706 + ], + [ + -6.503512025270083, + 2.301341488884816, + -18.470454629567705 + ], + [ + -5.5686866085411015, + 6.853218633971778, + -19.943935626906544 + ], + [ + -5.646980523938354, + 8.099125631777554, + -20.689418296991345 + ], + [ + -5.026121945833781, + 9.322933126512282, + -19.908287773295196 + ], + [ + -4.306832935944808, + 10.104366559984612, + -20.500140862832115 + ], + [ + -7.162702051438096, + 8.191103740144626, + -21.142589559854834 + ], + [ + -7.548142776104087, + 9.559519175176035, + -21.796962796069945 + ], + [ + -7.178905863425161, + 9.66611035068064, + -23.266388161416682 + ], + [ + -9.081007719566413, + 9.762842408304493, + -21.580906632033532 + ], + [ + -6.465534228787995, + 6.727684246775937, + -19.496717815637123 + ], + [ + -5.043385453770508, + 8.068701449216633, + -21.596528971922933 + ], + [ + -7.463930352624324, + 7.3665444708188375, + -21.788703585351684 + ], + [ + -7.757890087006582, + 8.040329948735064, + -20.24196785030101 + ], + [ + -6.963670876835805, + 10.28201097444662, + -21.227317820092022 + ], + [ + -7.493756784806024, + 8.731251029332725, + -23.73007415925357 + ], + [ + -7.783283426650703, + 10.416506138430691, + -23.77602776226588 + ], + [ + -6.1133703193136455, + 9.877611531652235, + -23.35583208274866 + ], + [ + -9.460988122523407, + 10.716936063174671, + -21.94617011608102 + ], + [ + -9.538791661572711, + 8.913634563789344, + -22.088229682521156 + ], + [ + -9.21191498071854, + 9.738017442944056, + -20.499079169434154 + ], + [ + -5.205355041348137, + 9.306792645371218, + -18.55208461736466 + ], + [ + -4.6152059025124945, + 10.378716495496064, + -17.706510795220215 + ], + [ + -3.0953376444382936, + 10.27906697566209, + -17.48979289799436 + ], + [ + -2.4514209182031395, + 11.353082532240421, + -17.46528098320767 + ], + [ + -5.3372789672357985, + 10.33881017050851, + -16.388824671791 + ], + [ + -5.81239747073304, + 8.622047562223713, + -18.12462249347982 + ], + [ + -4.8193463776114465, + 11.32677151871303, + -18.204123110096756 + ], + [ + -6.403082614682105, + 10.205251591503611, + -16.57409517702013 + ], + [ + -5.027863616793675, + 9.497009152203645, + -15.7693626603704 + ], + [ + -5.155287307289617, + 11.263261691275375, + -15.840766409842997 + ], + [ + -2.5034626774410085, + 9.094802098748005, + -17.363775363152573 + ], + [ + -1.080946756036941, + 8.817921822817823, + -17.46557439559107 + ], + [ + -0.5453110601350337, + 9.270560074964465, + -18.837281189535613 + ], + [ + 0.43776335757402196, + 9.991961533221797, + -18.94057878236847 + ], + [ + -0.8137417781518355, + 7.326563219032948, + -17.30893050431509 + ], + [ + 0.6318125892887534, + 6.830817862732431, + -17.172143870599445 + ], + [ + 1.3939029669949674, + 7.352181940163234, + -15.976148322922807 + ], + [ + 0.7867037086586257, + 5.371863928495685, + -17.33902764713585 + ], + [ + -3.1308818724577203, + 8.324714611810862, + -17.1809960604553 + ], + [ + -0.6399033717923509, + 9.39304821951555, + -16.651441702964107 + ], + [ + -1.3159143256435948, + 6.986588335005877, + -16.40320440242037 + ], + [ + -1.189437980740394, + 6.895503104318948, + -18.2369082322641 + ], + [ + 1.1465108841628906, + 7.217731263965675, + -18.051625303002066 + ], + [ + 1.07606087625945, + 8.353790892489258, + -15.6865703260259 + ], + [ + 1.25195235028845, + 6.60521327294947, + -15.195130069935345 + ], + [ + 2.4612747168575075, + 7.412855476088964, + -16.18860174793165 + ], + [ + 0.3113476973061333, + 5.214208969195397, + -18.307161463661515 + ], + [ + 1.8477637235884499, + 5.186716687863026, + -17.506276787103893 + ], + [ + 0.28368818057882245, + 4.779379880427712, + -16.57480391477 + ], + [ + -1.2278537258963005, + 8.899005106414677, + -19.97054896825771 + ], + [ + -0.7048554185123803, + 9.074832546017092, + -21.322634294236416 + ], + [ + -0.6337324426834973, + 10.621341956300512, + -21.60322429788056 + ], + [ + 0.3310074171401945, + 11.079016694172651, + -22.211964011169 + ], + [ + -1.6662095062116036, + 8.386359854652483, + -22.323813906330766 + ], + [ + -0.8738912881499209, + 8.272509365071812, + -23.675190548785352 + ], + [ + -1.6896570614739255, + 7.792792099714859, + -24.904075838454798 + ], + [ + -2.5346107239634628, + 8.589110990456163, + -25.33640346271472 + ], + [ + -1.5909514537017857, + 6.633178139452582, + -25.42566777185675 + ], + [ + -1.8579588701254568, + 8.117021429267083, + -19.862983682650402 + ], + [ + 0.3064032922337719, + 8.66824071388396, + -21.310806813355264 + ], + [ + -1.9012173314729952, + 7.357027206455484, + -22.052997182387163 + ], + [ + -2.579387124620514, + 8.971898734856154, + -22.430348872415077 + ], + [ + -0.3572400595580898, + 9.203620005040591, + -23.90800066229176 + ], + [ + -0.07129137652204448, + 7.557687416293163, + -23.493633554409747 + ], + [ + -1.4904825904347676, + 11.448485419681333, + -20.981361528940518 + ], + [ + -1.6217382567354963, + 12.915218082413844, + -20.972592029961096 + ], + [ + -0.38322616472686427, + 13.646253878156926, + -20.447522284054372 + ], + [ + -0.17452460643035636, + 14.801856132758417, + -20.85740471104994 + ], + [ + -2.8326205133118596, + 13.243676873634513, + -20.089042697637684 + ], + [ + -3.5594985503648195, + 14.478834217341841, + -20.471160025507682 + ], + [ + -4.347393634370751, + 14.408167319688346, + -21.53465847572846 + ], + [ + -3.2686134886814164, + 15.62473969545897, + -20.142490565470812 + ], + [ + -2.1886795313447838, + 10.93028934094258, + -20.467460419648525 + ], + [ + -1.7661134366715, + 13.18053699726363, + -22.019903212607403 + ], + [ + -3.4942972480560646, + 12.379488352377507, + -20.147872655431723 + ], + [ + -2.5880604276173393, + 13.355700242018315, + -19.032757490789322 + ], + [ + -4.603819992855861, + 13.451436397614316, + -21.732174828957262 + ], + [ + -4.619204317458893, + 15.25059428895429, + -22.02100366573045 + ], + [ + 0.5200400732044499, + 12.98555717532463, + -19.732639467855126 + ], + [ + 1.7763824417889358, + 13.509373544425898, + -19.15296368743428 + ], + [ + 3.0707805956478507, + 12.792504376980276, + -19.624195518124523 + ], + [ + 4.085398659153176, + 13.510158714833437, + -19.72003945671316 + ], + [ + 1.6475977212871464, + 13.419099240233436, + -17.569785404665932 + ], + [ + 2.6153035832398093, + 14.478472071149895, + -16.956909258501618 + ], + [ + 0.18595608116699938, + 13.73786593789464, + -17.108276862322402 + ], + [ + 0.2427548694661232, + 12.031561861877265, + -19.55068905013039 + ], + [ + 1.8267698538995696, + 14.559486671848276, + -19.44075132403881 + ], + [ + 1.9712624388597106, + 12.482463529375025, + -17.11584917504184 + ], + [ + 2.0928003728250704, + 14.630834154586637, + -16.012519388323767 + ], + [ + 3.6186838827297976, + 14.070220922628664, + -16.83583694425797 + ], + [ + 2.4458423180094595, + 15.364615705293659, + -17.568572647051514 + ], + [ + -0.5260931036369172, + 12.97224986374556, + -17.416369548580178 + ], + [ + 0.13728294279785785, + 13.898440310623755, + -16.031269702114457 + ], + [ + -0.13141752875097956, + 14.667933846586607, + -17.579811523693042 + ], + [ + 3.016192810028847, + 11.543692404764101, + -19.968023611879993 + ], + [ + 4.1292587623979555, + 10.610556399777863, + -20.22200049049699 + ], + [ + 4.223171743133575, + 10.029095566671003, + -21.596117365277713 + ], + [ + 5.236921220337002, + 9.471664382179767, + -22.075527138512808 + ], + [ + 4.250320653767593, + 9.449026342745697, + -19.163161467538348 + ], + [ + 3.724175666849874, + 9.891581477104069, + -17.764248480468822 + ], + [ + 3.4206426556394165, + 8.14630766107831, + -19.57083340113744 + ], + [ + 2.1020831706532417, + 11.119806530990559, + -19.89856641133895 + ], + [ + 4.942566080779361, + 11.314560792047075, + -20.045899166111965 + ], + [ + 5.289117127753369, + 9.120302185780929, + -19.13242434053513 + ], + [ + 2.6431550297493964, + 10.027261421086791, + -17.797199059688907 + ], + [ + 3.8978279454302065, + 9.128751743268026, + -17.0052774509932 + ], + [ + 4.252684652586591, + 10.743975271523368, + -17.33739369267248 + ], + [ + 3.459379859688969, + 7.493163735615553, + -18.69905070981774 + ], + [ + 2.4299273400496015, + 8.375490005481709, + -19.96333583994623 + ], + [ + 3.9223825813512665, + 7.678733219976323, + -20.418021345540925 + ], + [ + 3.179614310689222, + 10.156681074971232, + -22.423613568962285 + ], + [ + 3.0804696081075975, + 9.666959521061756, + -23.809493946652644 + ], + [ + 2.9588539665989524, + 8.168126969143088, + -23.936051482106187 + ], + [ + 3.2752320270315898, + 7.575897750238198, + -24.976822162303485 + ], + [ + 2.320099707463697, + 10.570710172326471, + -22.09208119856218 + ], + [ + 2.3201063656053993, + 10.252845718195204, + -24.325909725816857 + ], + [ + 4.063411819396371, + 9.892617964481019, + -24.223018121436223 + ], + [ + 2.598937484426261, + 7.477276132418865, + -22.832503013741615 + ], + [ + 2.3506256963724237, + 6.027867950338589, + -22.688704364754738 + ], + [ + 1.160191483215819, + 5.669393951997904, + -21.68496305292121 + ], + [ + 0.9436954222822913, + 6.368165956183475, + -20.70862162343923 + ], + [ + 3.678099152631762, + 5.324471557818356, + -22.362975746027626 + ], + [ + 2.6491352772702137, + 8.00828079123528, + -21.974823783495022 + ], + [ + 1.9803669371117958, + 5.833129299031725, + -23.695227241574663 + ], + [ + 3.5983681432992087, + 4.268804871713229, + -22.622425345378126 + ], + [ + 4.434500753725434, + 5.8256155460363175, + -22.966974771139842 + ], + [ + 3.943943719931749, + 5.402213574502014, + -21.308758830440155 + ], + [ + 0.433341036945041, + 4.5712500151373945, + -21.904985516455262 + ], + [ + -0.9129865755983382, + 4.217210746673089, + -21.308769493163638 + ], + [ + -0.9519350505814032, + 2.968138286759583, + -20.435823846050187 + ], + [ + -2.0274955572422986, + 2.638469154575205, + -19.817232820506998 + ], + [ + -2.0777537998515707, + 4.188413490269738, + -22.2418297386917 + ], + [ + -2.0805459020352615, + 2.9726781873242487, + -23.256905168779724 + ], + [ + -3.4400241714272846, + 2.991254765020514, + -24.03121581487278 + ], + [ + -3.2366485176151367, + 3.880014788327969, + -25.265901791879358 + ], + [ + -4.375364714386014, + 3.667800241797238, + -26.2249725563753 + ], + [ + 0.8226234553154714, + 4.00824771099505, + -22.647672421745707 + ], + [ + -1.1629069257814546, + 5.05328884051147, + -20.65561388601041 + ], + [ + -3.0241278423085074, + 4.111003571009945, + -21.706586988093516 + ], + [ + -2.078184313479944, + 5.178927032542504, + -22.696785301452216 + ], + [ + -1.2508403063574727, + 3.1446919699645974, + -23.942541612418953 + ], + [ + -2.0113723933174295, + 1.9943414205119439, + -22.781327569289925 + ], + [ + -3.7423580181453997, + 1.9681829922874101, + -24.254867567038847 + ], + [ + -4.2577596632982795, + 3.3171705329008603, + -23.388418790469306 + ], + [ + -3.2758924821542728, + 4.917162457688676, + -24.932906851029326 + ], + [ + -2.2974524067222912, + 3.736333676916928, + -25.80009867927285 + ], + [ + -5.286008637223473, + 3.7489420619552902, + -25.795732502212136 + ], + [ + -4.277540018479098, + 4.253149463542627, + -27.042217907363717 + ], + [ + -4.409784530435121, + 2.7117577096828995, + -26.548849842778363 + ], + [ + 0.0868404537177585, + 2.1572514020328697, + -20.27299699640749 + ], + [ + 0.07760305235606553, + 0.8204984905145309, + -19.630693202756056 + ], + [ + 1.127948740343053, + 0.8246705863530011, + -18.45868046443894 + ], + [ + 1.0724922091525615, + 1.7025963702310776, + -17.604227779991703 + ], + [ + 0.2336349029967416, + -0.3158533574006004, + -20.651161811761526 + ], + [ + 0.21664023842454214, + -1.7582654204180983, + -20.155040196701677 + ], + [ + -0.8802828807785629, + -2.257267555861816, + -19.62170805445191 + ], + [ + 1.2707471669818258, + -2.3766431163321187, + -20.135300126336986 + ], + [ + 1.021871291914868, + 2.4984914562693064, + -20.444381176558785 + ], + [ + -0.9200694321033931, + 0.7400041822842667, + -19.19910074845073 + ], + [ + -0.47376392758046004, + -0.30677975139066227, + -21.480381341321415 + ], + [ + 1.160166945324113, + -0.12822055681852795, + -21.193778612046398 + ], + [ + -1.7993776545120577, + -1.843443921836382, + -19.68585629856427 + ], + [ + -0.6936586541217481, + -3.0494042044273755, + -19.023553348111005 + ], + [ + 2.0084346964173156, + -0.177902694843179, + -18.385775123348616 + ], + [ + 3.053998763488064, + -0.32282006184137657, + -17.427483265677814 + ], + [ + 4.303035941814687, + -0.7926570385946121, + -18.121708183849425 + ], + [ + 4.325293567628585, + -1.7731824874301196, + -18.84298003929742 + ], + [ + 2.652639787139744, + -1.3487747602134945, + -16.34345789474472 + ], + [ + 1.4844420067777662, + -1.1002170091753456, + -15.390637174759993 + ], + [ + -0.17661493001613418, + -0.7687845118653378, + -16.04087997013004 + ], + [ + -0.7673373012307665, + -2.474793905077547, + -16.06468942088222 + ], + [ + 2.076235502044597, + -0.8816563189232411, + -19.107045431910482 + ], + [ + 3.2900122542345507, + 0.608977309551193, + -16.91352606550393 + ], + [ + 2.6167280719706305, + -2.3406204970581967, + -16.794070736949195 + ], + [ + 3.575826526156371, + -1.3251368187532222, + -15.764436126408139 + ], + [ + 1.3452756945570805, + -2.0187458982411073, + -14.82051599805513 + ], + [ + 1.820724929904567, + -0.30568504452555345, + -14.72450364555309 + ], + [ + -1.832975056320198, + -2.4757176120132556, + -16.29384830404026 + ], + [ + -0.3592265917863585, + -3.1194482730697217, + -16.84312733305651 + ], + [ + -0.6711936999378977, + -2.8884600757533576, + -15.060824845852006 + ], + [ + 5.5030385138888125, + -0.07157766557015588, + -17.92730288467081 + ], + [ + 6.873725979627701, + -0.490735065686156, + -18.26616561562781 + ], + [ + 7.788404251184406, + -0.6900452273007325, + -16.99774080473002 + ], + [ + 7.7189134844078255, + 0.15447396061360585, + -16.14068129001705 + ], + [ + 7.4385233394998265, + 0.37657774696387136, + -19.42294802990258 + ], + [ + 8.813540167476749, + -0.018364548820389737, + -19.92562884081428 + ], + [ + 9.288138952811623, + 0.5526566498771004, + -20.996270395710646 + ], + [ + 9.483901717132373, + -0.9498573639362604, + -19.4896703752448 + ], + [ + 5.3904308934338045, + 0.6859327411937493, + -17.26882435545378 + ], + [ + 6.774654872470247, + -1.4371438944608244, + -18.797761838256687 + ], + [ + 6.769024312266112, + 0.19872069844331008, + -20.26451486492354 + ], + [ + 7.402244638916257, + 1.4549565700334526, + -19.268403749016013 + ], + [ + 8.65123614417653, + 1.1778218551839288, + -21.46915683410644 + ], + [ + 10.189431873688807, + 0.22555732150979324, + -21.31372902144974 + ], + [ + 8.696688830547187, + -1.700820175842452, + -17.054472874388402 + ], + [ + 9.757888805888902, + -2.008489512231691, + -16.025607771131376 + ], + [ + 11.098298729190578, + -1.2153876933329073, + -16.19091823516393 + ], + [ + 11.811856261810325, + -0.8652187647340952, + -15.280448413658098 + ], + [ + 10.003893110165503, + -3.5073363080469164, + -16.034043225080296 + ], + [ + 10.720609342167023, + -4.038509942403323, + -17.264906334768444 + ], + [ + 10.680041932456124, + -3.8818758607303323, + -14.706863298403144 + ], + [ + 8.695332383582757, + -2.2343502970308293, + -17.912050643286783 + ], + [ + 9.393799961376898, + -1.753897227099614, + -15.030256762654941 + ], + [ + 9.018064088744342, + -3.970670750899444, + -16.073562364931515 + ], + [ + 11.78772225221835, + -3.8367757817895267, + -17.171778623802503 + ], + [ + 10.624163024879262, + -5.123539348092976, + -17.226083274762853 + ], + [ + 10.273913687310564, + -3.5828328622430092, + -18.148603921534196 + ], + [ + 10.082873761803569, + -3.5248129837582667, + -13.867817390416677 + ], + [ + 10.619875014862583, + -4.967415314989893, + -14.62886757320721 + ], + [ + 11.700284214023187, + -3.498824311561208, + -14.685017515103876 + ], + [ + 11.368939764750824, + -0.9049991385541389, + -17.445072669596406 + ], + [ + 12.721344244135889, + -0.43574903960738354, + -17.783587341170502 + ], + [ + 13.168444054778304, + 0.9196182544696612, + -17.297323425597476 + ], + [ + 14.381622855848136, + 1.1199716351657258, + -17.13536296888664 + ], + [ + 12.982539065107247, + -0.461973077560927, + -19.280556099251516 + ], + [ + 14.338218555181113, + -1.1213851955577283, + -19.54966353077686 + ], + [ + 14.32965042185733, + -1.8930712184202605, + -20.885155628221934 + ], + [ + 13.30447863192264, + -2.945979076396114, + -20.91237425785589 + ], + [ + 13.34478464979579, + -4.04924788918953, + -20.280382277196672 + ], + [ + 14.33303325119947, + -4.497015899444477, + -19.616448135911526 + ], + [ + 12.317606983838068, + -4.7949599715562385, + -20.298645606795056 + ], + [ + 10.738480726963797, + -1.156565083472266, + -18.192959151535224 + ], + [ + 13.3503945803379, + -1.2215782273624285, + -17.365414628916884 + ], + [ + 12.165079936694315, + -1.0750133122639554, + -19.66008212393243 + ], + [ + 12.958478903382302, + 0.5194779806485279, + -19.754135652893847 + ], + [ + 15.022470307057905, + -0.2845184922888375, + -19.689506661482206 + ], + [ + 14.72096342706799, + -1.8405896791123553, + -18.825542839422884 + ], + [ + 14.171578233845684, + -1.1228261705725586, + -21.6400306603938 + ], + [ + 15.291004989274834, + -2.3897246719068335, + -21.016427399215413 + ], + [ + 12.470691642915822, + -2.7317514575257746, + -21.440587866352576 + ], + [ + 15.178644569066243, + -3.962850656567099, + -19.756837601676466 + ], + [ + 14.310027673177775, + -5.437660584257486, + -19.249355172177516 + ], + [ + 11.454316785824709, + -4.558544459407443, + -20.766555630113018 + ], + [ + 12.395701057947967, + -5.5575184859920626, + -19.640995897176104 + ], + [ + 12.30239790041682, + 1.8851521972994902, + -16.979079658898396 + ], + [ + 12.649906740075526, + 3.0777458512627334, + -16.27291338362228 + ], + [ + 13.180291705128276, + 2.901614411785829, + -14.786907378478288 + ], + [ + 14.143157214205907, + 3.4924914361270396, + -14.377262347229298 + ], + [ + 11.350832872271086, + 3.907980825562305, + -16.19611027288665 + ], + [ + 10.634808221552406, + 3.5202783514841087, + -17.41697528156637 + ], + [ + 11.057938694161624, + 2.053762469149902, + -17.61073905839958 + ], + [ + 13.373093912178687, + 3.62762152667824, + -16.875192215001032 + ], + [ + 10.775772833591427, + 3.6883450138028593, + -15.296571877828502 + ], + [ + 11.580900989865057, + 4.968966924105388, + -16.09876480853521 + ], + [ + 9.568517132661892, + 3.7444952345229296, + -17.387791256807137 + ], + [ + 11.059606448951087, + 4.000319128902618, + -18.298573396162986 + ], + [ + 10.33375171756641, + 1.504241622856192, + -17.00934061687306 + ], + [ + 11.025311222524556, + 1.694979592887961, + -18.639479299488166 + ], + [ + 12.718486706075275, + 1.8608267439279444, + -14.089782137200682 + ], + [ + 13.298008058484257, + 1.4542393995978387, + -12.800129604039412 + ], + [ + 14.670910568927662, + 0.7538983716698162, + -12.909902075921865 + ], + [ + 15.57571251051857, + 1.102423642410649, + -12.199771692186056 + ], + [ + 12.234498707292797, + 0.6147060388933276, + -12.107034002130469 + ], + [ + 12.727410166639505, + -0.08856737806792125, + -10.802528775420097 + ], + [ + 11.534395251728512, + -0.18355024129200181, + -9.916595036108996 + ], + [ + 13.22300499883961, + -1.54534609369054, + -10.994468556599516 + ], + [ + 12.057654247746644, + 1.2074887697648151, + -14.485445526157628 + ], + [ + 13.46934060753478, + 2.2905453957811517, + -12.1223855376565 + ], + [ + 11.442693320611157, + 1.3438979817391328, + -11.935501582408122 + ], + [ + 11.973511560097506, + -0.2081754262471165, + -12.772506460491659 + ], + [ + 13.528701509680214, + 0.35452460972734023, + -10.21117141542704 + ], + [ + 11.429411805687284, + 0.8065549840761719, + -9.473008916475955 + ], + [ + 10.650852218243383, + -0.4003306639864306, + -10.516977179160914 + ], + [ + 11.687283431878397, + -0.8213141974948286, + -9.045974496312931 + ], + [ + 14.250095306196718, + -1.541342583148321, + -11.359391768079824 + ], + [ + 13.182630425316063, + -2.1275290728407157, + -10.073852324109504 + ], + [ + 12.628911237929032, + -2.1094722998078907, + -11.713435623771081 + ], + [ + 14.807711357030154, + -0.09506154002086609, + -13.918530701537316 + ], + [ + 16.053812749033202, + -0.7946053792536283, + -14.281349697584663 + ], + [ + 17.17588987981912, + 0.05953896322342178, + -14.835870530636505 + ], + [ + 18.33842289216357, + -0.3232145250931513, + -14.763792545699634 + ], + [ + 15.734616858223703, + -1.787575457097546, + -15.39861591065708 + ], + [ + 14.792123681621998, + -3.016933388565093, + -15.122933588078128 + ], + [ + 14.744130012788606, + -3.9103265806913896, + -16.361403279512466 + ], + [ + 15.133618236713225, + -3.8372932449905193, + -13.972356090958026 + ], + [ + 13.974294352948254, + -0.329298620142227, + -14.438769269349507 + ], + [ + 16.49812870378025, + -1.3327373034201386, + -13.444034917229205 + ], + [ + 15.444611081773955, + -1.2243286652512637, + -16.28560716615074 + ], + [ + 16.658281675620206, + -2.1586074990339625, + -15.842777312411075 + ], + [ + 13.780148265764632, + -2.635639692328752, + -14.986482494894583 + ], + [ + 15.762467942604086, + -4.0267070204470485, + -16.732265995090962 + ], + [ + 14.199966403731823, + -4.820510790275534, + -16.10930419807213 + ], + [ + 14.133670128222318, + -3.393202111266305, + -17.101690969794983 + ], + [ + 16.13081434010281, + -4.19876587623952, + -14.223428015087993 + ], + [ + 15.195354752391564, + -3.251863047668806, + -13.05498830287219 + ], + [ + 14.485129984991088, + -4.710253274821213, + -13.898170689228158 + ], + [ + 16.767476300221567, + 1.2473856313416434, + -15.293919936570418 + ], + [ + 17.647182392454553, + 2.3223020655968156, + -15.680528252637213 + ], + [ + 18.07852653935647, + 3.1866408306942304, + -14.475145002053862 + ], + [ + 19.263189445485548, + 3.4436169197201707, + -14.33837868251134 + ], + [ + 16.954160956718198, + 3.1610392802885627, + -16.804600380284317 + ], + [ + 16.78045571084537, + 2.521759544223741, + -18.1283055543358 + ], + [ + 15.943941669990568, + 3.1145887628809135, + -19.001532109990016 + ], + [ + 17.37647973960834, + 1.4658697362595134, + -18.362239486432156 + ], + [ + 15.808709862613773, + 1.3027385840981935, + -15.606645621626507 + ], + [ + 18.56940486804728, + 1.963665725859741, + -16.137675405606217 + ], + [ + 15.988599572794808, + 3.511654745288382, + -16.440109577059797 + ], + [ + 17.498244953867673, + 4.100152453538755, + -16.905298940127572 + ], + [ + 15.384040185432601, + 3.8720159623620987, + -18.636958610606598 + ], + [ + 15.932568432243976, + 2.772188709123398, + -19.951650726647166 + ], + [ + 17.075305070549682, + 3.5752824263359173, + -13.723494944055066 + ], + [ + 17.35287758416489, + 4.299965834457765, + -12.462593264542745 + ], + [ + 18.44635776596179, + 3.665657803657382, + -11.609567295333553 + ], + [ + 19.469697002657625, + 4.303052272207879, + -11.452347530397814 + ], + [ + 16.124857006156866, + 4.456817672138413, + -11.634038632971034 + ], + [ + 16.36227029730147, + 5.440298631948821, + -10.528579630546433 + ], + [ + 16.24507843223271, + 6.878416672348919, + -10.727234045293239 + ], + [ + 16.83372691402142, + 5.0312900203256845, + -9.28277097689316 + ], + [ + 16.48387631366096, + 7.789187808520012, + -9.710814612745834 + ], + [ + 17.048773000833066, + 5.936031890693357, + -8.245784136901364 + ], + [ + 16.822500213474445, + 7.264420025177401, + -8.412886555110303 + ], + [ + 16.87889972776065, + 8.22053358165266, + -7.39137911867264 + ], + [ + 16.144455140048702, + 3.222311059869739, + -13.893855012723956 + ], + [ + 17.62407973533209, + 5.337435064661321, + -12.658060948362241 + ], + [ + 15.302416732955768, + 4.819618302839132, + -12.250534748594788 + ], + [ + 15.824472423797124, + 3.475197784730369, + -11.267581752619677 + ], + [ + 16.079638476501277, + 7.196776736031666, + -11.745898216774336 + ], + [ + 16.944999534006786, + 3.964242265748652, + -9.158561035177103 + ], + [ + 16.11002273393691, + 8.78971734665754, + -9.870720135095201 + ], + [ + 17.389664989080632, + 5.519750306463209, + -7.309354471442985 + ], + [ + 16.930143449868325, + 7.744397973353557, + -6.559353687515269 + ], + [ + 18.325888056937565, + 2.4087123713845813, + -11.220399786041707 + ], + [ + 19.39198405556821, + 1.7657979051130894, + -10.399187265539341 + ], + [ + 20.552278643942177, + 1.1958903355289934, + -11.19791008353382 + ], + [ + 21.46899558111069, + 0.5686590822946727, + -10.633525548713534 + ], + [ + 18.765861472848673, + 0.6319038366710359, + -9.593626545583286 + ], + [ + 17.841349044506487, + 1.0233275775055404, + -8.450703286835292 + ], + [ + 16.446027887165307, + 0.7229299454311544, + -8.602497881749933 + ], + [ + 18.333705468076577, + 1.7661401488742285, + -7.315221273039818 + ], + [ + 15.622504298821607, + 1.066083559853162, + -7.5170497235282046 + ], + [ + 17.462692349637404, + 1.9599724590918726, + -6.211118674892556 + ], + [ + 16.072189924891333, + 1.621464208605623, + -6.340601082441894 + ], + [ + 17.47979751938425, + 1.8794770776913197, + -11.375784637381326 + ], + [ + 19.87464058246504, + 2.485284827575498, + -9.737762420433096 + ], + [ + 18.19473200455522, + -0.05693197039731457, + -10.21605667255423 + ], + [ + 19.53459018071022, + -0.025487780635565893, + -9.187431986445516 + ], + [ + 15.988773087830435, + 0.24249797305220433, + -9.45484714739513 + ], + [ + 19.3725405291927, + 2.059950369034169, + -7.285235782695915 + ], + [ + 14.593213040715815, + 0.7448213022466739, + -7.5782804684819745 + ], + [ + 17.749891410951413, + 2.4848108765516628, + -5.311974106001946 + ], + [ + 15.445047924180814, + 1.8298411957451322, + -5.486392246076909 + ], + [ + 20.58502945590875, + 1.245959388028048, + -12.579982492156693 + ], + [ + 21.817993661833196, + 0.8215324413071627, + -13.261026539003787 + ], + [ + 23.253962605481497, + 1.1456253806717953, + -12.664929301069662 + ], + [ + 24.038293283487334, + 0.15224766884983332, + -12.517143987093402 + ], + [ + 21.87570442475698, + 1.3846981600161854, + -14.716765282195157 + ], + [ + 22.00195460280335, + 0.27435015502355675, + -15.752500226195995 + ], + [ + 21.99484589162427, + 0.6874366917923354, + -17.273380006270227 + ], + [ + 22.9218386283198, + 1.3671220697117334, + -17.71703413723429 + ], + [ + 21.165279836465572, + 0.1394976375284882, + -18.057062744454875 + ], + [ + 19.80135131366775, + 1.600520022130759, + -13.109354352402098 + ], + [ + 21.794318436665115, + -0.2663179632178032, + -13.196822029120248 + ], + [ + 20.99401420585109, + 1.9984647358827488, + -14.901197584582404 + ], + [ + 22.65861448331842, + 2.1427066275500692, + -14.74067480309414 + ], + [ + 22.891853989275933, + -0.34238671229960893, + -15.626734046158118 + ], + [ + 21.166327287834466, + -0.3527966836114693, + -15.441841168564602 + ], + [ + 23.589142862349718, + 2.37152663063965, + -12.232400377150368 + ], + [ + 24.82969803047331, + 2.729333897548287, + -11.546215364464025 + ], + [ + 25.04857643195355, + 2.0296760400699156, + -10.185573563744205 + ], + [ + 26.130008969150715, + 1.9227687671348406, + -9.675320548714163 + ], + [ + 24.67415768563298, + 4.270757651394803, + -11.259139641126964 + ], + [ + 23.797233138444728, + 4.6838747491265735, + -12.423220310978744 + ], + [ + 22.74300536687849, + 3.5465632186808307, + -12.376365990625471 + ], + [ + 25.67621008592307, + 2.534630953543754, + -12.204703316211921 + ], + [ + 24.1553707737865, + 4.324843482723281, + -10.30204108913588 + ], + [ + 25.58066887599694, + 4.868481111933761, + -11.354326399287368 + ], + [ + 23.394654498714658, + 5.667116489523551, + -12.1797714612617 + ], + [ + 24.409180598700317, + 4.609843560179144, + -13.322184256025473 + ], + [ + 21.936290381627764, + 3.562995602140404, + -11.64353738059041 + ], + [ + 22.152421412128486, + 3.592372760743359, + -13.29135954026482 + ], + [ + 24.02079934143239, + 1.4187593166852892, + -9.650162200971206 + ], + [ + 24.216971819853704, + 0.47027161072013257, + -8.523601072226649 + ], + [ + 24.26799239616065, + -0.9809812535253712, + -8.952755955789417 + ], + [ + 24.985834890616292, + -1.76403829608347, + -8.37962838468412 + ], + [ + 22.939327846557532, + 0.6422454909379312, + -7.59965135658075 + ], + [ + 23.11479241708964, + -0.12081038914620734, + -6.314474495645082 + ], + [ + 24.333106818160292, + 0.1806712180904011, + -5.451935991358776 + ], + [ + 21.874678963112277, + 0.07462876796900408, + -5.40456614272189 + ], + [ + 23.11121297470067, + 1.5586212101609505, + -10.066324336970787 + ], + [ + 25.1564024462477, + 0.6045768235631144, + -7.987381242985694 + ], + [ + 22.92984328200173, + 1.710708562003802, + -7.384250906435292 + ], + [ + 22.001634600153725, + 0.3111954324944186, + -8.046012092445961 + ], + [ + 23.209245530002185, + -1.163726934173937, + -6.6169683780782576 + ], + [ + 24.295574655889578, + 1.2430233892402143, + -5.21089730640285 + ], + [ + 24.42121297691314, + -0.46553434438329333, + -4.57857671778541 + ], + [ + 25.27840829094984, + 0.05601417809331055, + -5.9801121994095965 + ], + [ + 20.957336146077775, + -0.23982297415661336, + -5.902263054129309 + ], + [ + 22.080348389007117, + -0.553117869198875, + -4.537541311503377 + ], + [ + 21.787532773540146, + 1.1237983652931263, + -5.122168642828283 + ], + [ + 23.485244645323885, + -1.2929943929992618, + -9.972924852599183 + ], + [ + 23.173038831620502, + -2.6993741050395386, + -10.30282434859105 + ], + [ + 24.342043674648494, + -3.4593230595771445, + -10.920866647889802 + ], + [ + 24.51831842079947, + -4.614600241142114, + -10.645174231114646 + ], + [ + 21.969876792675013, + -2.7112732220780487, + -11.243284395002407 + ], + [ + 21.274052008393298, + -4.024811606595449, + -11.63389253614643 + ], + [ + 21.25201112772354, + -5.161798064004671, + -10.823933015008272 + ], + [ + 20.49407184081552, + -4.0009946408188455, + -12.834059812466432 + ], + [ + 20.572617149816985, + -6.261960341495296, + -11.141556220720528 + ], + [ + 19.66713763221552, + -5.115402766086419, + -13.11036868670055 + ], + [ + 19.79851561632326, + -6.269465899372136, + -12.323739503353274 + ], + [ + 22.84641402838723, + -0.6119411132055959, + -10.357848793084782 + ], + [ + 22.987993092962242, + -3.2106685280911478, + -9.358137098423695 + ], + [ + 21.190748865767407, + -2.003187270518353, + -10.96102343526154 + ], + [ + 22.323398560031336, + -2.209179965959322, + -12.143853036200506 + ], + [ + 21.843548833343025, + -5.143575242259914, + -9.920521902451984 + ], + [ + 20.507578890042854, + -3.1116018372848373, + -13.446593452699297 + ], + [ + 20.697624776735786, + -7.172896160525227, + -10.5750135910029 + ], + [ + 19.11670975583643, + -5.0350082626929975, + -14.036090820543349 + ], + [ + 19.402218486926866, + -7.234269793722888, + -12.603919620864456 + ], + [ + 25.24244207955025, + -2.762283737603042, + -11.657998901186032 + ], + [ + 26.520034568361968, + -3.301014832253884, + -12.226354601268481 + ], + [ + 27.43416339448621, + -3.735501287016689, + -11.161824330032546 + ], + [ + 28.089020569702683, + -4.791548070525863, + -11.253219396713527 + ], + [ + 27.259824237169113, + -2.313685874032174, + -13.091566417109986 + ], + [ + 26.512804038956403, + -2.064340025758426, + -14.441702813543852 + ], + [ + 27.45382211024635, + -1.047311665164365, + -12.478310148770094 + ], + [ + 24.860390267021373, + -1.863914157287411, + -11.916974816833344 + ], + [ + 26.319243302970136, + -4.179753591406069, + -12.83921830105174 + ], + [ + 28.26046853693338, + -2.710608051620966, + -13.26262822653291 + ], + [ + 27.22873258656215, + -0.3103404084571828, + -13.050853154275332 + ], + [ + 25.477563857372754, + -1.7513442525438876, + -14.306035325790548 + ], + [ + 26.95659539959359, + -1.191551605612979, + -14.920647453842518 + ], + [ + 26.65935467992991, + -2.9561862916941237, + -15.050995017216383 + ], + [ + 27.540025529688254, + -2.874632764388977, + -10.11584236511294 + ], + [ + 28.505048356659312, + -2.952534585884706, + -8.99814920680821 + ], + [ + 27.94351578716712, + -3.968726166336438, + -7.976786827819452 + ], + [ + 28.595032461656892, + -4.835350589026774, + -7.4922968721034735 + ], + [ + 28.68738261441209, + -1.548622287459871, + -8.212229600622686 + ], + [ + 29.456034782102574, + -1.5119844489277554, + -6.9262680204079965 + ], + [ + 30.71808301134095, + -1.112027053079899, + -6.821575843597235 + ], + [ + 29.00094504173935, + -1.8161836404082266, + -5.538220950536086 + ], + [ + 30.167180649121956, + -1.7011815415469158, + -4.724333732808898 + ], + [ + 27.764799632292796, + -2.2322720539864207, + -4.879221735757106 + ], + [ + 31.224157357968977, + -1.3634539736651803, + -5.551526818109326 + ], + [ + 30.11996429147054, + -1.8746774699168043, + -3.3056822113095086 + ], + [ + 27.748752830325003, + -2.506125404337041, + -3.472706791588523 + ], + [ + 28.865293222634108, + -2.1781553934023776, + -2.7058878542483726 + ], + [ + 26.978961112571763, + -2.0349597452055406, + -10.131900126759216 + ], + [ + 29.457817555882293, + -3.3712329496048596, + -9.322220120746433 + ], + [ + 29.26961998314266, + -0.8940144601624809, + -8.860757777177312 + ], + [ + 27.738487749984415, + -1.0627891221889243, + -7.984928210811392 + ], + [ + 31.260256419086396, + -0.7550953467853851, + -7.684735721653249 + ], + [ + 32.19506817221912, + -1.3050610221637342, + -5.279440341289834 + ], + [ + 26.81736899950356, + -2.2381214174250914, + -5.397617967865967 + ], + [ + 31.062452883729495, + -1.951079584714634, + -2.783883635330584 + ], + [ + 26.771579399768214, + -2.7665649065672113, + -3.0936274793645335 + ], + [ + 28.874209524059964, + -2.342718057167801, + -1.638536092993332 + ], + [ + 26.641038272234294, + -3.917101212040734, + -7.717636050868498 + ], + [ + 25.920106750103713, + -5.0119951990235165, + -7.037138301229284 + ], + [ + 26.03356788216183, + -6.412448474486212, + -7.807211683135524 + ], + [ + 26.222378809989316, + -7.458190091518304, + -7.174210541167195 + ], + [ + 24.499358808213245, + -4.473432689668925, + -6.694900745428482 + ], + [ + 23.513280070510284, + -5.462777061692691, + -6.006191870251888 + ], + [ + 23.722708272648, + -5.408736108394464, + -4.5209066413298045 + ], + [ + 22.084438473546864, + -4.9258313321583955, + -6.190170682137027 + ], + [ + 26.051100508986114, + -3.180758491659418, + -8.078017567016328 + ], + [ + 26.349148537992466, + -5.194846245482239, + -6.051952767518122 + ], + [ + 24.624847074998904, + -3.524416886360825, + -6.173630763707403 + ], + [ + 24.078644811265978, + -4.1515272615962715, + -7.6475161526874755 + ], + [ + 23.666972178587894, + -6.442545242548164, + -6.458445696204394 + ], + [ + 23.248713606022704, + -6.263182584893116, + -4.037844929041718 + ], + [ + 24.780821411584146, + -5.604988905417656, + -4.347752799272294 + ], + [ + 23.463128990056425, + -4.44593923760533, + -4.080748414769249 + ], + [ + 22.133816712557433, + -3.8388296346001027, + -6.126223831381837 + ], + [ + 21.531383508106085, + -5.2667053377654724, + -7.06540579390475 + ], + [ + 21.475175920064967, + -5.246955492260923, + -5.345317136619051 + ], + [ + 26.048534514816378, + -6.474534692755526, + -9.166802924628504 + ], + [ + 26.487694620834006, + -7.695876627532584, + -9.847563584986858 + ], + [ + 27.933326052113113, + -8.068434522497569, + -9.611490363504732 + ], + [ + 28.09777485271729, + -9.234178431448527, + -9.235013597121394 + ], + [ + 26.23826953954106, + -7.516537774745757, + -11.371249977239255 + ], + [ + 24.773548996752083, + -7.824006916095698, + -11.770067296092906 + ], + [ + 24.41655554197062, + -7.278357970642446, + -13.147036101692999 + ], + [ + 22.91874543952921, + -7.422401618489175, + -13.468098921760435 + ], + [ + 22.64556230685867, + -7.0787412725690615, + -14.822524121746119 + ], + [ + 26.146199970244673, + -5.61060607383024, + -9.680798461768285 + ], + [ + 25.901582930666105, + -8.594550988210187, + -9.655328672622254 + ], + [ + 26.45970312909803, + -6.5215598440722715, + -11.757363431973827 + ], + [ + 26.94895027268563, + -8.191375349788586, + -11.848349489146175 + ], + [ + 24.5410075138997, + -8.879351651114234, + -11.627686030288912 + ], + [ + 24.101992550907156, + -7.291818257768114, + -11.096355177908091 + ], + [ + 24.768825367941318, + -6.25355527179471, + -13.264446454875758 + ], + [ + 24.92754229554354, + -7.777859813196926, + -13.970136640415747 + ], + [ + 22.630993832474058, + -8.469063430263304, + -13.369103392107851 + ], + [ + 22.407380915497416, + -6.7306126358108145, + -12.798745059657263 + ], + [ + 23.043062951819177, + -6.165142430248352, + -14.988142061898056 + ], + [ + 23.138621277104033, + -7.765649086530971, + -15.37492661691328 + ], + [ + 21.679112754966017, + -7.0829168806012035, + -15.11587966552005 + ], + [ + 28.93133532750987, + -7.159014410158932, + -9.679942321058872 + ], + [ + 30.29444737510338, + -7.490237688043123, + -9.309811006782715 + ], + [ + 30.484030936019508, + -7.88007791733628, + -7.8245042941847585 + ], + [ + 31.316177388389324, + -8.730767127093486, + -7.548793968180526 + ], + [ + 31.0455509694959, + -6.225245039580528, + -9.611556921548797 + ], + [ + 32.51173419263815, + -6.537803739804787, + -9.874498521952978 + ], + [ + 33.410137715328105, + -6.420831300293543, + -9.016520383978856 + ], + [ + 32.70669999826154, + -6.967737220837591, + -11.050575294415887 + ], + [ + 28.717094568212975, + -6.268112534077233, + -10.10478978498883 + ], + [ + 30.696604541360763, + -8.337951679516493, + -9.864561977782643 + ], + [ + 30.51193163910073, + -5.715139494086856, + -10.41351717478683 + ], + [ + 30.99027055974999, + -5.66463024664759, + -8.678413914264084 + ], + [ + 29.65190948573906, + -7.380258416376364, + -6.909179779514547 + ], + [ + 29.69113681503827, + -7.756713285342187, + -5.4800185987245795 + ], + [ + 29.039145775382213, + -9.158008316554913, + -5.205332963843604 + ], + [ + 29.373063346468918, + -9.82574111404324, + -4.236703105261407 + ], + [ + 29.042401778334767, + -6.630454238138157, + -4.7180521049175805 + ], + [ + 29.99935114562022, + -5.421364786107375, + -4.527862229340126 + ], + [ + 31.304644686105355, + -5.826839740652844, + -3.7093829968364456 + ], + [ + 32.42912109243371, + -5.727958610745532, + -4.360733415538743 + ], + [ + 31.260306783853004, + -6.2329656217588365, + -2.5308234637300857 + ], + [ + 29.07597834904401, + -6.619936388822055, + -7.241317016300898 + ], + [ + 30.73565072733716, + -7.7842239081304, + -5.16964062498145 + ], + [ + 28.172720152045166, + -6.178391985753706, + -5.194913938564563 + ], + [ + 28.61080471778492, + -7.02188510092094, + -3.796851668783973 + ], + [ + 30.249110226716937, + -4.953814149873608, + -5.480288794301981 + ], + [ + 29.472506430293933, + -4.695617963790426, + -3.908323762111834 + ], + [ + 32.37124636396299, + -5.454338431030351, + -5.33123956086822 + ], + [ + 33.278328962291866, + -6.063636911180652, + -3.9291554698270965 + ], + [ + 28.388796821108368, + -9.760853726198718, + -6.231149070908688 + ], + [ + 27.906249611007727, + -11.123386627073444, + -6.194705297986866 + ], + [ + 28.762956455054738, + -12.127369822321668, + -6.994379888222139 + ], + [ + 28.356222661419682, + -13.282632564868209, + -7.252808591298111 + ], + [ + 26.453625047576406, + -11.223587171070164, + -6.5850820445482015 + ], + [ + 25.49070326243929, + -10.74210678448992, + -5.6020713074016175 + ], + [ + 25.05589203200397, + -9.511877438748002, + -5.790706191119301 + ], + [ + 25.034781550785592, + -11.422025333044758, + -4.689841390476309 + ], + [ + 28.077244904592025, + -9.16289416819626, + -6.983132382717713 + ], + [ + 28.065506553017595, + -11.549245573203109, + -5.204059451432248 + ], + [ + 26.247282856752165, + -10.798238663754148, + -7.567221746192757 + ], + [ + 26.24319321436581, + -12.282024197494934, + -6.7384750964854945 + ], + [ + 25.52573608859597, + -8.95412001048902, + -6.489455606085762 + ], + [ + 24.37106418410077, + -9.073686009905089, + -5.191452574089802 + ], + [ + 29.9469933984008, + -11.71380745648105, + -7.536336417228287 + ], + [ + 30.697394706326904, + -12.465665097286092, + -8.63126045291549 + ], + [ + 30.854822266389384, + -13.96058584594175, + -8.360449189186657 + ], + [ + 30.615231402265863, + -14.773170095821342, + -9.232557270938008 + ], + [ + 32.166396986110946, + -11.92859058731716, + -8.838373820948064 + ], + [ + 33.04104245666146, + -11.637205732009534, + -7.5759689297029755 + ], + [ + 34.51481820893575, + -11.24644530797434, + -7.859844015954071 + ], + [ + 34.68370935328567, + -9.882245285836689, + -8.585465637043601 + ], + [ + 34.096482974094236, + -8.755720092401077, + -7.837825774168266 + ], + [ + 30.09600711641627, + -10.732048642301095, + -7.351821420884207 + ], + [ + 30.121629085902168, + -12.406342585192817, + -9.55488463437631 + ], + [ + 32.66502551814582, + -12.656736237912014, + -9.478119888251252 + ], + [ + 32.11446952300318, + -11.002571067197664, + -9.41099098859687 + ], + [ + 32.626178955655476, + -10.808946952016015, + -7.001534062984955 + ], + [ + 32.99395727367363, + -12.509615127921222, + -6.924211109817008 + ], + [ + 35.199980074923516, + -11.27988373319323, + -7.0127677112417555 + ], + [ + 34.93293789565595, + -11.967901400355458, + -8.56182381043405 + ], + [ + 35.74805387615532, + -9.70593238302007, + -8.740980163653596 + ], + [ + 34.260991094592356, + -9.959150619938953, + -9.587209591864882 + ], + [ + 33.10909451321244, + -8.881689991612234, + -7.666666381533103 + ], + [ + 34.40721065582102, + -8.823759088700513, + -6.879223253719116 + ], + [ + 34.26083483696845, + -7.838199300480085, + -8.226725563334993 + ], + [ + 31.164454169875874, + -14.375460211240693, + -7.093317610177582 + ], + [ + 31.231607421121446, + -15.8091283022585, + -6.751658374430702 + ], + [ + 30.323213669044346, + -16.063729562996627, + -5.538588775646057 + ], + [ + 30.663468805650286, + -16.826301735963398, + -4.624022500630544 + ], + [ + 32.689248993984165, + -16.184344537589368, + -6.506956864236735 + ], + [ + 32.8575346997009, + -17.729541167926982, + -6.366767593636349 + ], + [ + 33.27129926051638, + -18.374815438102246, + -5.302456218053852 + ], + [ + 32.66938418869957, + -18.331737211985228, + -7.360046758756716 + ], + [ + 31.48405125659749, + -13.718208580156784, + -6.396193257767285 + ], + [ + 30.87288293505328, + -16.45490052344769, + -7.553153414248952 + ], + [ + 33.257890295990045, + -15.863824865042147, + -7.379888445140772 + ], + [ + 33.20169206538223, + -15.732595260685457, + -5.657590232665053 + ], + [ + 33.53660564782896, + -17.848476533457074, + -4.482289566884295 + ], + [ + 33.543461561804385, + -19.331006262838287, + -5.480575139005469 + ], + [ + 29.071280487908872, + -15.540851339849496, + -5.547735666830894 + ], + [ + 28.04691566211584, + -15.800155818158032, + -4.47936336888485 + ], + [ + 26.803383735064003, + -16.4272494129126, + -5.078265283754963 + ], + [ + 26.465841616556006, + -16.242286367325846, + -6.2671467374594405 + ], + [ + 27.719344959444992, + -14.393422350166247, + -3.798779892166505 + ], + [ + 28.711085397247714, + -13.985559884411373, + -2.8115553853241835 + ], + [ + 28.850571058031484, + -14.778107459636544, + -6.171922749893179 + ], + [ + 28.404713032096833, + -16.519218935917365, + -3.742461023187049 + ], + [ + 27.366558315801115, + -13.630630079729372, + -4.492890062540164 + ], + [ + 26.795107301506107, + -14.516044738564347, + -3.2341115917327543 + ], + [ + 28.373277865832975, + -13.175908706491555, + -2.4217458107896634 + ], + [ + 26.09575793632921, + -17.161758377953447, + -4.2448158087204115 + ], + [ + 24.886228728834173, + -17.81385879165191, + -4.685818472101392 + ], + [ + 23.717684354212807, + -16.799490429959633, + -4.608601326510568 + ], + [ + 23.075227632274743, + -16.646173029844135, + -3.5904549937775982 + ], + [ + 24.710608207396497, + -18.99245889041697, + -3.7345536349171904 + ], + [ + 23.599528155272154, + -19.97946960486763, + -4.067215259521435 + ], + [ + 22.239978252021576, + -19.64125472011392, + -3.723912722468144 + ], + [ + 23.800077631275713, + -21.24292742469561, + -4.704787242513031 + ], + [ + 21.204538357126168, + -20.53999854417748, + -4.053766940761924 + ], + [ + 22.742095691137823, + -22.06526152420838, + -5.097451583570908 + ], + [ + 21.415452697693233, + -21.681519243617117, + -4.846398377713382 + ], + [ + 26.31706515789996, + -17.107018107870772, + -3.2608812026271368 + ], + [ + 24.970355936116032, + -18.111916034448655, + -5.730893933715869 + ], + [ + 25.582770237520617, + -19.63809842873411, + -3.8374238462499024 + ], + [ + 24.569491368685625, + -18.741802213416122, + -2.6831946591387816 + ], + [ + 21.981863163612157, + -18.674016875548546, + -3.31866296955816 + ], + [ + 24.806096358244034, + -21.512674825521913, + -4.990367254351937 + ], + [ + 20.16384257518222, + -20.32161970750883, + -3.8649103974233894 + ], + [ + 22.967456838041354, + -22.982043974970793, + -5.621975044108465 + ], + [ + 20.5799596260039, + -22.30114981706265, + -5.136926194159591 + ], + [ + 23.557099001473667, + -16.095030233000557, + -5.681963638839452 + ], + [ + 22.489399857351724, + -15.131551216151593, + -5.962773274445399 + ], + [ + 21.18849742236927, + -15.82445551544265, + -5.902339651268523 + ], + [ + 21.134676658706592, + -17.045223791919966, + -6.243026284165707 + ], + [ + 22.65019740815226, + -14.583872222755986, + -7.316946404862026 + ], + [ + 21.517510189193683, + -13.56599635031671, + -7.6060998414382155 + ], + [ + 23.972304124275418, + -13.85404306066107, + -7.611833397197238 + ], + [ + 24.24862028490686, + -16.200481896780502, + -6.410508534399594 + ], + [ + 22.465107902459096, + -14.30394102125615, + -5.253849504687243 + ], + [ + 22.692577945164025, + -15.467396540907998, + -7.9538842514676125 + ], + [ + 21.63453643215991, + -12.90132462473531, + -8.462030058810475 + ], + [ + 20.551710039546645, + -14.05574912372549, + -7.730479824022989 + ], + [ + 21.552304270729095, + -12.897887357861748, + -6.7455655932998155 + ], + [ + 23.89656872274159, + -13.613400038062537, + -8.67223725928661 + ], + [ + 23.995418993194427, + -13.213403325157742, + -6.730274375540157 + ], + [ + 24.882148085363223, + -14.437451210037125, + -7.470682250230145 + ], + [ + 20.126380342948746, + -15.10238127697528, + -5.434913878168238 + ], + [ + 18.84279535051847, + -15.61365521223047, + -5.1362025084052645 + ], + [ + 18.901564563644943, + -16.496572311120985, + -3.8096406786059562 + ], + [ + 19.464222640326238, + -16.066345757038448, + -2.8000544071202 + ], + [ + 20.23277163795946, + -14.099726471422514, + -5.376058536311271 + ], + [ + 18.185885510255698, + -14.783218091672893, + -4.877472086225333 + ], + [ + 18.497332904964097, + -16.222455741366844, + -5.971734999781118 + ], + [ + 18.074037180690286, + -17.559749238027848, + -3.75323476559001 + ], + [ + 17.830369059158247, + -18.494201925397306, + -2.6868929104437314 + ], + [ + 17.587378437528326, + -19.91565070438685, + -3.030558647021265 + ], + [ + 16.89883396330041, + -20.206852145136054, + -4.010364248449851 + ], + [ + 16.779055495631606, + -17.88019866670163, + -1.7661125885579116 + ], + [ + 15.443705401968638, + -17.736701360092752, + -2.353955415712809 + ], + [ + 14.561568866594737, + -18.743801822346654, + -2.6123140557330804 + ], + [ + 14.799645479785505, + -16.537583806383964, + -2.920148767190283 + ], + [ + 13.490195122454832, + -16.920038282628866, + -3.3872675247687707 + ], + [ + 15.15836210688719, + -15.175345929777677, + -2.980583158927895 + ], + [ + 13.397634093805264, + -18.29579888535943, + -3.1866345678106054 + ], + [ + 12.61908594959652, + -16.004877684855387, + -3.944364662542987 + ], + [ + 14.254751095500582, + -14.282853810450092, + -3.4872645102273214 + ], + [ + 13.009150077372013, + -14.661460483405563, + -3.932301523784128 + ], + [ + 17.614779627706287, + -17.738601066625506, + -4.634822276161197 + ], + [ + 18.66572169918615, + -18.61744558183159, + -1.9976184944398472 + ], + [ + 16.718894005565133, + -18.490422805006347, + -0.8649415166807806 + ], + [ + 17.123518889189516, + -16.900279461518267, + -1.435652099956736 + ], + [ + 14.757619593963469, + -19.758446476607787, + -2.2985360031571838 + ], + [ + 12.56019135932415, + -18.84840587672045, + -3.3024549470364652 + ], + [ + 16.117801297158625, + -14.865835813660624, + -2.5931882523853944 + ], + [ + 11.617657309182519, + -16.260560701244458, + -4.2576835026252455 + ], + [ + 14.486704090956925, + -13.229706147695197, + -3.4283131761055787 + ], + [ + 12.409364897523593, + -13.845225113082165, + -4.307029183412201 + ], + [ + 17.970872591713636, + -20.82446437795147, + -2.172331856437983 + ], + [ + 17.505243229354026, + -22.201133468111834, + -2.264643737796332 + ], + [ + 16.09205981972278, + -22.292753332724374, + -1.6763155246745263 + ], + [ + 15.62728414473532, + -21.47156186688619, + -0.8980633737608819 + ], + [ + 18.49277538806624, + -23.242528550353086, + -1.72526503130234 + ], + [ + 19.713673212069033, + -23.065084721174117, + -2.3887143794875025 + ], + [ + 18.549646189480303, + -20.600121055940463, + -1.3755958302425606 + ], + [ + 17.33958478429805, + -22.507566902572307, + -3.297482510251444 + ], + [ + 18.711599093482146, + -23.121759039238782, + -0.6643070451527232 + ], + [ + 18.086458363128223, + -24.243897112534455, + -1.8676180817297716 + ], + [ + 19.979385424019053, + -22.156569193827863, + -2.2287297163786497 + ], + [ + 15.238610882295099, + -23.30030647771821, + -2.0453359738993155 + ], + [ + 13.851542592086517, + -23.501246102074674, + -1.5881956054168882 + ], + [ + 13.581456537957036, + -24.537888015546628, + -0.4681601570610293 + ], + [ + 12.413763776818078, + -24.86976690291624, + -0.25760822722230986 + ], + [ + 12.979321304047948, + -23.638863215989318, + -2.8617942549654134 + ], + [ + 13.065579131654468, + -22.47326447771013, + -3.897287345583306 + ], + [ + 13.538297158898096, + -24.77307699161645, + -3.5034497697829505 + ], + [ + 15.602611559049615, + -23.916869735356954, + -2.75769469314288 + ], + [ + 13.47942169948281, + -22.565736634653717, + -1.1705246805331981 + ], + [ + 11.922183798289318, + -23.758171654536113, + -2.624467082012807 + ], + [ + 12.999694462582669, + -24.88095441049245, + -4.2907664896409035 + ], + [ + 13.043822193661292, + -21.560298610737846, + -3.3022086058352653 + ], + [ + 14.047231021017636, + -22.49933588158035, + -4.370337728633267 + ], + [ + 12.319870951780798, + -22.474001257893747, + -4.692284448144609 + ], + [ + 14.665286768865673, + -25.123812456566725, + 0.12316163801531921 + ], + [ + 14.585375865735413, + -26.292953047042147, + 1.0838800642603659 + ], + [ + 14.960233059314415, + -26.06102806962474, + 2.521308517446258 + ], + [ + 14.508042079109494, + -26.757923781902036, + 3.4153985400008597 + ], + [ + 15.356681775199066, + -27.37332879611654, + 0.4117440625876458 + ], + [ + 16.911326992142666, + -27.441424768002207, + 0.4820977246596025 + ], + [ + 17.572451335971948, + -26.56532756873503, + 1.1160644201141123 + ], + [ + 17.516813646574057, + -28.43676796681757, + 0.002262577954998536 + ], + [ + 15.577180232749418, + -24.947815651180576, + -0.27379294077184396 + ], + [ + 13.546403440734787, + -26.61209437869502, + 1.1662414554750846 + ], + [ + 15.050267146722309, + -28.357251902085864, + 0.7668475821369898 + ], + [ + 15.034407563866054, + -27.334588519428053, + -0.6288034466342616 + ], + [ + 15.853794372723035, + -25.08391237547903, + 2.848377568934192 + ], + [ + 16.336450938116684, + -24.874331193714738, + 4.2352977465547905 + ], + [ + 15.183809845525998, + -24.775012600573405, + 5.355474500848768 + ], + [ + 14.13370603491954, + -24.12553930774152, + 5.218449404201822 + ], + [ + 17.36364730463204, + -23.71613147677101, + 4.288752458226855 + ], + [ + 18.169357021634124, + -23.72764991103986, + 5.500266850151008 + ], + [ + 18.9355944381582, + -24.71229730939308, + 6.015517378677272 + ], + [ + 18.221629313361507, + -22.708612673226412, + 6.472673035998019 + ], + [ + 19.100745464164078, + -23.052364336181995, + 7.50005561281811 + ], + [ + 17.541631057389047, + -21.41461125625267, + 6.453254090347177 + ], + [ + 19.522132311943697, + -24.309690646346326, + 7.157160181171064 + ], + [ + 19.164060105983943, + -22.208008001858957, + 8.647447099426632 + ], + [ + 17.712649852560176, + -20.605970029135392, + 7.59495035664811 + ], + [ + 18.402365113487864, + -21.049567894770576, + 8.666358293788798 + ], + [ + 16.386135190464014, + -24.611770521628614, + 2.1315817234046057 + ], + [ + 16.878491756751863, + -25.759311901509363, + 4.568616648320261 + ], + [ + 17.989988514098055, + -23.77765262210289, + 3.3988008009662067 + ], + [ + 16.911040980890125, + -22.76799840480578, + 3.9984286539917187 + ], + [ + 19.11275424051825, + -25.647750581715286, + 5.505671768661381 + ], + [ + 20.20578162276883, + -24.73491115371519, + 7.767008113212865 + ], + [ + 16.905630516514226, + -21.110386601368077, + 5.635117857262184 + ], + [ + 19.50887326050099, + -22.586628723589115, + 9.598315001008823 + ], + [ + 17.18641234086805, + -19.673232853252784, + 7.734510866625868 + ], + [ + 18.45068973050924, + -20.440889121681494, + 9.557185604597374 + ], + [ + 15.533447977728352, + -25.207510373230434, + 6.564743858866209 + ], + [ + 14.636493013885534, + -24.981153393514205, + 7.710575219985254 + ], + [ + 15.392390450077126, + -24.87752650946868, + 9.026352200153747 + ], + [ + 16.053708492862242, + -25.83009118936036, + 9.453050963545532 + ], + [ + 13.694002957045782, + -26.18153065401998, + 7.848449207949392 + ], + [ + 12.636519664045196, + -25.886428336832523, + 6.866928475776373 + ], + [ + 16.41616062426978, + -25.676018277361663, + 6.711084463268896 + ], + [ + 13.978331268892346, + -24.11351980050881, + 7.664396888430868 + ], + [ + 14.259783082731365, + -27.0635751679049, + 7.54847119928222 + ], + [ + 13.229236723860296, + -26.36635633380979, + 8.816918690156943 + ], + [ + 13.069295252102842, + -25.38120630151775, + 6.174790574192092 + ], + [ + 15.144648027875176, + -23.74555741584163, + 9.802384621595406 + ], + [ + 15.968152839344208, + -23.490348935842007, + 11.02626855695138 + ], + [ + 15.553133369523007, + -24.366525744832416, + 12.208209198582136 + ], + [ + 16.228408019680604, + -24.39466544053164, + 13.228420261282315 + ], + [ + 15.852737357677377, + -21.97132048982246, + 11.2362812869397 + ], + [ + 14.546984891124316, + -21.573420166296046, + 10.617517094283375 + ], + [ + 14.367549329309066, + -22.51939909280918, + 9.410751592925596 + ], + [ + 16.994100535767334, + -23.787553886307705, + 10.80901827332828 + ], + [ + 15.910176536559266, + -21.747264387205064, + 12.301457810472545 + ], + [ + 16.696102446005778, + -21.615129417368507, + 10.644702161673587 + ], + [ + 13.754062692268995, + -21.71066264621902, + 11.352730099692353 + ], + [ + 14.62160410015988, + -20.55047736911945, + 10.248577491311964 + ], + [ + 13.333796800117463, + -22.77926864405515, + 9.182884426476466 + ], + [ + 14.95056252101684, + -22.108764335515957, + 8.58638818252422 + ], + [ + 14.511807035215346, + -25.227941974551072, + 12.043955691031357 + ], + [ + 13.974622544397752, + -26.127124432579876, + 13.040376805845844 + ], + [ + 14.375040831725304, + -27.599776312380754, + 12.763868869313704 + ], + [ + 14.643572286616862, + -28.309242556053505, + 13.710213863730072 + ], + [ + 12.48844089033122, + -25.812492757601717, + 13.028877154486649 + ], + [ + 11.698514196681185, + -25.87353312264429, + 11.761437324719177 + ], + [ + 11.017463253875123, + -27.106495735550425, + 11.420450232091307 + ], + [ + 11.617133463078668, + -24.757279924967747, + 10.82616508025723 + ], + [ + 10.380526937012368, + -27.179814729669943, + 10.17336629020795 + ], + [ + 10.834782187707438, + -24.90802171639052, + 9.644653803968701 + ], + [ + 10.234736476820089, + -26.102176930684664, + 9.328605622636559 + ], + [ + 9.671241689895332, + -26.16600831896517, + 8.071318364267658 + ], + [ + 14.027962535856714, + -25.01345308749592, + 11.183728936010155 + ], + [ + 14.384408111641346, + -25.866607076723312, + 14.016238227307074 + ], + [ + 11.930484485081664, + -26.439232011039167, + 13.724567065387953 + ], + [ + 12.365976866893046, + -24.83234565007342, + 13.489763560859346 + ], + [ + 10.96862977238648, + -27.892284289175905, + 12.159742841395762 + ], + [ + 11.962478808615076, + -23.792236811203566, + 11.166500492222383 + ], + [ + 9.798044511797052, + -28.054094954077527, + 9.922862652430817 + ], + [ + 10.769303126910705, + -24.067728599902125, + 8.969361951342774 + ], + [ + 9.807723917433606, + -25.40338307284958, + 7.504415924873308 + ], + [ + 14.623427875511508, + -27.922763886348093, + 11.489929886342203 + ], + [ + 15.282986723196897, + -29.189061119637927, + 11.130893963535396 + ], + [ + 16.84597221944359, + -29.12554504830041, + 11.399697683898545 + ], + [ + 17.455145897508075, + -30.131022096590414, + 11.521855699567444 + ], + [ + 14.965685798568234, + -29.421387267621412, + 9.6898354605694 + ], + [ + 14.54535877721887, + -27.16309044389186, + 10.828944373347456 + ], + [ + 14.987811105592538, + -30.055395981472202, + 11.722869574779663 + ], + [ + 15.265956577192707, + -30.39263213492268, + 9.296620432730505 + ], + [ + 13.891379113318608, + -29.33078515868624, + 9.529346984462466 + ], + [ + 15.430469157196468, + -28.63678505496955, + 9.092781993921914 + ], + [ + 17.46983606801774, + -27.947005827558996, + 11.264885563210981 + ], + [ + 18.77039667933947, + -27.64956516987354, + 11.846605448311227 + ], + [ + 18.748923903963217, + -27.599844995279227, + 13.402462755939533 + ], + [ + 19.62936065670937, + -28.17039695484118, + 14.026432826243072 + ], + [ + 19.148965783143954, + -26.248839894523144, + 11.252615371870064 + ], + [ + 20.547597755009825, + -25.7712627258436, + 11.468483298295345 + ], + [ + 21.403645854815515, + -26.60562569843887, + 11.906143214214692 + ], + [ + 20.83301881491816, + -24.571965660013802, + 11.101050799729787 + ], + [ + 16.91702140787874, + -27.164101955669366, + 10.946209392040243 + ], + [ + 19.507456333683255, + -28.39408466736677, + 11.545719719203465 + ], + [ + 18.8604258085572, + -26.299790117390103, + 10.202735625044584 + ], + [ + 18.43408602790939, + -25.581507487113413, + 11.733980248381236 + ], + [ + 17.67949523400983, + -27.092406375513747, + 13.983623125930938 + ], + [ + 17.419190158334192, + -26.927973272670442, + 15.44330642991091 + ], + [ + 17.03330620345692, + -26.707654144119942, + 13.309453659601015 + ], + [ + 16.54445260854821, + -27.46158319870392, + 15.815047996529872 + ], + [ + 18.254567800050655, + -27.396777762045076, + 15.963374882097106 + ], + [ + 17.475720786606367, + -25.867073808237933, + 15.68701359752188 + ], + [ + -0.843154950761797, + 6.22005479782095, + 0.9083186094688596 + ], + [ + 6.500527959381482, + 6.341099821016627, + 9.306650815811484 + ], + [ + 2.3632546161298915, + 2.8218907373837396, + 10.600155396934255 + ], + [ + -1.7790162847839985, + 3.162826011258204, + 1.6190306857074241 + ], + [ + -1.7948547837599984, + 4.0435222330168585, + 2.496079066289941 + ], + [ + -1.595352613988095, + 5.226658915274783, + 2.247167498863219 + ], + [ + -1.8214006854225893, + 3.532288492867025, + 3.9657520439985356 + ], + [ + -3.2649167815695272, + 3.6540800523398502, + 4.420251816565694 + ], + [ + -4.30060486430216, + 2.660204365113728, + 3.7019575676918137 + ], + [ + -5.801985332915821, + 2.862963696035976, + 4.097485656279264 + ], + [ + -3.8592125449704677, + 1.1856937543729344, + 3.7023693199979455 + ], + [ + -0.804140321614924, + 4.134571171035844, + 4.958337709745246 + ], + [ + 0.6411163610532707, + 3.9879573779087707, + 4.354620438817847 + ], + [ + 1.084516240509584, + 2.5137400353395805, + 4.021426475098446 + ], + [ + 1.5273012440110407, + 2.307384022975441, + 2.9200559926500507 + ], + [ + 1.0968142446535947, + 1.7454820110617533, + 5.017320340876877 + ], + [ + 1.7563877994594441, + 4.681468115973843, + 5.199018059913086 + ], + [ + 3.1039909549826947, + 4.620775848348529, + 4.4909039545513565 + ], + [ + 3.291518249601591, + 5.184925078846618, + 3.264553988985092 + ], + [ + 4.525140386616491, + 5.0235175357297805, + 2.832716852114134 + ], + [ + 5.107758349751059, + 4.264096580974183, + 3.7617935494314505 + ], + [ + 4.217301377964938, + 3.9140143840468795, + 4.765731140387628 + ], + [ + 4.561608040077435, + 2.9529710735093744, + 5.877586318057893 + ], + [ + 4.594939497526023, + 3.4958362152339078, + 7.295443268465957 + ], + [ + 5.476968722001457, + 4.421737101256042, + 7.697293560114894 + ], + [ + 5.352253406810258, + 5.0788201470437, + 8.907640744453422 + ], + [ + 4.271775446164687, + 4.651138762642063, + 9.828123552294784 + ], + [ + 3.6237044208086058, + 3.038998159943162, + 8.18965096170345 + ], + [ + 3.510909502668608, + 3.54072868450433, + 9.456376665620338 + ], + [ + -1.5005507881092022, + 2.4917164346762206, + 3.8983281032954804 + ], + [ + -4.307413857526326, + 2.930749424147294, + 2.638863360929841 + ], + [ + 0.5681955288199658, + 4.426000514129981, + 3.358085029412743 + ], + [ + 2.5290915958562987, + 5.73717928986548, + 2.731219193976173 + ], + [ + 6.0975429489759465, + 3.8367878793455077, + 3.6698236115963456 + ], + [ + 6.346564055324212, + 4.620024238902744, + 7.077711330214661 + ], + [ + 4.225012896091962, + 5.085506973551247, + 10.82237327120418 + ], + [ + 2.87060429968756, + 2.3004827575320377, + 7.931135621440451 + ], + [ + -3.792771464898701, + 4.607652341571622, + 4.295843654198596 + ], + [ + -3.3505050241880006, + 3.4589991572718475, + 5.496368457715739 + ], + [ + -6.094692410655337, + 3.878042106215588, + 3.801940771113292 + ], + [ + -6.425774300971334, + 2.2974175880658265, + 3.394311754679071 + ], + [ + -6.180982232087665, + 2.630838718701142, + 5.100424976232437 + ], + [ + -4.294682384489892, + 0.7953317691976309, + 4.630481753400406 + ], + [ + -4.33034908505666, + 0.5779076150616582, + 2.9200428608848092 + ], + [ + -2.7929961869757687, + 0.9511368756031189, + 3.594784157331207 + ], + [ + 1.9493612175246702, + 4.226856401227337, + 6.17855795961646 + ], + [ + 1.4304968305355235, + 5.728942024973662, + 5.199613150077207 + ], + [ + 5.524893923179382, + 2.4641503972767396, + 5.6864230591694875 + ], + [ + 3.915497934716198, + 2.0667486101298636, + 5.853914980177186 + ], + [ + -0.8076581253723529, + 3.492848509150349, + 5.763992819958287 + ], + [ + -1.049695952580254, + 5.112209401551183, + 5.170061297649045 + ] + ], + "nsites": 9631, + "species_at_sites": [ + "C", + "O", + "CH3", + "1H", + "2H", + "3H", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "HA", + "HB2", + "HB3", + "HG", + "H1", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "C1", + "C2", + "N2", + "C3", + "O3", + "C4", + "O4", + "C5", + "O5", + "C6", + "O6", + "C7", + "O7", + "C8", + "H", + "HN2", + "HA", + "HB2", + "HB3", + "HD2", + "HO3", + "HO4", + "HO6", + "H1", + "H2", + "H3", + "H4", + "H5", + "H61", + "H62", + "H81", + "H82", + "H83", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "C1", + "C2", + "N2", + "C3", + "O3", + "C4", + "O4", + "C5", + "O5", + "C6", + "O6", + "C7", + "O7", + "C8", + "H", + "HN2", + "HA", + "HB2", + "HB3", + "HD2", + "HO3", + "HO4", + "HO6", + "H1", + "H2", + "H3", + "H4", + "H5", + "H61", + "H62", + "H81", + "H82", + "H83", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "H", + "1HA", + "2HA", + "3HA", + "CL", + "CL24", + "CL28", + "O1", + "C2", + "O3", + "C4", + "C5", + "C6", + "C7", + "C8", + "N9", + "C10", + "C11", + "O12", + "O13", + "C14", + "C15", + "C16", + "N17", + "C18", + "N19", + "C20", + "C21", + "C22", + "C23", + "C25", + "C26", + "C27", + "H4", + "H6", + "H10", + "H16", + "H18", + "H22", + "H25", + "H26", + "H51", + "H52", + "H71", + "H72", + "H73", + "H81", + "H82", + "H83", + "H141", + "H142", + "H201", + "H202", + "H9", + "H9" + ], + "species": [ + { + "name": "ND1", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H25", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "OH", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "NE2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "HD11", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HB3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HO4", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CE2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HO3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H82", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O13", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C15", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CD", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "SG", + "chemical_symbols": [ + "S" + ], + "concentration": [ + 1 + ], + "mass": [ + 32.06 + ] + }, + { + "name": "CB", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C20", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "O4", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "ND2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H62", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H202", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H83", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "1H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HH21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CE3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HG11", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CA", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CZ", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C18", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CG1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H9", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HZ2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H61", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HA2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HZ1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NH1", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "HB", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CE", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C5", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C25", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H10", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C11", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HD1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O7", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C10", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H16", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C27", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "OG", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "CZ3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C22", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "O5", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HZ3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "OD1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HB2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CG", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HZ", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NE1", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "HD12", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H52", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C4", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "3H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H142", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CL", + "chemical_symbols": [ + "Cl" + ], + "concentration": [ + 1 + ], + "mass": [ + 35.45 + ] + }, + { + "name": "H5", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H4", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG13", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H51", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "O3", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HD3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C8", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "OD2", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HD22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CG2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HE22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NE", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "2H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "OG1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "H6", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C23", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H26", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "3HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N9", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "CH3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CL28", + "chemical_symbols": [ + "Cl" + ], + "concentration": [ + 1 + ], + "mass": [ + 35.45 + ] + }, + { + "name": "OE1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "H201", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HA3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HH12", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H81", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG12", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C14", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "OE2", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HD21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C26", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HD13", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "SD", + "chemical_symbols": [ + "S" + ], + "concentration": [ + 1 + ], + "mass": [ + 32.06 + ] + }, + { + "name": "H22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H18", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C16", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HG21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CD1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CD2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C6", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HO6", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CZ2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C21", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C7", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H72", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HN2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H71", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "CE1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH11", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "2HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CL24", + "chemical_symbols": [ + "Cl" + ], + "concentration": [ + 1 + ], + "mass": [ + 35.45 + ] + }, + { + "name": "HD23", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NH2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H73", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG23", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HB1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HG22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O12", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "N17", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "CH2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "1HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HD2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NZ", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H141", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "N19", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "O6", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + } + ], + "structure_features": [] + }, + "nframes": 34, + "reference_frame": 1, + "available_properties": { + "cartesian_site_positions": { + "frame_serialization_format": "explicit", + "nvalues": 34 + }, + "lattice_vectors": { + "frame_serialization_format": "constant" + }, + "species": { + "frame_serialization_format": "constant" + }, + "dimension_types": { + "frame_serialization_format": "constant" + }, + "species_at_sites": { + "frame_serialization_format": "constant" + }, + "time":{ + "frame_serialization_format" : "linear" + } + }, + "type": "trajectories", + "last_modified":{"$date": "2022-04-27T16:09:41.000Z"}, + "cartesian_site_positions": { + "frame_serialization_format": "explicit", + "nvalues": 34, + "_storage_method": "hdf5" + }, + "time":{ + "frame_serialization_format" : "linear", + "_storage_method" : "mongo", + "offset_linear" : 0.0, + "step_size_linear" : 0.04888821 + }, + "lattice_vectors": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + [ + [ + 104.75525665283203, + 0, + -0.000004578997504722793 + ], + [ + -0.000007908802217571065, + 104.75525665283203, + -0.000004578997504722793 + ], + [ + 0, + 0, + 104.75525665283203 + ] + ] + ] + }, + "species": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + [ + { + "name": "ND1", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H25", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "OH", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "NE2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "HD11", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HB3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HO4", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CE2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HO3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H82", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O13", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C15", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CD", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "SG", + "chemical_symbols": [ + "S" + ], + "concentration": [ + 1 + ], + "mass": [ + 32.06 + ] + }, + { + "name": "CB", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C20", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "O4", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "ND2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H62", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H202", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H83", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "1H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HH21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CE3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HG11", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CA", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CZ", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C18", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CG1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H9", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HZ2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H61", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HA2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HZ1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NH1", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "HB", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CE", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C5", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C25", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H10", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C11", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HD1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O7", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C10", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H16", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C27", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "OG", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "CZ3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C22", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "O5", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HZ3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "OD1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HB2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CG", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HZ", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NE1", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "HD12", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H52", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C4", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "3H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H142", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CL", + "chemical_symbols": [ + "Cl" + ], + "concentration": [ + 1 + ], + "mass": [ + 35.45 + ] + }, + { + "name": "H5", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H4", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG13", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H51", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "O3", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HD3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C8", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "OD2", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HD22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CG2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HE22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NE", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "2H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "OG1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "H6", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C23", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H26", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "3HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N9", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "CH3", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CL28", + "chemical_symbols": [ + "Cl" + ], + "concentration": [ + 1 + ], + "mass": [ + 35.45 + ] + }, + { + "name": "OE1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "H201", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HA3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HH12", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H81", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG12", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C14", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "OE2", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HD21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C26", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HD13", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "SD", + "chemical_symbols": [ + "S" + ], + "concentration": [ + 1 + ], + "mass": [ + 32.06 + ] + }, + { + "name": "H22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H18", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "C16", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HG21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CD1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "CD2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C6", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HO6", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CZ2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C21", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "C7", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H72", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HN2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "H71", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG3", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "CE1", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "HH11", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "2HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "CL24", + "chemical_symbols": [ + "Cl" + ], + "concentration": [ + 1 + ], + "mass": [ + 35.45 + ] + }, + { + "name": "HD23", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NH2", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H73", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HG23", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HB1", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O1", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HG22", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O12", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "N17", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "CH2", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "1HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HE21", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "HD2", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "NZ", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "H141", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "O", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "N19", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "O6", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "HA", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + } + ] + ] + }, + "dimension_types": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + null + ] + }, + "species_at_sites": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + [ + "C", + "O", + "CH3", + "1H", + "2H", + "3H", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "HA", + "HB2", + "HB3", + "HG", + "H1", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "C1", + "C2", + "N2", + "C3", + "O3", + "C4", + "O4", + "C5", + "O5", + "C6", + "O6", + "C7", + "O7", + "C8", + "H", + "HN2", + "HA", + "HB2", + "HB3", + "HD2", + "HO3", + "HO4", + "HO6", + "H1", + "H2", + "H3", + "H4", + "H5", + "H61", + "H62", + "H81", + "H82", + "H83", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "C1", + "C2", + "N2", + "C3", + "O3", + "C4", + "O4", + "C5", + "O5", + "C6", + "O6", + "C7", + "O7", + "C8", + "H", + "HN2", + "HA", + "HB2", + "HB3", + "HD2", + "HO3", + "HO4", + "HO6", + "H1", + "H2", + "H3", + "H4", + "H5", + "H61", + "H62", + "H81", + "H82", + "H83", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD2", + "ND1", + "CE1", + "NE2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "SG", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "CD1", + "H", + "HA", + "HB", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "HD11", + "HD12", + "HD13", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "SD", + "CE", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE1", + "HE2", + "HE3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE", + "CZ", + "NH1", + "NH2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE", + "HH11", + "HH12", + "HH21", + "HH22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "OE1", + "OE2", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "H", + "HA", + "HB2", + "HB3", + "HG", + "HD11", + "HD12", + "HD13", + "HD21", + "HD22", + "HD23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "NE2", + "OE1", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HE21", + "HE22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "CE", + "NZ", + "H", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "HE2", + "HE3", + "HZ1", + "HZ2", + "HZ3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "ND2", + "OD1", + "H", + "HA", + "HB2", + "HB3", + "HD21", + "HD22", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HZ", + "N", + "CA", + "C", + "O", + "CB", + "CG1", + "CG2", + "H", + "HA", + "HB", + "HG11", + "HG12", + "HG13", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "H", + "HA2", + "HA3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG2", + "OG1", + "H", + "HA", + "HB", + "HG1", + "HG21", + "HG22", + "HG23", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE2", + "CE3", + "NE1", + "CZ2", + "CZ3", + "CH2", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HE1", + "HE3", + "HZ2", + "HZ3", + "HH2", + "N", + "CA", + "C", + "O", + "CB", + "OG", + "H", + "HA", + "HB2", + "HB3", + "HG", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD", + "HA", + "HB2", + "HB3", + "HG2", + "HG3", + "HD2", + "HD3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH", + "H", + "HA", + "HB2", + "HB3", + "HD1", + "HD2", + "HE1", + "HE2", + "HH", + "N", + "CA", + "C", + "O", + "CB", + "H", + "HA", + "HB1", + "HB2", + "HB3", + "N", + "CA", + "C", + "O", + "CB", + "CG", + "OD1", + "OD2", + "H", + "HA", + "HB2", + "HB3", + "N", + "CA", + "H", + "1HA", + "2HA", + "3HA", + "CL", + "CL24", + "CL28", + "O1", + "C2", + "O3", + "C4", + "C5", + "C6", + "C7", + "C8", + "N9", + "C10", + "C11", + "O12", + "O13", + "C14", + "C15", + "C16", + "N17", + "C18", + "N19", + "C20", + "C21", + "C22", + "C23", + "C25", + "C26", + "C27", + "H4", + "H6", + "H10", + "H16", + "H18", + "H22", + "H25", + "H26", + "H51", + "H52", + "H71", + "H72", + "H73", + "H81", + "H82", + "H83", + "H141", + "H142", + "H201", + "H202", + "H9", + "H9" + ] + ] + }, + "relationships": { + "references": { + "data": [ + { + "type": "references", + "id": "CCBy4" + }, + { + "type": "references", + "id": "Shaw2020a" + } + ] + } + }, + "_storage_path": "test.hdf5", + "id": "62696ac7eef0323c842f9f51" +}, + {"_id": "626c1016589b93e9590f28ec", + "reference_structure": { + "elements": [ + "C", + "H", + "N", + "O", + "Rh", + "S" + ], + "nelements": 6, + "elements_ratios": [ + 0.04615385, + 0.64102564, + 0.01025641, + 0.29230769, + 0.00512821, + 0.00512821 + ], + "chemical_formula_descriptive": "C9H125N2O57Rh1S1", + "chemical_formula_reduced": "C9H125N2O57RhS", + "chemical_formula_anonymous": "A125B57C9D2EF", + "dimension_types": null, + "nperiodic_dimensions": null, + "lattice_vectors": null, + "cartesian_site_positions": [ + [ + -3.8501811027526847, + 5.7488508224487305, + 2.9111170768737793 + ], + [ + -5.3319411277771, + -2.1424169540405273, + 1.2059470415115352 + ], + [ + 2.4886429309844975, + 1.519116997718811, + 6.609289169311523 + ], + [ + 4.2619309425354, + -1.2855570316314697, + -1.053789973258972 + ], + [ + -3.3017160892486577, + -3.965287923812866, + -4.131831169128419 + ], + [ + 0.3683010041713707, + -4.920493125915527, + -5.466102123260498 + ], + [ + -4.2416749000549325, + -4.33195686340332, + -1.2244440317153935 + ], + [ + -0.013315999880433152, + -0.43389299511909485, + 4.538845062255859 + ], + [ + -0.5461080074310306, + -1.7301440238952637, + 8.017799377441406 + ], + [ + -1.1960619688034066, + -6.158060073852539, + 4.197004795074462 + ], + [ + 4.470537185668945, + 0.14261600375175476, + -5.4859161376953125 + ], + [ + 0.09780099987983652, + -3.227821111679077, + -1.7703620195388796 + ], + [ + 7.109703063964845, + 3.1334590911865234, + 0.8316259980201728 + ], + [ + -5.063879013061524, + -3.911262035369873, + 2.8759760856628414 + ], + [ + 4.557802200317382, + -3.531682014465332, + -0.6642689704895018 + ], + [ + -3.30499005317688, + -0.20646700263023376, + -3.5005080699920654 + ], + [ + 7.404516220092773, + -0.7227219939231873, + 1.7456810474395756 + ], + [ + 0.380052000284196, + 6.692556858062744, + 4.51871919631958 + ], + [ + -1.1586019992828367, + 1.5959850549697876, + 7.319183826446533 + ], + [ + 4.709011077880859, + -0.7049800157546997, + -3.0688080787658687 + ], + [ + 0.4833920001983632, + -6.702223777770996, + 1.143280982971191 + ], + [ + 3.2589299678802486, + -2.6925559043884277, + 3.072606086730957 + ], + [ + 3.4874980449676505, + -5.504344940185547, + -3.0007519721984863 + ], + [ + -5.668788909912109, + 1.7235150337219238, + 2.556418895721435 + ], + [ + -5.719634056091309, + 2.522675037384033, + 0.34480699896812417 + ], + [ + -3.7800910472869864, + 5.996866226196289, + -2.70756196975708 + ], + [ + -3.951023101806641, + -1.4123209714889526, + 3.4051089286804195 + ], + [ + -0.426562994718552, + -2.3670010566711426, + 5.374413013458252 + ], + [ + 5.795125961303711, + -0.14849700033664703, + 5.087911128997803 + ], + [ + -2.4651041030883794, + -3.9112050533294678, + 2.2317929267883296 + ], + [ + -2.566313982009887, + 5.460964202880859, + -0.7393789887428281 + ], + [ + 7.340704917907715, + -0.19842299818992615, + -0.5974829792976375 + ], + [ + 2.49660611152649, + 5.453549861907959, + -0.3148539960384364 + ], + [ + 0.6753950119018542, + -7.3108367919921875, + -2.4984719753265385 + ], + [ + 1.3709759712219245, + 3.8255579471588135, + 4.809299945831299 + ], + [ + 4.222484111785889, + 2.220659017562866, + 1.3531390428543095 + ], + [ + -6.814335823059082, + -2.2096428871154785, + 0.5037609934806818 + ], + [ + -2.344131946563721, + -3.9766249656677246, + -3.0310690402984624 + ], + [ + 0.098208002746104, + -7.406500816345215, + 2.667795896530151 + ], + [ + 7.321781158447265, + -3.072869062423706, + 1.6217939853668215 + ], + [ + -1.9555399417877188, + 4.8729047775268555, + -4.454273223876953 + ], + [ + 1.1607140302658085, + 2.6709299087524414, + -5.481872081756592 + ], + [ + -3.7673890590667725, + 0.3993090093135834, + 6.5542778968811035 + ], + [ + -7.132842063903809, + 1.116968035697937, + 1.9277069568634029 + ], + [ + 4.746068954467774, + 6.562007904052734, + -0.2062789946794503 + ], + [ + 0.007139999885111264, + -4.871441841125488, + -0.30615699291229276 + ], + [ + 1.6845500469207755, + -5.576076030731201, + 4.918412208557129 + ], + [ + -1.7289320230484007, + 1.8322709798812866, + -6.673233985900879 + ], + [ + 1.2798540592193612, + 5.176469802856445, + 0.7268909811973576 + ], + [ + 1.6819700002670288, + 0.572920024394989, + 3.0645179748535156 + ], + [ + 0.9451329708099374, + 5.205163955688477, + -1.7191339731216426 + ], + [ + 2.973823070526124, + 5.908850193023682, + 3.5892400741577153 + ], + [ + 3.4260759353637695, + 0.2934510111808777, + 8.383898735046387 + ], + [ + -3.1537210941314706, + -4.789740085601807, + 4.136126041412353 + ], + [ + -5.963312149047852, + -0.7537569999694824, + -0.635841012001038 + ], + [ + 4.188220024108886, + -5.806107997894287, + 1.5925019979476929 + ], + [ + 0.967054009437562, + 6.365579128265381, + -2.600500106811523 + ], + [ + -1.112727046012879, + -4.401619911193848, + -4.98302698135376 + ], + [ + -3.8856680393218985, + 6.860372066497803, + -1.4178810119628904 + ], + [ + -4.530416011810304, + -3.0010740756988525, + -0.6049039959907536 + ], + [ + 2.0703411102294926, + 2.6350650787353516, + 7.664490222930908 + ], + [ + -0.5445889830589306, + -6.999907970428467, + 5.351076126098632 + ], + [ + 4.757709980010986, + 1.5347000360488892, + -6.242999076843262 + ], + [ + 1.2173620462417596, + -4.266802787780762, + -2.043060064315796 + ], + [ + -1.2957960367202759, + -0.43994200229644775, + 8.552604675292969 + ], + [ + -5.831443786621095, + -3.1304609775543213, + 4.0227718353271475 + ], + [ + 4.128246784210204, + -3.151181936264038, + -2.016258955001831 + ], + [ + 7.069147109985352, + 0.21704399585723877, + 3.0111410617828374 + ], + [ + -0.11375399678945458, + 5.21737813949585, + 4.963183879852295 + ], + [ + -1.6695640087127692, + -4.298770904541016, + 4.972843170166016 + ], + [ + -4.299327850341796, + 2.856147050857544, + -0.13850699365139016 + ], + [ + 3.1735138893127437, + -4.042261123657227, + 3.9595859050750732 + ], + [ + 3.3225269317626944, + -4.272864818572998, + -3.982527017593384 + ], + [ + -5.538756847381592, + 0.783394992351532, + -6.375188827514648 + ], + [ + 4.723404884338378, + -4.395420074462891, + 2.0053019523620605 + ], + [ + 2.403518915176392, + 1.8761249780654907, + -5.739223957061768 + ], + [ + 7.025270938873292, + 3.6119771003723145, + -0.708712995052337 + ], + [ + -3.4439949989318848, + -0.16966299712657928, + 2.6293530464172363 + ], + [ + -0.5307639837265006, + 5.530303001403809, + 2.7550289630889897 + ], + [ + -4.533679008483887, + 0.5446379780769348, + -5.281424045562744 + ], + [ + 2.0934770107269283, + -2.8532071113586426, + -6.847571849822998 + ], + [ + -3.0607640743255624, + -4.210446834564209, + 0.6448339819908138 + ], + [ + 6.916745185852051, + 1.415452003479004, + -0.6345220208168024 + ], + [ + -4.040562152862549, + 0.14988000690937042, + 5.078577041625977 + ], + [ + 0.18720200657844593, + 3.026020050048828, + 5.324306964874268 + ], + [ + 4.036428928375244, + 1.0133600234985352, + 2.239609003067017 + ], + [ + -0.8751059770584106, + -0.203015998005867, + 5.833991050720215 + ], + [ + -2.033353090286254, + 5.31096076965332, + 0.6866800189018252 + ], + [ + -4.830356121063232, + -0.01338099967688322, + -2.77540397644043 + ], + [ + 4.991762161254883, + 0.15045200288295746, + -1.2766989469528196 + ], + [ + 6.075135231018066, + 1.4506759643554688, + 4.782944202423097 + ], + [ + 6.731931209564208, + -2.893156051635742, + 0.03187799826264405 + ], + [ + -0.5084329843521109, + 5.228442192077637, + -3.9476571083068843 + ], + [ + 2.403191089630127, + -1.0530320405960083, + 8.142481803894043 + ], + [ + 5.960505962371826, + -1.135087013244629, + -3.772111892700195 + ], + [ + 3.7488310337066664, + 7.466787815093994, + 0.5939490199089057 + ], + [ + -1.1746269464492807, + -5.128286838531494, + 0.7342569828033444 + ], + [ + 1.1836169958114615, + -5.401346206665039, + 3.521537065505981 + ], + [ + -1.331655979156494, + 0.7882069945335388, + -5.594470977783203 + ], + [ + 0.4595560133457178, + -3.6810760498046875, + 5.249668121337891 + ], + [ + 1.046411991119385, + 1.739372968673706, + 4.234655857086182 + ], + [ + 2.300204038619996, + 4.628351211547852, + 2.622153997421265 + ], + [ + -0.15191799402236836, + 6.424038887023926, + 1.4678200483322148 + ], + [ + 1.629569053649902, + -3.238651990890503, + -8.25682258605957 + ], + [ + -5.472332000732422, + 0.7535099983215332, + -0.7938749790191654 + ], + [ + -3.8607230186462393, + 4.734569072723389, + 1.710805058479309 + ], + [ + 2.2520790100097643, + -7.439191818237305, + -2.0984520912170415 + ], + [ + -1.8234540224075315, + 2.0496110916137695, + 5.992644786834717 + ], + [ + 1.5806829929351804, + -1.8997039794921875, + 0.028593000024557093 + ], + [ + 0.955958008766174, + -2.2925689220428467, + 1.9469380378723145 + ], + [ + -0.9879850149154665, + -1.2455530166625977, + 2.3615870475769043 + ], + [ + -2.474334001541138, + -1.7607589960098267, + -0.19350199401378657 + ], + [ + -0.43093898892402627, + 1.2587560415267944, + 2.542186975479126 + ], + [ + -2.718902111053467, + 0.7358070015907288, + -1.232920050621033 + ], + [ + -1.627851009368896, + 2.5383200645446777, + 0.23874600231647497 + ], + [ + 1.2521170377731328, + 2.3893470764160156, + 0.2606790065765383 + ], + [ + 2.4201290607452397, + 2.835900068283081, + -1.7272089719772337 + ], + [ + 2.651531934738159, + 1.1149710416793823, + -2.012707948684692 + ], + [ + 0.8180689811706545, + 1.6517080068588257, + -3.460939884185791 + ], + [ + -0.1337970048189159, + 2.5088679790496826, + -2.2221219539642334 + ], + [ + 1.2063709497451782, + -0.19638000428676605, + 1.1554570198059082 + ], + [ + 2.442836046218872, + 1.258955955505371, + 0.31782698631286643 + ], + [ + 0.41674700379371615, + -1.7947239875793457, + -5.1082611083984375 + ], + [ + 1.2700320482254026, + -1.9999430179595947, + -3.551506996154785 + ], + [ + 1.4883849620819092, + -0.5545579791069031, + -4.708507061004639 + ], + [ + -3.7816779613494877, + -3.544437885284424, + -0.8573340177536015 + ], + [ + -0.6448789834976197, + -0.8444679975509644, + 5.133860111236572 + ], + [ + -1.3647999763488772, + -1.1836880445480347, + 7.853194236755371 + ], + [ + -0.5130100250244152, + -6.893795967102051, + 4.337751865386962 + ], + [ + 4.13924503326416, + 0.7916650176048279, + -6.143012046813965 + ], + [ + 0.9408739805221552, + -3.5753939151763916, + -1.4226590394973757 + ], + [ + 6.873320102691651, + 2.854814052581787, + -0.10844799876213014 + ], + [ + -2.5383288860321054, + -4.482443809509277, + -3.817537069320679 + ], + [ + 4.8243770599365225, + -2.9128880500793457, + -1.3802340030670164 + ], + [ + 7.444269180297852, + 0.173908993601799, + 2.1094410419464116 + ], + [ + -0.43141600489616294, + 6.1349358558654785, + 4.571453094482422 + ], + [ + -0.968897998332977, + 1.9703359603881836, + 6.4377970695495605 + ], + [ + -5.05174207687378, + -3.0901501178741455, + 3.4425470829010005 + ], + [ + -5.23032522201538, + 2.8976240158081055, + -0.44613599777221696 + ], + [ + 3.8094720840454097, + -3.2879579067230225, + 3.662503957748413 + ], + [ + 3.029568910598754, + -4.610987186431885, + -3.06071400642395 + ], + [ + -6.427735805511475, + 1.9096250534057617, + 1.9162369966506956 + ], + [ + 4.754286766052245, + -5.05859899520874, + 1.2842609882354736 + ], + [ + 2.0384058952331547, + 2.72896409034729, + -5.978947162628174 + ], + [ + -3.2320640087127677, + 6.502486228942871, + -2.0846641063690186 + ], + [ + -4.267113208770752, + -0.4675830006599426, + 3.1631801128387447 + ], + [ + -0.31191799044609125, + -3.3142919540405273, + 5.689892768859863 + ], + [ + -4.529430866241455, + 0.6358140110969543, + -6.256921768188477 + ], + [ + 1.5191349983215328, + -2.5005850791931152, + -7.627869129180908 + ], + [ + -2.6231679916381845, + -4.633464813232422, + 1.5386019945144649 + ], + [ + -2.414905071258544, + 4.715329170227051, + -0.09072999656200395 + ], + [ + 6.840680122375488, + 0.49615898728370667, + -1.0703409910202022 + ], + [ + 0.8003939986228931, + -7.284084796905518, + 1.9107530117034908 + ], + [ + 1.2796800136566149, + -7.712170124053955, + -1.8110909461975102 + ], + [ + 0.3736709952354437, + 3.6679060459136963, + 4.634062767028809 + ], + [ + 3.612232923507691, + 1.8685450553894043, + 1.9972790479660039 + ], + [ + -5.8264479637146, + -1.961676001548767, + 0.32992300391197155 + ], + [ + -4.276939868927002, + -0.0437219999730587, + -3.6354820728302006 + ], + [ + 4.201582908630371, + -0.42991599440574646, + -1.5626950263977049 + ], + [ + 6.389567852020264, + 0.5319330096244812, + 4.611362934112549 + ], + [ + 7.459160804748535, + -2.6753740310668945, + 0.6930320262908939 + ], + [ + -0.9680439829826347, + 4.7734479904174805, + -4.6923627853393555 + ], + [ + 2.994333028793335, + -0.35634100437164307, + 7.706556797027588 + ], + [ + -4.026463031768799, + 0.862043023109436, + 5.730766773223877 + ], + [ + 5.0553059577941895, + -0.7254549860954285, + -3.987582921981811 + ], + [ + 3.771161079406739, + 6.803993225097656, + -0.11880700290203029 + ], + [ + -0.4086639881134042, + -5.573051929473877, + 0.2152809947729107 + ], + [ + 1.7615000009536734, + -4.91471004486084, + 4.195981979370117 + ], + [ + -1.0578449964523313, + 1.1135449409484863, + -6.47442102432251 + ], + [ + 1.809772968292237, + 4.7690839767456055, + 0.001322000054642961 + ], + [ + 1.4793289899826052, + 0.8732029795646667, + 4.031853199005127 + ], + [ + 0.7394700050354013, + 5.373579978942871, + -2.704773902893066 + ], + [ + 2.8731510639190683, + 4.946073055267334, + 3.35559892654419 + ], + [ + -0.3782779872417441, + 5.5524678230285645, + 1.7920160293579104 + ], + [ + -2.1505351066589364, + -4.781570911407471, + 4.28008508682251 + ], + [ + -5.799136161804199, + 0.03019700013101101, + -1.317700028419495 + ], + [ + -4.354124069213866, + 5.043789863586426, + 2.5405099391937256 + ], + [ + 2.397192001342774, + 2.523437023162842, + 6.7655110359191895 + ], + [ + -0.37288901209831304, + -4.229255199432373, + -5.641611099243164 + ], + [ + 2.936891078948974, + -1.8083399534225464, + 1.6543070077896118 + ], + [ + -1.5363359451293945, + -0.13426800072193146, + -4.080783843994141 + ], + [ + -1.0696669816970827, + -1.8852519989013672, + -2.3963799476623535 + ], + [ + 1.7372740507125852, + -1.966752052307129, + 1.1890950202941895 + ], + [ + 1.9095200300216677, + 1.8424179553985596, + -1.6625000238418577 + ], + [ + 0.6004070043563845, + 1.6796619892120361, + -2.3977339267730713 + ], + [ + -1.2563430070877075, + -0.5178329944610596, + 1.567850947380066 + ], + [ + -2.1118369102478027, + -0.8140699863433838, + 0.3486840128898619 + ], + [ + -1.0573070049285886, + 0.9115819931030273, + 1.7115490436553955 + ], + [ + -2.3636550903320312, + 0.4972499907016754, + -0.2043070048093797 + ], + [ + -1.5903580188751218, + 1.5295699834823608, + 0.5824480056762695 + ], + [ + 0.8347489833831785, + -1.3145970106124878, + -4.238700866699219 + ], + [ + 1.6201900243759157, + 1.5716689825057983, + -0.19784100353717785 + ], + [ + 0.0027749999426305945, + 0.40390199422836304, + -2.0024220943450928 + ], + [ + -0.4862709939479829, + -0.7218509912490845, + -3.1290481090545654 + ], + [ + 0, + 0, + 0 + ] + ], + "nsites": 195, + "species_at_sites": [ + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "C", + "C", + "C", + "C", + "C", + "C", + "C", + "C", + "C", + "N", + "N", + "S", + "Rh" + ], + "species": [ + { + "name": "O", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "Rh", + "chemical_symbols": [ + "Rh" + ], + "concentration": [ + 1 + ], + "mass": [ + 102.9055 + ] + }, + { + "name": "S", + "chemical_symbols": [ + "S" + ], + "concentration": [ + 1 + ], + "mass": [ + 32.06 + ] + } + ], + "structure_features": [] + }, + "nframes": 100, + "reference_frame": 1, + "available_properties": { + "cartesian_site_positions": { + "frame_serialization_format": "explicit", + "nvalues": 100 + }, + "lattice_vectors": { + "frame_serialization_format": "constant" + }, + "species": { + "frame_serialization_format": "constant" + }, + "dimension_types": { + "frame_serialization_format": "constant" + }, + "species_at_sites": { + "frame_serialization_format": "constant" + } + }, + "type": "trajectories", + "last_modified": {"$date": "2022-04-29T16:19:34.000Z"}, + "cartesian_site_positions": { + "frame_serialization_format": "explicit", + "nvalues": 100, + "_storage_method": "hdf5" + }, + "lattice_vectors": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + null + ] + }, + "species": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + [ + { + "name": "O", + "chemical_symbols": [ + "O" + ], + "concentration": [ + 1 + ], + "mass": [ + 15.999 + ] + }, + { + "name": "C", + "chemical_symbols": [ + "C" + ], + "concentration": [ + 1 + ], + "mass": [ + 12.011 + ] + }, + { + "name": "H", + "chemical_symbols": [ + "H" + ], + "concentration": [ + 1 + ], + "mass": [ + 1.008 + ] + }, + { + "name": "N", + "chemical_symbols": [ + "N" + ], + "concentration": [ + 1 + ], + "mass": [ + 14.007 + ] + }, + { + "name": "Rh", + "chemical_symbols": [ + "Rh" + ], + "concentration": [ + 1 + ], + "mass": [ + 102.9055 + ] + }, + { + "name": "S", + "chemical_symbols": [ + "S" + ], + "concentration": [ + 1 + ], + "mass": [ + 32.06 + ] + } + ] + ] + }, + "dimension_types": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + null + ] + }, + "species_at_sites": { + "frame_serialization_format": "constant", + "_storage_method": "mongo", + "values": [ + [ + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "H", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "O", + "C", + "C", + "C", + "C", + "C", + "C", + "C", + "C", + "C", + "N", + "N", + "S", + "Rh" + ] + ] + }, + "_storage_path": "626c1016589b93e9590f28ec.hdf5", + "id": "traj001" +} +] diff --git a/optimade/server/main.py b/optimade/server/main.py index 56efd4c16..8a2cf7a50 100644 --- a/optimade/server/main.py +++ b/optimade/server/main.py @@ -28,6 +28,7 @@ partial_data, references, structures, + trajectories, versions, ) from optimade.server.routers.utils import BASE_URL_PREFIXES, JSONAPIResponse @@ -138,13 +139,30 @@ def load_entries(endpoint_name: str, endpoint_collection: EntryCollection): app.add_exception_handler(exception, handler) # Add various endpoints to unversioned URL -for endpoint in (info, links, references, structures, landing, versions, partial_data): +for endpoint in ( + info, + links, + references, + structures, + trajectories, + landing, + versions, + partial_data, +): app.include_router(endpoint.router) def add_major_version_base_url(app: FastAPI): """Add mandatory vMajor endpoints, i.e. all except versions.""" - for endpoint in (info, links, references, structures, landing, partial_data): + for endpoint in ( + info, + links, + references, + structures, + trajectories, + landing, + partial_data, + ): app.include_router(endpoint.router, prefix=BASE_URL_PREFIXES["major"]) @@ -156,7 +174,15 @@ def add_optional_versioned_base_urls(app: FastAPI): ``` """ for version in ("minor", "patch"): - for endpoint in (info, links, references, structures, landing, partial_data): + for endpoint in ( + info, + links, + references, + structures, + trajectories, + landing, + partial_data, + ): app.include_router(endpoint.router, prefix=BASE_URL_PREFIXES[version]) diff --git a/optimade/server/mappers/__init__.py b/optimade/server/mappers/__init__.py index 882abe95b..bc80cb5c6 100644 --- a/optimade/server/mappers/__init__.py +++ b/optimade/server/mappers/__init__.py @@ -4,6 +4,7 @@ from .partial_data import * # noqa: F403 from .references import * # noqa: F403 from .structures import * # noqa: F403 +from .trajectories import * # noqa: F403 __all__ = ( entries.__all__ # type: ignore[name-defined] # noqa: F405 @@ -11,4 +12,5 @@ + partial_data.__all__ # type: ignore[name-defined] # noqa: F405 + references.__all__ # type: ignore[name-defined] # noqa: F405 + structures.__all__ # type: ignore[name-defined] # noqa: F405 + + trajectories.__all__ # type: ignore[name-defined] # noqa: F405 ) diff --git a/optimade/server/mappers/entries.py b/optimade/server/mappers/entries.py index d46566386..e95126740 100644 --- a/optimade/server/mappers/entries.py +++ b/optimade/server/mappers/entries.py @@ -18,7 +18,7 @@ # so that the global caches can be set to the correct size. # See https://github.com/Materials-Consortia/optimade-python-tools/issues/1434 # for the details. -NUM_ENTRY_TYPES = 4 +NUM_ENTRY_TYPES = 5 __all__ = ("BaseResourceMapper",) @@ -82,7 +82,7 @@ class BaseResourceMapper: LENGTH_ALIASES: Tuple[Tuple[str, str], ...] = () PROVIDER_FIELDS: Tuple[str, ...] = () ENTRY_RESOURCE_CLASS: Type[EntryResource] = EntryResource - RELATIONSHIP_ENTRY_TYPES: Set[str] = {"references", "structures"} + RELATIONSHIP_ENTRY_TYPES: Set[str] = {"references", "structures", "trajectories"} TOP_LEVEL_NON_ATTRIBUTES_FIELDS: Set[str] = { "id", "type", diff --git a/optimade/server/mappers/trajectories.py b/optimade/server/mappers/trajectories.py new file mode 100644 index 000000000..fdb3326dd --- /dev/null +++ b/optimade/server/mappers/trajectories.py @@ -0,0 +1,29 @@ +from optimade.models.trajectories import TrajectoryResource +from optimade.server.mappers.entries import BaseResourceMapper + +__all__ = ("TrajectoryMapper",) + + +class TrajectoryMapper(BaseResourceMapper): + # TODO add length aliases for trajectory specific properties + LENGTH_ALIASES = ( + ("elements", "nelements"), + ("element_ratios", "nelements"), + ("cartesian_site_positions", "nsites"), + ("species_at_sites", "nsites"), + ) + # HIDDEN_FIELDS = ["_storage_path"] + # + # STANDARD_FIELDS = ( + # {"reference_structure", "reference_frames", "nframes", "available_properties"} + # .union(BaseResourceMapper.get_required_fields()) + # .union(EntryResourceAttributes.__fields__.keys()) + # ) + ENTRY_RESOURCE_CLASS = TrajectoryResource + + # @classmethod + # def map_back(cls, doc: dict) -> dict: + # doc["available_properties"] = cls.add_alias_and_prefix( + # doc["available_properties"] + # ) + # return super().map_back(doc) diff --git a/optimade/server/routers/__init__.py b/optimade/server/routers/__init__.py index 266518dbe..a9eaa64bd 100644 --- a/optimade/server/routers/__init__.py +++ b/optimade/server/routers/__init__.py @@ -1,9 +1,11 @@ from .links import links_coll from .references import references_coll from .structures import structures_coll +from .trajectories import trajectories_coll ENTRY_COLLECTIONS = { "links": links_coll, "references": references_coll, "structures": structures_coll, + "trajectories": trajectories_coll, } diff --git a/optimade/server/routers/trajectories.py b/optimade/server/routers/trajectories.py new file mode 100644 index 000000000..e124a349a --- /dev/null +++ b/optimade/server/routers/trajectories.py @@ -0,0 +1,58 @@ +from fastapi import APIRouter, Depends, Request + +from optimade.models import ( + TrajectoryResource, + TrajectoryResponseMany, + TrajectoryResponseOne, +) +from optimade.server.config import CONFIG +from optimade.server.entry_collections import create_collection +from optimade.server.mappers import TrajectoryMapper +from optimade.server.query_params import EntryListingQueryParams, SingleEntryQueryParams +from optimade.server.routers.utils import get_entries, get_single_entry +from optimade.server.schemas import ERROR_RESPONSES + +router = APIRouter(redirect_slashes=True) + +trajectories_coll = create_collection( + name=CONFIG.trajectories_collection, + resource_cls=TrajectoryResource, + resource_mapper=TrajectoryMapper, +) + + +@router.get( + "/trajectories", + response_model=TrajectoryResponseMany, + response_model_exclude_unset=True, + tags=["Trajectories"], + responses=ERROR_RESPONSES, +) +def get_trajectories( + request: Request, params: EntryListingQueryParams = Depends() +) -> TrajectoryResponseMany: + return get_entries( + collection=trajectories_coll, + response=TrajectoryResponseMany, + request=request, + params=params, + ) + + +@router.get( + "/trajectories/{entry_id:path}", + response_model=TrajectoryResponseOne, + response_model_exclude_unset=True, + tags=["Trajectories"], + responses=ERROR_RESPONSES, +) +def get_single_trajectory( + request: Request, entry_id: str, params: SingleEntryQueryParams = Depends() +) -> TrajectoryResponseOne: + return get_single_entry( + collection=trajectories_coll, + entry_id=entry_id, + response=TrajectoryResponseOne, + request=request, + params=params, + ) diff --git a/optimade/server/schemas.py b/optimade/server/schemas.py index c01cc914e..49a7de9ac 100644 --- a/optimade/server/schemas.py +++ b/optimade/server/schemas.py @@ -1,10 +1,11 @@ from typing import Callable, Dict, Iterable, Optional -from optimade.models import ( +from optimade.models import ( # type: ignore[attr-defined] DataType, ErrorResponse, ReferenceResource, StructureResource, + TrajectoryResource, ) __all__ = ("ENTRY_INFO_SCHEMAS", "ERROR_RESPONSES", "retrieve_queryable_properties") @@ -12,6 +13,7 @@ ENTRY_INFO_SCHEMAS: Dict[str, Callable[[], Dict]] = { "structures": StructureResource.schema, "references": ReferenceResource.schema, + "trajectories": TrajectoryResource.schema, } """This dictionary is used to define the `/info/` endpoints.""" diff --git a/optimade/validator/utils.py b/optimade/validator/utils.py index 085db335e..813ceb48b 100644 --- a/optimade/validator/utils.py +++ b/optimade/validator/utils.py @@ -24,12 +24,13 @@ from pydantic import Field, ValidationError from optimade import __version__ -from optimade.models import ( +from optimade.models import ( # type: ignore[attr-defined] EntryResource, LinksResource, ReferenceResource, ResponseMeta, StructureResource, + TrajectoryResource, ) from optimade.models.optimade_json import Success @@ -429,5 +430,13 @@ class ValidatorStructureResponseOne(ValidatorEntryResponseOne): data: StructureResource = Field(...) +class ValidatorTrajectoryResponseOne(ValidatorEntryResponseOne): + data: TrajectoryResource = Field(...) + + +class ValidatorTrajectoryResponseMany(ValidatorEntryResponseMany): + data: List[TrajectoryResource] = Field(...) + + class ValidatorStructureResponseMany(ValidatorEntryResponseMany): data: List[StructureResource] = Field(...) diff --git a/tests/server/entry_collections/test_entry_collections.py b/tests/server/entry_collections/test_entry_collections.py index a5f537698..c2d4323cc 100644 --- a/tests/server/entry_collections/test_entry_collections.py +++ b/tests/server/entry_collections/test_entry_collections.py @@ -7,6 +7,7 @@ def test_get_attribute_fields(): LinksResourceAttributes, ReferenceResourceAttributes, StructureResourceAttributes, + TrajectoryResourceAttributes, ) from optimade.server.routers import ENTRY_COLLECTIONS @@ -14,6 +15,7 @@ def test_get_attribute_fields(): "links": LinksResourceAttributes, "references": ReferenceResourceAttributes, "structures": StructureResourceAttributes, + "trajectories": TrajectoryResourceAttributes, } # Make sure we're hitting all collections diff --git a/tests/server/query_params/conftest.py b/tests/server/query_params/conftest.py index fb80dfb9d..dbfece479 100644 --- a/tests/server/query_params/conftest.py +++ b/tests/server/query_params/conftest.py @@ -63,6 +63,7 @@ def check_required_fields_response(get_good_response): "links": mappers.LinksMapper, "references": mappers.ReferenceMapper, "structures": mappers.StructureMapper, + "trajectories": mappers.TrajectoryMapper, } def inner( diff --git a/tests/server/routers/test_structures.py b/tests/server/routers/test_structures.py index 7f8bfa726..222b526fd 100644 --- a/tests/server/routers/test_structures.py +++ b/tests/server/routers/test_structures.py @@ -1,4 +1,4 @@ -from optimade.models import ( +from optimade.models import ( # type: ignore[attr-defined] ReferenceResource, StructureResponseMany, StructureResponseOne, @@ -226,3 +226,17 @@ def test_structures_endpoint_data(self): assert all( len(doc["attributes"]) == len(keys) for doc in self.json_response["data"] ) + + +class TestStructuresWithNelementsInFilter(RegularEndpointTests): + """Tests that structures with e.g., `'assemblies':null` do get + returned for queries testing for "UNKNOWN" fields. + + """ + + request_str = "/structures?filter=nelements>=6" + response_cls = StructureResponseMany + + def test_structures_nreturned(self): + """Check that all structures are returned.""" + assert len(self.json_response["data"]) == 7 diff --git a/tests/server/routers/test_trajectories.py b/tests/server/routers/test_trajectories.py new file mode 100644 index 000000000..c86dec6a6 --- /dev/null +++ b/tests/server/routers/test_trajectories.py @@ -0,0 +1,23 @@ +def test_trajectories( + check_response, +): + expected_ids = [ + "622a07fa8544a62c55ef087a", + "622a29c4087ac20730106f33", + "622b548fe73216ae229b188b", + "62696ac7eef0323c842f9f51", + "traj001", + ] + request = "/trajectories" + check_response(request, expected_ids) + + # request = "/trajectories?filter=nelements==1" + # expected_ids = ["62696ac7eef0323c842f9f51"] + # check_response(request, expected_ids=expected_ids) + + # Because the amount of data that will be returned is limited to reduce waiting times. # TODO Once I have created a proper config parameter for this I should use this maximum package size to determine whether one or two entries are returned. + # request = "/trajectories?filter=nelements>=6&response_fields=cartesian_site_positions,_exmpl_time&last_frame=40&first_frame=5" + # expected_ids = ["62696ac7eef0323c842f9f51"] + # check_response( + # request, expected_ids=expected_ids, expected_return=2 + # ) From 6822fef319adcceb31a397a19f470c1af80b6833 Mon Sep 17 00:00:00 2001 From: Johan Bergsma <29785380+JPBergsma@users.noreply.github.com> Date: Sat, 23 Sep 2023 19:20:32 +0200 Subject: [PATCH 67/95] Made some adjustment to be more compatible with export to traj mongo script. --- optimade/server/config.py | 2 +- ...743f440a7f36b:cartesian_site_positions.npy | Bin 0 -> 19200128 bytes optimade/server/data/__init__.py | 12 +- optimade/server/data/test_trajectories.json | 72918 +--------------- optimade/server/entry_collections/mongo.py | 35 +- optimade/server/main.py | 3 +- optimade/server/routers/utils.py | 52 +- requirements-server.txt | 1 + tests/server/routers/test_trajectories.py | 23 +- 9 files changed, 156 insertions(+), 72890 deletions(-) create mode 100644 optimade/server/data/6509be05a54743f440a7f36b:cartesian_site_positions.npy diff --git a/optimade/server/config.py b/optimade/server/config.py index 38f64ecd5..d84a85d9f 100644 --- a/optimade/server/config.py +++ b/optimade/server/config.py @@ -322,7 +322,7 @@ class ServerConfig(BaseSettings): description="""A list of the response formats that are supported by this server. Must include the "json" format.""", ) max_response_size: Dict[SupportedResponseFormats, int] = Field( - {"json": 10, "jsonlines": 40}, + {"json": 10, "jsonlines": 10}, description="""This dictionary contains the approximate maximum size for a trajectory response in megabytes for the different response_formats. The keys indicate the response_format and the values the maximum size.""", ) diff --git a/optimade/server/data/6509be05a54743f440a7f36b:cartesian_site_positions.npy b/optimade/server/data/6509be05a54743f440a7f36b:cartesian_site_positions.npy new file mode 100644 index 0000000000000000000000000000000000000000..edb29438826f450d947fabcebd6e0b6237280a0d GIT binary patch literal 19200128 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

dUMD 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 +LHT>F7QxeuD1P21a?godHqa?zE4H8h7v7) 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˩`^A1sQEBbXs$dki9+_j+;&) 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