diff --git a/Gemfile.lock b/Gemfile.lock index 202d613c..4346c952 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - bolognese (1.8.12) + bolognese (1.8.13) activesupport (>= 4.2.5) benchmark_methods (~> 0.7) bibtex-ruby (>= 5.1.0) diff --git a/lib/bolognese/readers/crossref_reader.rb b/lib/bolognese/readers/crossref_reader.rb index 03347a1e..db3c25a7 100644 --- a/lib/bolognese/readers/crossref_reader.rb +++ b/lib/bolognese/readers/crossref_reader.rb @@ -64,7 +64,6 @@ def read_crossref(string: nil, **options) journal_article = meta.dig("crossref", "journal", "journal_article") || {} bibliographic_metadata = journal_article.presence || journal_issue.presence || journal_metadata program_metadata = bibliographic_metadata.dig("crossmark", "custom_metadata", "program") || bibliographic_metadata.dig("program") - resource_type = if journal_article.present? "journal_article" elsif journal_issue.present? @@ -150,7 +149,7 @@ def read_crossref(string: nil, **options) "title" => parse_attributes(journal_metadata.to_h["full_title"]), "volume" => parse_attributes(journal_issue.dig("journal_volume", "volume")), "issue" => parse_attributes(journal_issue.dig("issue")), - "firstPage" => bibliographic_metadata.dig("pages", "first_page"), + "firstPage" => bibliographic_metadata.dig("pages", "first_page") || parse_attributes(journal_article.to_h.dig("publisher_item", "item_number"), first: true), "lastPage" => bibliographic_metadata.dig("pages", "last_page") }.compact elsif book_series_metadata.to_h.fetch("series_metadata", nil).present? issn = normalize_issn(book_series_metadata.dig("series_metadata", "issn")) diff --git a/lib/bolognese/version.rb b/lib/bolognese/version.rb index 927e36bf..9b80d861 100644 --- a/lib/bolognese/version.rb +++ b/lib/bolognese/version.rb @@ -1,3 +1,3 @@ module Bolognese - VERSION = "1.8.12" + VERSION = "1.8.13" end diff --git a/lib/bolognese/writers/bibtex_writer.rb b/lib/bolognese/writers/bibtex_writer.rb index 9ea21e05..99f5eee7 100644 --- a/lib/bolognese/writers/bibtex_writer.rb +++ b/lib/bolognese/writers/bibtex_writer.rb @@ -6,7 +6,7 @@ module BibtexWriter def bibtex return nil unless valid? - pages = container.to_h["firstPage"].present? ? [container["firstPage"], container["lastPage"]].join("-") : nil + pages = container.to_h["firstPage"].present? ? [container["firstPage"], container["lastPage"]].compact.join("-") : nil bib = { bibtex_type: types["bibtex"].presence || "misc", diff --git a/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_crossref_metadata/article_id_as_page_number.yml b/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_crossref_metadata/article_id_as_page_number.yml new file mode 100644 index 00000000..5399b47e --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_crossref_metadata/article_id_as_page_number.yml @@ -0,0 +1,100 @@ +--- +http_interactions: +- request: + method: get + uri: https://doi.org/ra/10.1103 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.7.2; mailto:info@datacite.org) + Accept: + - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 + response: + status: + code: 200 + message: '' + headers: + Date: + - Mon, 12 Oct 2020 21:29:38 GMT + Content-Type: + - application/json;charset=UTF-8 + Connection: + - keep-alive + Set-Cookie: + - __cfduid=db4cdafcb2a4ecdd2039ecc54bc79d52a1602538178; expires=Wed, 11-Nov-20 + 21:29:38 GMT; path=/; domain=.doi.org; HttpOnly; SameSite=Lax; Secure + Cf-Cache-Status: + - DYNAMIC + Cf-Request-Id: + - 05c051217300001f21b40ee200000001 + Expect-Ct: + - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report?lkg-colo=71&lkg-time=1602538179"}],"group":"cf-nel","max_age":604800}' + Nel: + - '{"report_to":"cf-nel","max_age":604800}' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Server: + - cloudflare + Cf-Ray: + - 5e13eae258061f21-FRA + Alt-Svc: + - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400 + body: + encoding: ASCII-8BIT + string: |- + [ + { + "DOI": "10.1103", + "RA": "Crossref" + } + ] + http_version: + recorded_at: Mon, 12 Oct 2020 21:29:38 GMT +- request: + method: get + uri: https://api.crossref.org/works/10.1103/physrevlett.120.117701/transform/application/vnd.crossref.unixsd+xml + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Mozilla/5.0 (compatible; Maremma/4.7.2; mailto:info@datacite.org) + Accept: + - text/xml + response: + status: + code: 200 + message: OK + headers: + Link: + - ; rel="canonical", ; + version="vor"; rel="item", ; + version="vor"; rel="item", ; + version="vor"; rel="license" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Headers: + - X-Requested-With + Content-Length: + - '15204' + Server: + - http-kit + Date: + - Mon, 12 Oct 2020 21:29:39 GMT + X-Rate-Limit-Limit: + - '50' + X-Rate-Limit-Interval: + - 1s + Connection: + - close + body: + encoding: ASCII-8BIT + string: !binary |- + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGNyb3NzcmVmX3Jlc3VsdCB4bWxucz0iaHR0cDovL3d3dy5jcm9zc3JlZi5vcmcvcXJzY2hlbWEvMy4wIiB2ZXJzaW9uPSIzLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5jcm9zc3JlZi5vcmcvcXJzY2hlbWEvMy4wIGh0dHA6Ly93d3cuY3Jvc3NyZWYub3JnL3NjaGVtYXMvY3Jvc3NyZWZfcXVlcnlfb3V0cHV0My4wLnhzZCI+DQogIDxxdWVyeV9yZXN1bHQ+DQogICAgPGhlYWQ+DQogICAgICA8ZG9pX2JhdGNoX2lkPm5vbmU8L2RvaV9iYXRjaF9pZD4NCiAgICA8L2hlYWQ+DQogICAgPGJvZHk+DQogICAgICA8cXVlcnkgc3RhdHVzPSJyZXNvbHZlZCI+DQogICAgICAgIDxkb2kgdHlwZT0iam91cm5hbF9hcnRpY2xlIj4xMC4xMTAzL1BoeXNSZXZMZXR0LjEyMC4xMTc3MDE8L2RvaT4NCiAgICAgICAgPGNybS1pdGVtIG5hbWU9InB1Ymxpc2hlci1uYW1lIiB0eXBlPSJzdHJpbmciPkFtZXJpY2FuIFBoeXNpY2FsIFNvY2lldHkgKEFQUyk8L2NybS1pdGVtPg0KICAgICAgICA8Y3JtLWl0ZW0gbmFtZT0icHJlZml4LW5hbWUiIHR5cGU9InN0cmluZyI+QW1lcmljYW4gUGh5c2ljYWwgU29jaWV0eTwvY3JtLWl0ZW0+DQogICAgICAgIDxjcm0taXRlbSBuYW1lPSJtZW1iZXItaWQiIHR5cGU9Im51bWJlciI+MTY8L2NybS1pdGVtPg0KICAgICAgICA8Y3JtLWl0ZW0gbmFtZT0iY2l0YXRpb24taWQiIHR5cGU9Im51bWJlciI+OTcxNTAxMzU8L2NybS1pdGVtPg0KICAgICAgICA8Y3JtLWl0ZW0gbmFtZT0iam91cm5hbC1pZCIgdHlwZT0ibnVtYmVyIj41MjA0PC9jcm0taXRlbT4NCiAgICAgICAgPGNybS1pdGVtIG5hbWU9ImRlcG9zaXQtdGltZXN0YW1wIiB0eXBlPSJudW1iZXIiPjIwMTgwMzEzMTUxODQ4PC9jcm0taXRlbT4NCiAgICAgICAgPGNybS1pdGVtIG5hbWU9Im93bmVyLXByZWZpeCIgdHlwZT0ic3RyaW5nIj4xMC4xMTAzPC9jcm0taXRlbT4NCiAgICAgICAgPGNybS1pdGVtIG5hbWU9Imxhc3QtdXBkYXRlIiB0eXBlPSJkYXRlIj4yMDE4LTAzLTEzVDExOjE5OjAyWjwvY3JtLWl0ZW0+DQogICAgICAgIDxjcm0taXRlbSBuYW1lPSJjcmVhdGVkIiB0eXBlPSJkYXRlIj4yMDE4LTAzLTEzVDExOjE4OjU2WjwvY3JtLWl0ZW0+DQogICAgICAgIDxjcm0taXRlbSBuYW1lPSJjaXRlZGJ5LWNvdW50IiB0eXBlPSJudW1iZXIiPjI1PC9jcm0taXRlbT4NCiAgICAgICAgPGRvaV9yZWNvcmQ+DQogICAgICAgICAgPGNyb3NzcmVmIHhtbG5zPSJodHRwOi8vd3d3LmNyb3NzcmVmLm9yZy94c2NoZW1hLzEuMSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmNyb3NzcmVmLm9yZy94c2NoZW1hLzEuMSBodHRwOi8vZG9pLmNyb3NzcmVmLm9yZy9zY2hlbWFzL3VuaXhyZWYxLjEueHNkIj4NCiAgICAgICAgICAgIDxqb3VybmFsPg0KICAgICAgICAgICAgICA8am91cm5hbF9tZXRhZGF0YSBsYW5ndWFnZT0iZW4iPg0KICAgICAgICAgICAgICAgIDxmdWxsX3RpdGxlPlBoeXNpY2FsIFJldmlldyBMZXR0ZXJzPC9mdWxsX3RpdGxlPg0KICAgICAgICAgICAgICAgIDxhYmJyZXZfdGl0bGU+UGh5cy4gUmV2LiBMZXR0LjwvYWJicmV2X3RpdGxlPg0KICAgICAgICAgICAgICAgIDxpc3NuIG1lZGlhX3R5cGU9InByaW50Ij4wMDMxLTkwMDc8L2lzc24+DQogICAgICAgICAgICAgICAgPGlzc24gbWVkaWFfdHlwZT0iZWxlY3Ryb25pYyI+MTA3OS03MTE0PC9pc3NuPg0KICAgICAgICAgICAgICAgIDxjb2Rlbj5QUkxUQU88L2NvZGVuPg0KICAgICAgICAgICAgICA8L2pvdXJuYWxfbWV0YWRhdGE+DQogICAgICAgICAgICAgIDxqb3VybmFsX2lzc3VlPg0KICAgICAgICAgICAgICAgIDxwdWJsaWNhdGlvbl9kYXRlIG1lZGlhX3R5cGU9InByaW50Ij4NCiAgICAgICAgICAgICAgICAgIDxtb250aD4zPC9tb250aD4NCiAgICAgICAgICAgICAgICAgIDx5ZWFyPjIwMTg8L3llYXI+DQogICAgICAgICAgICAgICAgPC9wdWJsaWNhdGlvbl9kYXRlPg0KICAgICAgICAgICAgICAgIDxqb3VybmFsX3ZvbHVtZT4NCiAgICAgICAgICAgICAgICAgIDx2b2x1bWU+MTIwPC92b2x1bWU+DQogICAgICAgICAgICAgICAgPC9qb3VybmFsX3ZvbHVtZT4NCiAgICAgICAgICAgICAgICA8aXNzdWU+MTE8L2lzc3VlPg0KICAgICAgICAgICAgICA8L2pvdXJuYWxfaXNzdWU+DQogICAgICAgICAgICAgIDxqb3VybmFsX2FydGljbGUgcHVibGljYXRpb25fdHlwZT0iZnVsbF90ZXh0Ij4NCiAgICAgICAgICAgICAgICA8dGl0bGVzPg0KICAgICAgICAgICAgICAgICAgPHRpdGxlPlByZWRpY3Rpb24gb2YgYSBMYXJnZS1HYXAgYW5kIFN3aXRjaGFibGUgS2FuZS1NZWxlIFF1YW50dW0gU3BpbiBIYWxsIEluc3VsYXRvcjwvdGl0bGU+DQogICAgICAgICAgICAgICAgPC90aXRsZXM+DQogICAgICAgICAgICAgICAgPGNvbnRyaWJ1dG9ycz4NCiAgICAgICAgICAgICAgICAgIDxwZXJzb25fbmFtZSBzZXF1ZW5jZT0iZmlyc3QiIGNvbnRyaWJ1dG9yX3JvbGU9ImF1dGhvciI+DQogICAgICAgICAgICAgICAgICAgIDxnaXZlbl9uYW1lPkFudGltbzwvZ2l2ZW5fbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgPHN1cm5hbWU+TWFycmF6em88L3N1cm5hbWU+DQogICAgICAgICAgICAgICAgICA8L3BlcnNvbl9uYW1lPg0KICAgICAgICAgICAgICAgICAgPHBlcnNvbl9uYW1lIHNlcXVlbmNlPSJhZGRpdGlvbmFsIiBjb250cmlidXRvcl9yb2xlPSJhdXRob3IiPg0KICAgICAgICAgICAgICAgICAgICA8Z2l2ZW5fbmFtZT5NYXJjbzwvZ2l2ZW5fbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgPHN1cm5hbWU+R2liZXJ0aW5pPC9zdXJuYW1lPg0KICAgICAgICAgICAgICAgICAgPC9wZXJzb25fbmFtZT4NCiAgICAgICAgICAgICAgICAgIDxwZXJzb25fbmFtZSBzZXF1ZW5jZT0iYWRkaXRpb25hbCIgY29udHJpYnV0b3Jfcm9sZT0iYXV0aG9yIj4NCiAgICAgICAgICAgICAgICAgICAgPGdpdmVuX25hbWU+RGF2aWRlPC9naXZlbl9uYW1lPg0KICAgICAgICAgICAgICAgICAgICA8c3VybmFtZT5DYW1waTwvc3VybmFtZT4NCiAgICAgICAgICAgICAgICAgIDwvcGVyc29uX25hbWU+DQogICAgICAgICAgICAgICAgICA8cGVyc29uX25hbWUgc2VxdWVuY2U9ImFkZGl0aW9uYWwiIGNvbnRyaWJ1dG9yX3JvbGU9ImF1dGhvciI+DQogICAgICAgICAgICAgICAgICAgIDxnaXZlbl9uYW1lPk5pY29sYXM8L2dpdmVuX25hbWU+DQogICAgICAgICAgICAgICAgICAgIDxzdXJuYW1lPk1vdW5ldDwvc3VybmFtZT4NCiAgICAgICAgICAgICAgICAgIDwvcGVyc29uX25hbWU+DQogICAgICAgICAgICAgICAgICA8cGVyc29uX25hbWUgc2VxdWVuY2U9ImFkZGl0aW9uYWwiIGNvbnRyaWJ1dG9yX3JvbGU9ImF1dGhvciI+DQogICAgICAgICAgICAgICAgICAgIDxnaXZlbl9uYW1lPk5pY29sYTwvZ2l2ZW5fbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgPHN1cm5hbWU+TWFyemFyaTwvc3VybmFtZT4NCiAgICAgICAgICAgICAgICAgIDwvcGVyc29uX25hbWU+DQogICAgICAgICAgICAgICAgPC9jb250cmlidXRvcnM+DQogICAgICAgICAgICAgICAgPHB1YmxpY2F0aW9uX2RhdGUgbWVkaWFfdHlwZT0ib25saW5lIj4NCiAgICAgICAgICAgICAgICAgIDxtb250aD4zPC9tb250aD4NCiAgICAgICAgICAgICAgICAgIDxkYXk+MTM8L2RheT4NCiAgICAgICAgICAgICAgICAgIDx5ZWFyPjIwMTg8L3llYXI+DQogICAgICAgICAgICAgICAgPC9wdWJsaWNhdGlvbl9kYXRlPg0KICAgICAgICAgICAgICAgIDxwdWJsaXNoZXJfaXRlbT4NCiAgICAgICAgICAgICAgICAgIDxpdGVtX251bWJlciBpdGVtX251bWJlcl90eXBlPSJhcnRpY2xlLW51bWJlciI+MTE3NzAxPC9pdGVtX251bWJlcj4NCiAgICAgICAgICAgICAgICA8L3B1Ymxpc2hlcl9pdGVtPg0KICAgICAgICAgICAgICAgIDxjcm9zc21hcms+DQogICAgICAgICAgICAgICAgICA8Y3Jvc3NtYXJrX3ZlcnNpb24+Mi4wPC9jcm9zc21hcmtfdmVyc2lvbj4NCiAgICAgICAgICAgICAgICAgIDxjcm9zc21hcmtfcG9saWN5PjEwLjExMDMvY3Jvc3NtYXJrLXBvbGljeTwvY3Jvc3NtYXJrX3BvbGljeT4NCiAgICAgICAgICAgICAgICAgIDxjcm9zc21hcmtfZG9tYWlucz4NCiAgICAgICAgICAgICAgICAgICAgPGNyb3NzbWFya19kb21haW4+DQogICAgICAgICAgICAgICAgICAgICAgPGRvbWFpbj5qb3VybmFscy5hcHMub3JnPC9kb21haW4+DQogICAgICAgICAgICAgICAgICAgIDwvY3Jvc3NtYXJrX2RvbWFpbj4NCiAgICAgICAgICAgICAgICAgIDwvY3Jvc3NtYXJrX2RvbWFpbnM+DQogICAgICAgICAgICAgICAgICA8Y3Jvc3NtYXJrX2RvbWFpbl9leGNsdXNpdmU+dHJ1ZTwvY3Jvc3NtYXJrX2RvbWFpbl9leGNsdXNpdmU+DQogICAgICAgICAgICAgICAgICA8Y3VzdG9tX21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICA8ZnI6cHJvZ3JhbSB4bWxuczpmcj0iaHR0cDovL3d3dy5jcm9zc3JlZi5vcmcvZnVuZHJlZi54c2QiIG5hbWU9ImZ1bmRyZWYiPg0KICAgICAgICAgICAgICAgICAgICAgIDxmcjphc3NlcnRpb24gbmFtZT0iZnVuZGdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxmcjphc3NlcnRpb24gbmFtZT0iZnVuZGVyX25hbWUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICBTY2h3ZWl6ZXJpc2NoZXIgTmF0aW9uYWxmb25kcyB6dXIgRsO2cmRlcnVuZyBkZXIgV2lzc2Vuc2NoYWZ0bGljaGVuIEZvcnNjaHVuZw0KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZnI6YXNzZXJ0aW9uIG5hbWU9ImZ1bmRlcl9pZGVudGlmaWVyIj5odHRwOi8vZHguZG9pLm9yZy8xMC4xMzAzOS81MDExMDAwMDE3MTE8L2ZyOmFzc2VydGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZnI6YXNzZXJ0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgIDwvZnI6YXNzZXJ0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgIDxmcjphc3NlcnRpb24gbmFtZT0iZnVuZGdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxmcjphc3NlcnRpb24gbmFtZT0iZnVuZGVyX25hbWUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICBIb3Jpem9uIDIwMjAgRnJhbWV3b3JrIFByb2dyYW1tZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZnI6YXNzZXJ0aW9uIG5hbWU9ImZ1bmRlcl9pZGVudGlmaWVyIj5odHRwOi8vZHguZG9pLm9yZy8xMC4xMzAzOS8xMDAwMTA2NjE8L2ZyOmFzc2VydGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZnI6YXNzZXJ0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgIDwvZnI6YXNzZXJ0aW9uPg0KICAgICAgICAgICAgICAgICAgICA8L2ZyOnByb2dyYW0+DQogICAgICAgICAgICAgICAgICAgIDxhaTpwcm9ncmFtIHhtbG5zOmFpPSJodHRwOi8vd3d3LmNyb3NzcmVmLm9yZy9BY2Nlc3NJbmRpY2F0b3JzLnhzZCIgbmFtZT0iQWNjZXNzSW5kaWNhdG9ycyI+DQogICAgICAgICAgICAgICAgICAgICAgPGFpOmxpY2Vuc2VfcmVmIGFwcGxpZXNfdG89InZvciIgc3RhcnRfZGF0ZT0iMjAxOC0wMy0xMyI+aHR0cHM6Ly9saW5rLmFwcy5vcmcvbGljZW5zZXMvYXBzLWRlZmF1bHQtbGljZW5zZTwvYWk6bGljZW5zZV9yZWY+DQogICAgICAgICAgICAgICAgICAgIDwvYWk6cHJvZ3JhbT4NCiAgICAgICAgICAgICAgICAgIDwvY3VzdG9tX21ldGFkYXRhPg0KICAgICAgICAgICAgICAgIDwvY3Jvc3NtYXJrPg0KICAgICAgICAgICAgICAgIDxkb2lfZGF0YT4NCiAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2TGV0dC4xMjAuMTE3NzAxPC9kb2k+DQogICAgICAgICAgICAgICAgICA8dGltZXN0YW1wPjIwMTgwMzEzMTUxODQ4PC90aW1lc3RhbXA+DQogICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+aHR0cHM6Ly9saW5rLmFwcy5vcmcvZG9pLzEwLjExMDMvUGh5c1JldkxldHQuMTIwLjExNzcwMTwvcmVzb3VyY2U+DQogICAgICAgICAgICAgICAgICA8Y29sbGVjdGlvbiBwcm9wZXJ0eT0iY3Jhd2xlci1iYXNlZCI+DQogICAgICAgICAgICAgICAgICAgIDxpdGVtIGNyYXdsZXI9ImlQYXJhZGlnbXMiPg0KICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT5odHRwOi8vaGFydmVzdC5hcHMub3JnL3YyL2pvdXJuYWxzL2FydGljbGVzLzEwLjExMDMvUGh5c1JldkxldHQuMTIwLjExNzcwMS9mdWxsdGV4dDwvcmVzb3VyY2U+DQogICAgICAgICAgICAgICAgICAgIDwvaXRlbT4NCiAgICAgICAgICAgICAgICAgIDwvY29sbGVjdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjb2xsZWN0aW9uIHByb3BlcnR5PSJzeW5kaWNhdGlvbiI+DQogICAgICAgICAgICAgICAgICAgIDxpdGVtPg0KICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZSBjb250ZW50X3ZlcnNpb249InZvciI+aHR0cHM6Ly9saW5rLmFwcy5vcmcvYXJ0aWNsZS8xMC4xMTAzL1BoeXNSZXZMZXR0LjEyMC4xMTc3MDE8L3Jlc291cmNlPg0KICAgICAgICAgICAgICAgICAgICA8L2l0ZW0+DQogICAgICAgICAgICAgICAgICA8L2NvbGxlY3Rpb24+DQogICAgICAgICAgICAgICAgPC9kb2lfZGF0YT4NCiAgICAgICAgICAgICAgICA8Y2l0YXRpb25fbGlzdD4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzFSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2TGV0dC42MS4yMDE1PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMlIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZMZXR0Ljk1LjIyNjgwMTwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzNSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2TGV0dC45NS4xNDY4MDI8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M0UjEiPg0KICAgICAgICAgICAgICAgICAgICA8dm9sdW1lX3RpdGxlPlRvcG9sb2dpY2FsIEluc3VsYXRvcnMgYW5kIFRvcG9sb2dpY2FsIFN1cGVyY29uZHVjdG9yczwvdm9sdW1lX3RpdGxlPg0KICAgICAgICAgICAgICAgICAgICA8YXV0aG9yPkIu4oCJQS4gQmVybmV2aWc8L2F1dGhvcj4NCiAgICAgICAgICAgICAgICAgICAgPGNZZWFyPjIwMTM8L2NZZWFyPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pIHByb3ZpZGVyPSJjcm9zc3JlZiI+MTAuMTUxNS85NzgxNDAwODQ2NzMzPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjNVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTI2L3NjaWVuY2UuMTE0ODA0NzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzZSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEyNi9zY2llbmNlLjExMzM3MzQ8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M3UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwMzgvbm1hdDUwMTI8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M4UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjExMjYvc2NpZW5jZS5hYWk4MTQyPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjOVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTExL2ouMTM2NS0zMTIxLjIwMDcuMDA3ODMueDwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzEwUjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjM3NDkvY2FubWluLjUwLjIuNDMxPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMTNSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTA4OC8wOTUzLTg5ODQvMjEvMzkvMzk1NTAyPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMTRSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTA4OC8xMzYxLTY0OFgvYWE4Zjc5PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMTVSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2Qi44Mi4wODExMDE8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2MxNlIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjgxLjE2MTEwNDwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzE3UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjExMDMvUGh5c1JldkxldHQuMTAzLjA2MzAwNDwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzE4UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjExMDMvUGh5c1JldkIuODcuMDQxMTA4PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMTlSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2TGV0dC4xMDIuMDczMDA1PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMjBSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2TGV0dC43Ny4zODY1PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMjFSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2Qi44OC4wODUxMTc8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2MyNFIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMDE2L2ouY29tbWF0c2NpLjIwMTMuMDguMDUzPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMjZSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTAxNi9qLmNvbW1hdHNjaS4yMDE0LjA3LjA0MzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzI3UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwMTYvai5jcGMuMjAxNS4wNS4wMTE8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2MyOFIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMDE2L2ouY3BjLjIwMDkuMDIuMDAzPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMjlSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTAxNi9qLmNwYy4yMDE0LjA1LjAwMzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzMwUjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwMTYvai5jb21tYXRzY2kuMjAxNS4wOS4wMTM8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2MzMVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZMZXR0LjEwOC4yMzU1MDI8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2MzM1IxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1Jldk1vZFBoeXMuODQuMTQxOTwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzM0UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjExMDMvUGh5c1JldkIuODQuMTk1NDMwPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMzZSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTAxNi9qLmNwYy4yMDE3LjA5LjAzMzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzM3UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjExMDMvUGh5c1JldkIuODMuMjM1NDAxPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjMzhSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2Qi45NS4wNzUxNDY8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2MzOVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjY0LjExNTIwMjwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzQwUjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwMzgvbnBoeXM0MDkxPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjNDFSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTAzOC9ucGh5czQxNzQ8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M0MlIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTI2L3NjaWVuY2UuYWFuNjAwMzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzQzUjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwODgvMDMwNS00NjA4LzE1LzQvMDA5PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjNDRSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2TGV0dC45NS4wNzY4MDQ8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M0NVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjY5LjAzNTEwODwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzQ2UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjExMDMvUmV2TW9kUGh5cy43My41MTU8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M0N1IxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjk2LjA3NTQ0ODwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzQ4UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwMjEvYWNzLm5hbm9sZXR0LjdiMDEwOTA8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M0OVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjE5LjM1OTM8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M1MFIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjUzLjUwNDc8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M1NFIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZMZXR0LjExNy4yMjY4MDE8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M1NVIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZMZXR0LjExNy4yNDY0MDE8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M1NlIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMDM4L25jb21tczgzMTU8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M1N1IxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMDM4L25hdHVyZTIzOTA1PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjNTlSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTAwMi93Y21zLjEyODA8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M2MFIxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjY4LjA0NTQwNzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzYxUjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwMjEvbmw0MDA3NDc5PC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgICAgPGNpdGF0aW9uIGtleT0iUGh5c1JldkxldHQuMTIwLjExNzcwMUNjNjJSMSI+DQogICAgICAgICAgICAgICAgICAgIDxkb2k+MTAuMTEwMy9QaHlzUmV2Qi45MS4xMjUzMDQ8L2RvaT4NCiAgICAgICAgICAgICAgICAgIDwvY2l0YXRpb24+DQogICAgICAgICAgICAgICAgICA8Y2l0YXRpb24ga2V5PSJQaHlzUmV2TGV0dC4xMjAuMTE3NzAxQ2M2M1IxIj4NCiAgICAgICAgICAgICAgICAgICAgPGRvaT4xMC4xMTAzL1BoeXNSZXZCLjg5LjIwNTQxNzwvZG9pPg0KICAgICAgICAgICAgICAgICAgPC9jaXRhdGlvbj4NCiAgICAgICAgICAgICAgICAgIDxjaXRhdGlvbiBrZXk9IlBoeXNSZXZMZXR0LjEyMC4xMTc3MDFDYzY0UjEiPg0KICAgICAgICAgICAgICAgICAgICA8ZG9pPjEwLjEwNjMvMS40ODI0ODkzPC9kb2k+DQogICAgICAgICAgICAgICAgICA8L2NpdGF0aW9uPg0KICAgICAgICAgICAgICAgIDwvY2l0YXRpb25fbGlzdD4NCiAgICAgICAgICAgICAgPC9qb3VybmFsX2FydGljbGU+DQogICAgICAgICAgICA8L2pvdXJuYWw+DQogICAgICAgICAgPC9jcm9zc3JlZj4NCiAgICAgICAgPC9kb2lfcmVjb3JkPg0KICAgICAgPC9xdWVyeT4NCiAgICA8L2JvZHk+DQogIDwvcXVlcnlfcmVzdWx0Pg0KPC9jcm9zc3JlZl9yZXN1bHQ+ + http_version: + recorded_at: Mon, 12 Oct 2020 21:29:39 GMT +recorded_with: VCR 3.0.3 diff --git a/spec/readers/crossref_reader_spec.rb b/spec/readers/crossref_reader_spec.rb index a080811d..9ef7559b 100644 --- a/spec/readers/crossref_reader_spec.rb +++ b/spec/readers/crossref_reader_spec.rb @@ -33,7 +33,7 @@ expect(subject.dates).to eq([{"date"=>"2014-02-11", "dateType"=>"Issued"}, {"date"=>"2018-08-23T13:41:49Z", "dateType"=>"Updated"}]) expect(subject.publication_year).to eq("2014") expect(subject.publisher).to eq("eLife Sciences Publications, Ltd") - expect(subject.container).to eq("identifier"=>"2050-084X", "identifierType"=>"ISSN", "title"=>"eLife", "type"=>"Journal", "volume"=>"3") + expect(subject.container).to eq("firstPage" => "e01567", "identifier"=>"2050-084X", "identifierType"=>"ISSN", "title"=>"eLife", "type"=>"Journal", "volume"=>"3") expect(subject.related_identifiers.length).to eq(27) expect(subject.related_identifiers.first).to eq("relatedIdentifier"=>"2050-084X", "relatedIdentifierType"=>"ISSN", "relationType"=>"IsPartOf", "resourceTypeGeneral"=>"Collection") expect(subject.related_identifiers.last).to eq("relatedIdentifier"=>"10.1038/ncb2764", "relatedIdentifierType"=>"DOI", "relationType"=>"References") @@ -100,7 +100,7 @@ expect(subject.related_identifiers.length).to eq(70) expect(subject.related_identifiers.first).to eq("relatedIdentifier"=>"1664-462X", "relatedIdentifierType"=>"ISSN", "relationType"=>"IsPartOf", "resourceTypeGeneral"=>"Collection") expect(subject.related_identifiers.last).to eq("relatedIdentifier"=>"10.17660/actahortic.2004.632.41", "relatedIdentifierType"=>"DOI", "relationType"=>"References") - expect(subject.container).to eq("identifier"=>"1664-462X", "identifierType"=>"ISSN", "title"=>"Frontiers in Plant Science", "type"=>"Journal", "volume"=>"10") + expect(subject.container).to eq("firstPage" => "816", "identifier"=>"1664-462X", "identifierType"=>"ISSN", "title"=>"Frontiers in Plant Science", "type"=>"Journal", "volume"=>"10") expect(subject.agency).to eq("crossref") end @@ -718,6 +718,24 @@ expect(subject.date_registered).to eq("2012-10-31T16:15:44Z") end + it "article id as page number" do + input = "https://doi.org/10.1103/physrevlett.120.117701" + subject = Bolognese::Metadata.new(input: input) + expect(subject.valid?).to be true + expect(subject.id).to eq("https://doi.org/10.1103/physrevlett.120.117701") + expect(subject.url).to eq("https://link.aps.org/doi/10.1103/PhysRevLett.120.117701") + expect(subject.types).to eq("bibtex"=>"article", "citeproc"=>"article-journal", "resourceType"=>"JournalArticle", "resourceTypeGeneral"=>"Text", "ris"=>"JOUR", "schemaOrg"=>"ScholarlyArticle") + expect(subject.creators.length).to eq(5) + expect(subject.creators.first).to eq("familyName"=>"Marrazzo", "givenName"=>"Antimo", "name"=>"Marrazzo, Antimo", "nameType"=>"Personal") + expect(subject.titles).to eq([{"title"=>"Prediction of a Large-Gap and Switchable Kane-Mele Quantum Spin Hall Insulator"}]) + expect(subject.dates).to include({"date"=>"2018-03-13", "dateType"=>"Issued"}) + expect(subject.publication_year).to eq("2018") + expect(subject.publisher).to eq("American Physical Society (APS)") + expect(subject.container).to eq("firstPage" => "117701", "identifier"=>"1079-7114", "identifierType"=>"ISSN", "issue"=>"11", "title"=>"Physical Review Letters", "type"=>"Journal", "volume"=>"120") + expect(subject.agency).to eq("crossref") + expect(subject.date_registered).to eq("2018-03-13T15:18:48Z") + end + it "posted content copernicus" do input = "https://doi.org/10.5194/CP-2020-95" subject = Bolognese::Metadata.new(input: input) diff --git a/spec/writers/bibtex_writer_spec.rb b/spec/writers/bibtex_writer_spec.rb index d35dbbe8..1cc2be21 100644 --- a/spec/writers/bibtex_writer_spec.rb +++ b/spec/writers/bibtex_writer_spec.rb @@ -56,7 +56,7 @@ expect(bibtex[:bibtex_key]).to eq("https://doi.org/10.3204/desy-2014-01645") expect(bibtex[:doi]).to eq("10.3204/desy-2014-01645") expect(bibtex[:title]).to eq("Dynamics of colloids in molecular glass forming liquids studied via X-ray photon correlation spectroscopy") - expect(bibtex[:pages]).to eq("2014-") + expect(bibtex[:pages]).to eq("2014") expect(bibtex[:year]).to eq("2014") end diff --git a/spec/writers/citation_writer_spec.rb b/spec/writers/citation_writer_spec.rb index a06cbef0..0973c3bb 100644 --- a/spec/writers/citation_writer_spec.rb +++ b/spec/writers/citation_writer_spec.rb @@ -9,7 +9,7 @@ subject = Bolognese::Metadata.new(input: input, from: "crossref") expect(subject.style).to eq("apa") expect(subject.locale).to eq("en-US") - expect(subject.citation).to eq("Sankar, M., Nieminen, K., Ragni, L., Xenarios, I., & Hardtke, C. S. (2014). Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth. ELife, 3. https://doi.org/10.7554/elife.01567") + expect(subject.citation).to eq("Sankar, M., Nieminen, K., Ragni, L., Xenarios, I., & Hardtke, C. S. (2014). Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth. ELife, 3, e01567. https://doi.org/10.7554/elife.01567") end it "Journal article vancouver style" do @@ -17,7 +17,7 @@ subject = Bolognese::Metadata.new(input: input, from: "crossref", style: "vancouver", locale: "en-US") expect(subject.style).to eq("vancouver") expect(subject.locale).to eq("en-US") - expect(subject.citation).to eq("Sankar M, Nieminen K, Ragni L, Xenarios I, Hardtke CS. Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth. eLife [Internet]. 2014Feb11;3. Available from: https://elifesciences.org/articles/01567") + expect(subject.citation).to eq("Sankar M, Nieminen K, Ragni L, Xenarios I, Hardtke CS. Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth. eLife [Internet]. 2014Feb11;3:e01567. Available from: https://elifesciences.org/articles/01567") end it "Dataset" do diff --git a/spec/writers/datacite_writer_spec.rb b/spec/writers/datacite_writer_spec.rb index 1388733a..f276354f 100644 --- a/spec/writers/datacite_writer_spec.rb +++ b/spec/writers/datacite_writer_spec.rb @@ -316,7 +316,7 @@ subject.descriptions = { "description" => "This is an abstract." } expect(subject.valid?).to be true datacite = Maremma.from_xml(subject.datacite).fetch("resource", {}) - expect(datacite.dig("descriptions", "description")).to eq( [{"__content__"=>"eLife, 3", "descriptionType"=>"SeriesInformation"}, {"__content__"=>"This is an abstract.", "descriptionType"=>"Abstract"}]) + expect(datacite.dig("descriptions", "description")).to eq([{"__content__"=>"eLife, 3, e01567", "descriptionType"=>"SeriesInformation"}, {"__content__"=>"This is an abstract.", "descriptionType"=>"Abstract"}]) end it "change description no input" do diff --git a/spec/writers/ris_writer_spec.rb b/spec/writers/ris_writer_spec.rb index 35211959..b1ccf928 100644 --- a/spec/writers/ris_writer_spec.rb +++ b/spec/writers/ris_writer_spec.rb @@ -19,8 +19,9 @@ expect(ris[11]).to eq("PY - 2014") expect(ris[12]).to eq("PB - eLife Sciences Publications, Ltd") expect(ris[13]).to eq("VL - 3") - expect(ris[14]).to eq("SN - 2050-084X") - expect(ris[15]).to eq("ER - ") + expect(ris[14]).to eq("SP - e01567") + expect(ris[15]).to eq("SN - 2050-084X") + expect(ris[16]).to eq("ER - ") end it "with pages" do diff --git a/spec/writers/schema_org_writer_spec.rb b/spec/writers/schema_org_writer_spec.rb index 047f9622..7e62d941 100644 --- a/spec/writers/schema_org_writer_spec.rb +++ b/spec/writers/schema_org_writer_spec.rb @@ -11,7 +11,7 @@ expect(json["@id"]).to eq("https://doi.org/10.7554/elife.01567") expect(json["@type"]).to eq("ScholarlyArticle") expect(json["isPartOf"]).to eq("@type"=>"Periodical", "issn"=>"2050-084X") - expect(json["periodical"]).to eq("@type"=>"Journal", "identifier"=>"2050-084X", "identifierType"=>"ISSN", "name"=>"eLife", "volume"=>"3") + expect(json["periodical"]).to eq("@type"=>"Journal", "firstPage" => "e01567", "identifier"=>"2050-084X", "identifierType"=>"ISSN", "name"=>"eLife", "volume"=>"3") expect(json["citation"].length).to eq(26) expect(json["citation"].first).to eq("@id"=>"https://doi.org/10.1038/nature02100", "@type"=>"CreativeWork") expect(json["funder"]).to eq([{"name"=>"SystemsX", "@type"=>"Organization"},