enju_oai 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +11 -0
  3. data/app/controllers/oai_controller.rb +1 -0
  4. data/app/views/oai/list_identifiers.xml.builder +8 -10
  5. data/app/views/oai/list_records.xml.builder +16 -18
  6. data/lib/enju_oai/oai_controller.rb +1 -0
  7. data/lib/enju_oai/version.rb +1 -1
  8. data/spec/cassette_library/oai/list_records_xml_builder/when_metadataPrefix_is_dcndl/renders_well-formed_XML.yml +25 -24
  9. data/spec/controllers/oai_controller_spec.rb +25 -0
  10. data/spec/dummy/app/models/application_record.rb +3 -0
  11. data/spec/dummy/config/application.rb +1 -1
  12. data/spec/dummy/config/database.yml +17 -22
  13. data/spec/dummy/db/migrate/059_create_libraries.rb +3 -5
  14. data/spec/dummy/db/migrate/069_create_shelves.rb +1 -2
  15. data/spec/dummy/db/migrate/080_create_library_groups.rb +1 -2
  16. data/spec/dummy/db/migrate/120_create_baskets.rb +1 -2
  17. data/spec/dummy/db/migrate/20081006090811_create_subscriptions.rb +2 -5
  18. data/spec/dummy/db/migrate/20081006093246_create_subscribes.rb +1 -2
  19. data/spec/dummy/db/migrate/20081027150907_create_picture_files.rb +0 -2
  20. data/spec/dummy/db/migrate/20091012101112_add_dcndl_schema.rb +2 -2
  21. data/spec/dummy/db/migrate/20100606065209_create_user_has_roles.rb +2 -4
  22. data/spec/dummy/db/migrate/20120319173203_create_accepts.rb +3 -6
  23. data/spec/dummy/db/migrate/20140110122216_create_user_import_files.rb +1 -1
  24. data/spec/dummy/db/migrate/20140110131010_create_user_import_results.rb +2 -2
  25. data/spec/dummy/db/migrate/20140122054321_create_profiles.rb +4 -5
  26. data/spec/dummy/db/migrate/20140524074813_create_user_import_file_transitions.rb +1 -2
  27. data/spec/dummy/db/migrate/20140709113413_create_user_export_files.rb +1 -1
  28. data/spec/dummy/db/migrate/20140709113905_create_user_export_file_transitions.rb +1 -1
  29. data/spec/dummy/db/migrate/20140720170714_add_default_library_id_to_user_import_file.rb +1 -1
  30. data/spec/dummy/db/migrate/20140720170735_add_default_user_group_id_to_user_import_file.rb +1 -1
  31. data/spec/dummy/db/migrate/20140821151023_create_colors.rb +1 -3
  32. data/spec/dummy/db/migrate/20150117111136_add_foreign_key_to_items_referencing_manifestations.rb +5 -0
  33. data/spec/dummy/db/migrate/20150924115059_create_withdraws.rb +3 -5
  34. data/spec/dummy/db/migrate/20151125004028_add_profile_id_to_agent.rb +6 -0
  35. data/spec/dummy/db/migrate/20151213070943_add_translation_table_to_library_group.rb +11 -6
  36. data/spec/dummy/db/migrate/20151213072705_add_footer_banner_to_library_group.rb +15 -2
  37. data/spec/dummy/db/migrate/20170305064014_add_csv_charset_conversion_to_library_group.rb +5 -0
  38. data/spec/dummy/db/migrate/20171119051258_set_not_null_to_manifestation_id_on_items.rb +5 -0
  39. data/spec/dummy/db/migrate/20180102162311_add_header_logo_meta_to_library_group.rb +5 -0
  40. data/spec/dummy/db/migrate/20180107160726_add_constraints_to_most_recent_for_user_import_file_transitions.rb +13 -0
  41. data/spec/dummy/db/migrate/20180107160740_add_constraints_to_most_recent_for_user_export_file_transitions.rb +13 -0
  42. data/spec/dummy/db/migrate/20180107161311_add_constraints_to_most_recent_for_agent_import_file_transitions.rb +13 -0
  43. data/spec/dummy/db/migrate/20180107161331_add_constraints_to_most_recent_for_resource_import_file_transitions.rb +13 -0
  44. data/spec/dummy/db/migrate/20180107161347_add_constraints_to_most_recent_for_resource_export_file_transitions.rb +13 -0
  45. data/spec/dummy/db/migrate/20180107161410_add_constraints_to_most_recent_for_import_request_transitions.rb +13 -0
  46. data/spec/dummy/db/migrate/20190818075603_add_memo_to_manifestation.rb +5 -0
  47. data/spec/dummy/db/migrate/20190818075628_add_memo_to_item.rb +5 -0
  48. data/spec/dummy/db/migrate/20191219122214_create_custom_properties.rb +12 -0
  49. data/spec/dummy/db/migrate/20200425072340_create_manifestation_custom_properties.rb +12 -0
  50. data/spec/dummy/db/migrate/20200425072349_create_item_custom_properties.rb +12 -0
  51. data/spec/dummy/db/migrate/20200425074758_create_manifestation_custom_values.rb +12 -0
  52. data/spec/dummy/db/migrate/20200425074822_create_item_custom_values.rb +12 -0
  53. data/spec/dummy/db/schema.rb +86 -16
  54. data/spec/factories/user.rb +6 -15
  55. data/spec/views/oai/list_identifiers.xml.builder_spec.rb +11 -4
  56. data/spec/views/oai/list_records.xml.builder_spec.rb +32 -20
  57. metadata +360 -295
  58. data/README.rdoc +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 84d4b8eb920d61b55cc6e551fcda0599a6e94075
4
- data.tar.gz: ff29d269d0ef01af3a2c6e15baea0a89923cef05
2
+ SHA256:
3
+ metadata.gz: 657cc7609b6f1f359d2c84821e58e5db324be49aaf55a98e6824cfd333f3bf58
4
+ data.tar.gz: 904de4f9a94cababee669cb39df0b30e3e3ad8edb4f08ced264d2f9c6ef72cfd
5
5
  SHA512:
6
- metadata.gz: 06a9aa40fdd30a5d3069365912735b30a2493dabfe6f6ff5b0a7c86705ddb2c459059333e64e5a20218eb795315c9e1d7f2061c84f113b13dfa4b3489fe18309
7
- data.tar.gz: 000cca4464e13a37467367c95cd7bf11f70dde75708934d61f811693826f4ac9e150ae7858bd9113c38d627c135090082611bee6b560bb6bb022eb10da57fdcd
6
+ metadata.gz: 931d716daefe83e49001901fdd18cda465fc32ad1887778b4a8c7652a0430fb23aa78866c211906014d222e77b67141aa17957a0f73f0bfc62c236d8bec8a8da
7
+ data.tar.gz: fd09adc6f23c069163510135780c861a6bb688992f0f25bbe1a356e8e2985c996418758da82158abb3b7b935cbe4da8f4cd6b6ba534fafcf49f3d2abcf18655b
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # EnjuEvent
2
+ [![Travis CI](https://travis-ci.com/next-l/enju_oai.svg?branch=1.3)](https://travis-ci.com/next-l/enju_oai)
3
+ [![Coverage Status](https://coveralls.io/repos/github/next-l/enju_oai/badge.svg?branch=1.3)](https://coveralls.io/github/next-l/enju_oai?branch=1.3)
4
+ [![security](https://hakiri.io/github/next-l/enju_oai/1.3.svg)](https://hakiri.io/github/next-l/enju_oai/1.3)
5
+
6
+ This project rocks and uses MIT-LICENSE.
7
+
8
+ ## 製作者・貢献者 (Authors and contributors)
9
+ * [TANABE, Kosuke](https://github.com/nabeta) ([@nabeta](https://twitter.com/nabeta))
10
+ * [Project Next-L](https://www.next-l.jp) ([@ProjectNextL](https://twitter.com/ProjectNextL))
11
+
@@ -22,6 +22,7 @@ class OaiController < ApplicationController
22
22
  order_by :updated_at, :desc
23
23
  paginate cursor: token, per_page: oai_per_page
24
24
  with(:updated_at).between(from_time..until_time)
25
+ with(:required_role_id).equal_to Role.default_role.id
25
26
  end
26
27
  @manifestations = search.execute!.results
27
28
 
@@ -9,20 +9,18 @@ xml.tag! "OAI-PMH", :xmlns => "http://www.openarchives.org/OAI/2.0/",
9
9
  end
10
10
  xml.ListIdentifiers do
11
11
  @manifestations.each do |manifestation|
12
- cache([manifestation, fragment: 'list_identifiers_oai', role: current_user_role_name, locale: @locale]) do
13
- xml.header do
14
- xml.identifier manifestation.oai_identifier
15
- xml.datestamp manifestation.updated_at.utc.iso8601
16
- manifestation.series_statements.each do |series_statement|
17
- xml.setSpec series_statement.id
18
- end
12
+ xml.header do
13
+ xml.identifier manifestation.oai_identifier
14
+ xml.datestamp manifestation.updated_at.utc.iso8601
15
+ manifestation.series_statements.each do |series_statement|
16
+ xml.setSpec series_statement.id
19
17
  end
20
18
  end
21
19
  end
22
- if @manifestations.last_page?
23
- xml.resumptionToken nil, completeListSize: @manifestations.total_count
24
- else
20
+ if @manifestations.next_page_cursor
25
21
  xml.resumptionToken CGI.escape(@manifestations.next_page_cursor), completeListSize: @manifestations.total_count
22
+ else
23
+ xml.resumptionToken nil, completeListSize: @manifestations.total_count
26
24
  end
27
25
  end
28
26
  end
@@ -9,29 +9,27 @@ xml.tag! "OAI-PMH", :xmlns => "http://www.openarchives.org/OAI/2.0/",
9
9
  end
10
10
  xml.ListRecords do
11
11
  @manifestations.each do |manifestation|
12
- cache([manifestation, fragment: 'list_records_oai', role: current_user_role_name, locale: @locale]) do
13
- xml.record do
14
- xml.header do
15
- xml.identifier manifestation.oai_identifier
16
- xml.datestamp manifestation.updated_at.utc.iso8601
17
- end
18
- xml.metadata do
19
- case @oai[:metadataPrefix]
20
- when 'oai_dc', nil
21
- render 'record_oai_dc', manifestation: manifestation, xml_builder: xml
22
- when 'junii2'
23
- render 'record_junii2', manifestation: manifestation, xml_builder: xml
24
- when 'dcndl'
25
- render 'record_dcndl', manifestation: manifestation, xml_builder: xml
26
- end
12
+ xml.record do
13
+ xml.header do
14
+ xml.identifier manifestation.oai_identifier
15
+ xml.datestamp manifestation.updated_at.utc.iso8601
16
+ end
17
+ xml.metadata do
18
+ case @oai[:metadataPrefix]
19
+ when 'oai_dc', nil
20
+ render 'record_oai_dc', manifestation: manifestation, xml_builder: xml
21
+ when 'junii2'
22
+ render 'record_junii2', manifestation: manifestation, xml_builder: xml
23
+ when 'dcndl'
24
+ render 'record_dcndl', manifestation: manifestation, xml_builder: xml
27
25
  end
28
26
  end
29
27
  end
30
28
  end
31
- if @manifestations.last_page?
32
- xml.resumptionToken nil, completeListSize: @manifestations.total_count
33
- else
29
+ if @manifestations.next_page_cursor
34
30
  xml.resumptionToken CGI.escape(@manifestations.next_page_cursor), completeListSize: @manifestations.total_count
31
+ else
32
+ xml.resumptionToken nil, completeListSize: @manifestations.total_count
35
33
  end
36
34
  end
37
35
  end
@@ -14,6 +14,7 @@ module EnjuOai
14
14
  when 'ListSets'
15
15
  when 'ListMetadataFormats'
16
16
  when 'ListIdentifiers'
17
+ oai[:metadataPrefix] = params[:metadataPrefix]
17
18
  unless valid_metadata_format?(params[:metadataPrefix])
18
19
  oai[:errors] << "badArgument"
19
20
  end
@@ -1,3 +1,3 @@
1
1
  module EnjuOai
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -2,13 +2,13 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://iss.ndl.go.jp/api/sru?maximumRecords=1&onlyBib=true&operation=searchRetrieve&query=(itemno=R100000002-I000008369884-00)&recordSchema=dcndl
5
+ uri: https://iss.ndl.go.jp/api/sru?maximumRecords=1&onlyBib=true&operation=searchRetrieve&query=(itemno=R100000002-I000008369884-00)&recordSchema=dcndl
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
10
  User-Agent:
11
- - Faraday v0.13.1
11
+ - Faraday v0.15.4
12
12
  Accept-Encoding:
13
13
  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
14
  Accept:
@@ -19,43 +19,44 @@ http_interactions:
19
19
  message: OK
20
20
  headers:
21
21
  Date:
22
- - Sun, 24 Dec 2017 14:04:29 GMT
22
+ - Sun, 31 Mar 2019 17:41:26 GMT
23
+ X-Ua-Compatible:
24
+ - IE=Edge,chrome=1
25
+ Etag:
26
+ - '"87a80ab1645d4156152f1fee7074af4e"'
23
27
  Cache-Control:
24
28
  - max-age=0, private, must-revalidate
25
29
  X-Runtime:
26
- - '1.372156'
27
- Etag:
28
- - '"9e9a67f99ebaee5f708dd6b1d8baf94f"'
29
- X-Ua-Compatible:
30
- - IE=Edge,chrome=1
30
+ - '1.457844'
31
+ Content-Length:
32
+ - '9881'
31
33
  Status:
32
34
  - '200'
33
35
  Content-Type:
34
36
  - application/xml; charset=utf-8
35
37
  Set-Cookie:
36
- - ROUTEID=.ps19; path=/
37
- - TS01cb7804=011338590a7459f78cdb911c9f82a12f76c4771492652279d2c3d230a335caf6cbc160d00a6952cc1314af66f6a32ade2d0f94f462;
38
- path=/; domain=.iss.ndl.go.jp
39
- - TS01f3cfdf=011338590ae11402eef47f0cc0f4b9c88ec46cee54148b389819a3d4af0770f78a3197bbcacbb531f1c0638f9e25c9474d89cb923e65ef4069b53e7e0fd59133260f7d2dcf5b2610ae91edd214af2ab18f80ead2ed;
38
+ - HTTP_Z308_KEY_DATA_01=; domain=.ndl.go.jp; path=/; expires=Thu, 01-Jan-1970
39
+ 00:00:00 GMT
40
+ - ROUTEID=.ps21; path=/
41
+ - TS0162cc8a=011338590a514376898e160ff4df9a9e5fd61c62535fdd42159fcdad87d3a2eefa401e016b28afd532ae7aec3689bf9f32643f79b1353a13c592d1ec4071b4138959a32e8e3381682c81b0884f3e47ff5300482141;
42
+ path=/; domain=.ndl.go.jp
43
+ - TS01f3cfdf=011338590a675a502cad0b6c8ecba8f9e138ac9061710f1ddce5e0a5781b1fe46e8ce2ab9c2b7e3ca585de00cdb6d23ad292c250a0eb2b1bb0aa06afd3164d953319687792a40023a8d61dfe6732213afb71b8526ec000e0463e3e4a0f746760528c3b2402;
40
44
  Path=/
41
- - _front_session_id=0b067ff701b4b5a594805e9d240c9e9f; domain=.iss.ndl.go.jp;
42
- path=/; expires=Sun, 24-Dec-2017 15:04:30 GMT; HttpOnly
43
- - ndl.go.jp=rd2o00000000000000000000ffff0a024f68o80; path=/
44
- - serverid=1101; path=/
45
- Vary:
46
- - Accept-Encoding,User-Agent
45
+ - _front_session_id=64a051560c3717ffe3bd480172cd8b5f;Secure; path=/; expires=Sun,
46
+ 31-Mar-2019 18:41:28 GMT; HttpOnly
47
+ - cookieId=;secure; domain=.ndl.go.jp; path=/; expires=Thu, 01-Jan-1970 00:00:00
48
+ GMT
49
+ - ndl.go.jp=rd2o00000000000000000000ffff0a024f76o80; path=/
50
+ - serverid=1103; path=/
51
+ - sessionId=; domain=.ndl.go.jp; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT
47
52
  X-Content-Type-Options:
48
53
  - nosniff
49
54
  X-Frame-Options:
50
55
  - SAMEORIGIN
51
- Content-Length:
52
- - '2091'
53
- Connection:
54
- - close
55
56
  body:
56
57
  encoding: ASCII-8BIT
57
58
  string: !binary |-
58
- PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHNlYXJjaFJldHJpZXZlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly93d3cubG9jLmdvdi96aW5nL3Nydy8iPgogIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KICA8bnVtYmVyT2ZSZWNvcmRzPjE8L251bWJlck9mUmVjb3Jkcz4KICA8bmV4dFJlY29yZFBvc2l0aW9uPjA8L25leHRSZWNvcmRQb3NpdGlvbj4KICA8ZXh0cmFSZXNwb25zZURhdGE+CiZsdDtmYWNldHMmZ3Q7CiAgJmx0O2xzdCBuYW1lPSZxdW90O1JFUE9TSVRPUllfTk8mcXVvdDsmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7UjEwMDAwMDAwMSZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7UjEwMDAwMDAwMiZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgJmx0Oy9sc3QmZ3Q7CiAgJmx0O2xzdCBuYW1lPSZxdW90O05EQyZxdW90OyZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDswJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAmbHQ7L2xzdCZndDsKICAmbHQ7bHN0IG5hbWU9JnF1b3Q7SVNTVUVEX0RBVEUmcXVvdDsmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7MjAwNiZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgJmx0Oy9sc3QmZ3Q7CiAgJmx0O2xzdCBuYW1lPSZxdW90O0xJQlJBUlkmcXVvdDsmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75LiJ6YeN55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvkuqzpg73lupznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+S9kOizgOecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75YW15bqr55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvljJfmtbfpgZPnq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WNg+iRieW4guS4reWkruWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75Y2D6JGJ55yM56uL5p2x6YOo5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlkozmrYzlsbHnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+Wbveeri+WbveS8muWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75Z+8546J55yM56uL54aK6LC35Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlpKfliIbnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+Wkp+mYquW4gueri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75aSn6Ziq5bqc56uL5Lit5aSu5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlpYjoia/nnIznq4vlm7Pmm7jmg4XloLHppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WuruWfjuecjOWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75a6u5bSO55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlr4zlsbHnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WxseWPo+ecjOeri+WxseWPo+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75bGx5qKo55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlspDpmJznnIzlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WyoeWxseecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75bKp5omL55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvls7bmoLnnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+W6g+WztuW4gueri+S4reWkruWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75b6z5bO255yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvmhJvnn6XnnIzlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+aWsOa9n+ecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75p2x5Lqs6YO956uL5Lit5aSu5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvmoIPmnKjnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+aoqua1nOW4guS4reWkruWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75rKW57iE55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvmu4vos4DnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+eGiuacrOecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q755yM56uL6ZW36YeO5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvnn7Plt53nnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+emj+S6leecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q756aP5bKh5biC57eP5ZCI5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvnpo/lsqHnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+emj+WztuecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q756eL55Sw55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvnvqTppqznnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+iMqOWfjuecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q76Z2S5qOu55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvpnZnlsqHluILnq4vkuK3lpK7lm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+mdmeWyoeecjOeri+S4reWkruWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q76aaZ5bed55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvps6Xlj5bnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+m5v+WFkOWztuecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgJmx0Oy9sc3QmZ3Q7CiZsdDsvZmFjZXRzJmd0OwogIDwvZXh0cmFSZXNwb25zZURhdGE+CiAgPHJlY29yZHM+CiAgICA8cmVjb3JkPgogICAgICA8cmVjb3JkU2NoZW1hPmluZm86c3J3L3NjaGVtYS8xL2RjLXYxLjE8L3JlY29yZFNjaGVtYT4KICAgICAgPHJlY29yZFBhY2tpbmc+c3RyaW5nPC9yZWNvcmRQYWNraW5nPgogICAgICA8cmVjb3JkRGF0YT4KJmx0O3JkZjpSREYgeG1sbnM6cmRmPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMmcXVvdDsgeG1sbnM6Zm9hZj0mcXVvdDtodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLyZxdW90OyB4bWxuczpvd2w9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjJnF1b3Q7IHhtbG5zOmRjdGVybXM9JnF1b3Q7aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyZxdW90OyB4bWxuczpyZGZzPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSMmcXVvdDsgeG1sbnM6ZGM9JnF1b3Q7aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8mcXVvdDsgeG1sbnM6ZGNuZGw9JnF1b3Q7aHR0cDovL25kbC5nby5qcC9kY25kbC90ZXJtcy8mcXVvdDsmZ3Q7CiAgJmx0O2RjbmRsOkJpYkFkbWluUmVzb3VyY2UgcmRmOmFib3V0PSZxdW90O2h0dHA6Ly9pc3MubmRsLmdvLmpwL2Jvb2tzL1IxMDAwMDAwMDItSTAwMDAwODM2OTg4NC0wMCZxdW90OyZndDsKICAgICZsdDtkY25kbDpjYXRhbG9naW5nU3RhdHVzJmd0O0M3Jmx0Oy9kY25kbDpjYXRhbG9naW5nU3RhdHVzJmd0OwogICAgJmx0O2RjbmRsOmJpYlJlY29yZENhdGVnb3J5Jmd0O1IxMDAwMDAwMDImbHQ7L2RjbmRsOmJpYlJlY29yZENhdGVnb3J5Jmd0OwogICAgJmx0O2RjbmRsOnJlY29yZCByZGY6cmVzb3VyY2U9JnF1b3Q7aHR0cDovL2lzcy5uZGwuZ28uanAvYm9va3MvUjEwMDAwMDAwMi1JMDAwMDA4MzY5ODg0LTAwI21hdGVyaWFsJnF1b3Q7LyZndDsKICAmbHQ7L2RjbmRsOkJpYkFkbWluUmVzb3VyY2UmZ3Q7CiAgJmx0O2RjbmRsOkJpYlJlc291cmNlIHJkZjphYm91dD0mcXVvdDtodHRwOi8vaXNzLm5kbC5nby5qcC9ib29rcy9SMTAwMDAwMDAyLUkwMDAwMDgzNjk4ODQtMDAjbWF0ZXJpYWwmcXVvdDsmZ3Q7CiAgICAmbHQ7ZGN0ZXJtczppZGVudGlmaWVyIHJkZjpkYXRhdHlwZT0mcXVvdDtodHRwOi8vbmRsLmdvLmpwL2RjbmRsL3Rlcm1zL0pQTk8mcXVvdDsmZ3Q7MjExNDM2ODgmbHQ7L2RjdGVybXM6aWRlbnRpZmllciZndDsKICAgICZsdDtkY3Rlcm1zOmlkZW50aWZpZXIgcmRmOmRhdGF0eXBlPSZxdW90O2h0dHA6Ly9uZGwuZ28uanAvZGNuZGwvdGVybXMvSVNCTiZxdW90OyZndDs0LTg4MzY3LTEzMS0zJmx0Oy9kY3Rlcm1zOmlkZW50aWZpZXImZ3Q7CiAgICAmbHQ7cmRmczpzZWVBbHNvIHJkZjpyZXNvdXJjZT0mcXVvdDtodHRwOi8vaWQubmRsLmdvLmpwL2pwbm8vMjExNDM2ODgmcXVvdDsvJmd0OwogICAgJmx0O3JkZnM6c2VlQWxzbyByZGY6cmVzb3VyY2U9JnF1b3Q7aHR0cDovL2lzcy5uZGwuZ28uanAvaXNibi80ODgzNjcxMzEzJnF1b3Q7LyZndDsKICAgICZsdDtkY3Rlcm1zOnRpdGxlJmd0O+aDheWgseaknOe0oua8lOe/kiZsdDsvZGN0ZXJtczp0aXRsZSZndDsKICAgICZsdDtkYzp0aXRsZSZndDsKICAgICAgJmx0O3JkZjpEZXNjcmlwdGlvbiZndDsKICAgICAgICAmbHQ7cmRmOnZhbHVlJmd0O+aDheWgseaknOe0oua8lOe/kiZsdDsvcmRmOnZhbHVlJmd0OwogICAgICAgICZsdDtkY25kbDp0cmFuc2NyaXB0aW9uJmd0O+OCuOODp+OCpuODm+OCpiDjgrHjg7PjgrXjgq8g44Ko44Oz44K344Ol44KmJmx0Oy9kY25kbDp0cmFuc2NyaXB0aW9uJmd0OwogICAgICAmbHQ7L3JkZjpEZXNjcmlwdGlvbiZndDsKICAgICZsdDsvZGM6dGl0bGUmZ3Q7CiAgICAmbHQ7ZGNuZGw6c2VyaWVzVGl0bGUmZ3Q7CiAgICAgICZsdDtyZGY6RGVzY3JpcHRpb24mZ3Q7CiAgICAgICAgJmx0O3JkZjp2YWx1ZSZndDvmlrDjg7vlm7Pmm7jppKjlrabjgrfjg6rjg7zjgrogOyA2Jmx0Oy9yZGY6dmFsdWUmZ3Q7CiAgICAgICAgJmx0O2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q744K344OzIOODiOOCt+ODp+OCq+ODs+OCrOOCryDjgrfjg6rjg7zjgrombHQ7L2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q7CiAgICAgICZsdDsvcmRmOkRlc2NyaXB0aW9uJmd0OwogICAgJmx0Oy9kY25kbDpzZXJpZXNUaXRsZSZndDsKICAgICZsdDtkY25kbDplZGl0aW9uJmd0OzPoqIImbHQ7L2RjbmRsOmVkaXRpb24mZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgICAmbHQ7Zm9hZjpBZ2VudCByZGY6YWJvdXQ9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9hdXRoL2VudGl0eS8wMDk4NTk4NiZxdW90OyZndDsKICAgICAgICAmbHQ7Zm9hZjpuYW1lJmd0O+WOn+eUsCwg5pm65a2QLCAxOTQ3LSZsdDsvZm9hZjpuYW1lJmd0OwogICAgICAgICZsdDtkY25kbDp0cmFuc2NyaXB0aW9uJmd0O+ODj+ODqeODgCwg44OI44Oi44KzJmx0Oy9kY25kbDp0cmFuc2NyaXB0aW9uJmd0OwogICAgICAmbHQ7L2ZvYWY6QWdlbnQmZ3Q7CiAgICAmbHQ7L2RjdGVybXM6Y3JlYXRvciZndDsKICAgICZsdDtkY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAgICZsdDtmb2FmOkFnZW50IHJkZjphYm91dD0mcXVvdDtodHRwOi8vaWQubmRsLmdvLmpwL2F1dGgvZW50aXR5LzAxMDY4NTEwJnF1b3Q7Jmd0OwogICAgICAgICZsdDtmb2FmOm5hbWUmZ3Q75rGf6I2JLCDnlLHkvbMmbHQ7L2ZvYWY6bmFtZSZndDsKICAgICAgICAmbHQ7ZGNuZGw6dHJhbnNjcmlwdGlvbiZndDvjgqjjgrDjgrUsIOODpuOCqyZsdDsvZGNuZGw6dHJhbnNjcmlwdGlvbiZndDsKICAgICAgJmx0Oy9mb2FmOkFnZW50Jmd0OwogICAgJmx0Oy9kY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgICAmbHQ7Zm9hZjpBZ2VudCByZGY6YWJvdXQ9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9hdXRoL2VudGl0eS8wMTA1OTQ2MCZxdW90OyZndDsKICAgICAgICAmbHQ7Zm9hZjpuYW1lJmd0O+Wwj+WxsSwg5oay5Y+4LCAxOTcxLSZsdDsvZm9hZjpuYW1lJmd0OwogICAgICAgICZsdDtkY25kbDp0cmFuc2NyaXB0aW9uJmd0O+OCs+ODpOODniwg44Kx44Oz44K4Jmx0Oy9kY25kbDp0cmFuc2NyaXB0aW9uJmd0OwogICAgICAmbHQ7L2ZvYWY6QWdlbnQmZ3Q7CiAgICAmbHQ7L2RjdGVybXM6Y3JlYXRvciZndDsKICAgICZsdDtkY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAgICZsdDtmb2FmOkFnZW50IHJkZjphYm91dD0mcXVvdDtodHRwOi8vaWQubmRsLmdvLmpwL2F1dGgvZW50aXR5LzAwMTQ3OTc4JnF1b3Q7Jmd0OwogICAgICAgICZsdDtmb2FmOm5hbWUmZ3Q76auY5bGxLCDmraPkuZ8sIDE5NDEtJmx0Oy9mb2FmOm5hbWUmZ3Q7CiAgICAgICAgJmx0O2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q744K/44Kr44Ok44OeLCDjg57jgrXjg6QmbHQ7L2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q7CiAgICAgICZsdDsvZm9hZjpBZ2VudCZndDsKICAgICZsdDsvZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgJmx0O2RjdGVybXM6Y3JlYXRvciZndDsKICAgICAgJmx0O2ZvYWY6QWdlbnQgcmRmOmFib3V0PSZxdW90O2h0dHA6Ly9pZC5uZGwuZ28uanAvYXV0aC9lbnRpdHkvMDAxNDYxNjMmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O2ZvYWY6bmFtZSZndDvmpI3mnb4sIOiynuWkqywgMTk0OC0mbHQ7L2ZvYWY6bmFtZSZndDsKICAgICAgICAmbHQ7ZGNuZGw6dHJhbnNjcmlwdGlvbiZndDvjgqbjgqjjg57jg4QsIOOCteODgOOCqiZsdDsvZGNuZGw6dHJhbnNjcmlwdGlvbiZndDsKICAgICAgJmx0Oy9mb2FmOkFnZW50Jmd0OwogICAgJmx0Oy9kY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAmbHQ7ZGM6Y3JlYXRvciZndDvljp/nlLDmmbrlrZAg57eoJmx0Oy9kYzpjcmVhdG9yJmd0OwogICAgJmx0O2RjOmNyZWF0b3ImZ3Q75Y6f55Sw5pm65a2QLCDmsZ/ojYnnlLHkvbMsIOWwj+WxseaGsuWPuCwg5r6k5LqV5riFIOWFseiRlyZsdDsvZGM6Y3JlYXRvciZndDsKICAgICZsdDtkY25kbDpzZXJpZXNDcmVhdG9yJmd0O+mrmOWxseato+S5nywg5qSN5p2+6LKe5aSrIOebo+S/riZsdDsvZGNuZGw6c2VyaWVzQ3JlYXRvciZndDsKICAgICZsdDtkY3Rlcm1zOnB1Ymxpc2hlciZndDsKICAgICAgJmx0O2ZvYWY6QWdlbnQmZ3Q7CiAgICAgICAgJmx0O2ZvYWY6bmFtZSZndDvmqLnmnZHmiL8mbHQ7L2ZvYWY6bmFtZSZndDsKICAgICAgICAmbHQ7ZGNuZGw6dHJhbnNjcmlwdGlvbiZndDvjgrjjg6Xjgr3jg7Pjg5zjgqYmbHQ7L2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q7CiAgICAgICAgJmx0O2RjbmRsOmxvY2F0aW9uJmd0O+adseS6rCZsdDsvZGNuZGw6bG9jYXRpb24mZ3Q7CiAgICAgICZsdDsvZm9hZjpBZ2VudCZndDsKICAgICZsdDsvZGN0ZXJtczpwdWJsaXNoZXImZ3Q7CiAgICAmbHQ7ZGNuZGw6cHVibGljYXRpb25QbGFjZSByZGY6ZGF0YXR5cGU9JnF1b3Q7aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL0lTTzMxNjYmcXVvdDsmZ3Q7SlAmbHQ7L2RjbmRsOnB1YmxpY2F0aW9uUGxhY2UmZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpkYXRlJmd0OzIwMDYuMTAmbHQ7L2RjdGVybXM6ZGF0ZSZndDsKICAgICZsdDtkY3Rlcm1zOmlzc3VlZCByZGY6ZGF0YXR5cGU9JnF1b3Q7aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL1czQ0RURiZxdW90OyZndDsyMDA2Jmx0Oy9kY3Rlcm1zOmlzc3VlZCZndDsKICAgICZsdDtkY3Rlcm1zOnN1YmplY3QmZ3Q7CiAgICAgICZsdDtyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSZxdW90O2h0dHA6Ly9pZC5uZGwuZ28uanAvYXV0aC9uZGxzaC8wMDU3NTAxMCZxdW90OyZndDsKICAgICAgICAmbHQ7cmRmOnZhbHVlJmd0O+aDheWgseaknOe0oiZsdDsvcmRmOnZhbHVlJmd0OwogICAgICAmbHQ7L3JkZjpEZXNjcmlwdGlvbiZndDsKICAgICZsdDsvZGN0ZXJtczpzdWJqZWN0Jmd0OwogICAgJmx0O2RjdGVybXM6c3ViamVjdCByZGY6cmVzb3VyY2U9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9jbGFzcy9uZGxjL1VMNDEmcXVvdDsvJmd0OwogICAgJmx0O2RjdGVybXM6c3ViamVjdCByZGY6cmVzb3VyY2U9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9jbGFzcy9uZGM5LzAwNy41OCZxdW90Oy8mZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpsYW5ndWFnZSByZGY6ZGF0YXR5cGU9JnF1b3Q7aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL0lTTzYzOS0yJnF1b3Q7Jmd0O2pwbiZsdDsvZGN0ZXJtczpsYW5ndWFnZSZndDsKICAgICZsdDtkY3Rlcm1zOmV4dGVudCZndDsyMDNwIDsgMjFjbSZsdDsvZGN0ZXJtczpleHRlbnQmZ3Q7CiAgICAmbHQ7ZGNuZGw6cHJpY2UmZ3Q7MTkwMOWGhiZsdDsvZGNuZGw6cHJpY2UmZ3Q7CiAgICAmbHQ7ZGN0ZXJtczphdWRpZW5jZSZndDvkuIDoiKwmbHQ7L2RjdGVybXM6YXVkaWVuY2UmZ3Q7CiAgICAmbHQ7ZGNuZGw6bWF0ZXJpYWxUeXBlIHJkZnM6bGFiZWw9JnF1b3Q75Zuz5pu4JnF1b3Q7IHJkZjpyZXNvdXJjZT0mcXVvdDtodHRwOi8vbmRsLmdvLmpwL25kbHR5cGUvQm9vayZxdW90Oy8mZ3Q7CiAgICAmbHQ7ZGN0ZXJtczphY2Nlc3NSaWdodHMmZ3Q7UzAxUDk5VTk5Jmx0Oy9kY3Rlcm1zOmFjY2Vzc1JpZ2h0cyZndDsKICAmbHQ7L2RjbmRsOkJpYlJlc291cmNlJmd0OwombHQ7L3JkZjpSREYmZ3Q7CiAgICAgIDwvcmVjb3JkRGF0YT4KICAgICAgPHJlY29yZFBvc2l0aW9uPjE8L3JlY29yZFBvc2l0aW9uPgogICAgPC9yZWNvcmQ+CiAgPC9yZWNvcmRzPgo8L3NlYXJjaFJldHJpZXZlUmVzcG9uc2U+Cg==
59
+ PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHNlYXJjaFJldHJpZXZlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly93d3cubG9jLmdvdi96aW5nL3Nydy8iPgogIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KICA8bnVtYmVyT2ZSZWNvcmRzPjE8L251bWJlck9mUmVjb3Jkcz4KICA8bmV4dFJlY29yZFBvc2l0aW9uPjA8L25leHRSZWNvcmRQb3NpdGlvbj4KICA8ZXh0cmFSZXNwb25zZURhdGE+CiZsdDtmYWNldHMmZ3Q7CiAgJmx0O2xzdCBuYW1lPSZxdW90O1JFUE9TSVRPUllfTk8mcXVvdDsmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7UjEwMDAwMDAwMSZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7UjEwMDAwMDAwMiZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgJmx0Oy9sc3QmZ3Q7CiAgJmx0O2xzdCBuYW1lPSZxdW90O05EQyZxdW90OyZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDswJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAmbHQ7L2xzdCZndDsKICAmbHQ7bHN0IG5hbWU9JnF1b3Q7SVNTVUVEX0RBVEUmcXVvdDsmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7MjAwNiZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgJmx0Oy9sc3QmZ3Q7CiAgJmx0O2xzdCBuYW1lPSZxdW90O0xJQlJBUlkmcXVvdDsmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75LiJ6YeN55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvkuqzpg73lupznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+S9kOizgOecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75YW15bqr55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvljJfmtbfpgZPnq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WNg+iRieW4guS4reWkruWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75Y2D6JGJ55yM56uL5p2x6YOo5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlkozmrYzlsbHnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+Wbveeri+WbveS8muWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75Z+8546J55yM56uL54aK6LC35Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvloLrluILnq4vkuK3lpK7lm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+Wkp+WIhuecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75aSn6Ziq5biC56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlpKfpmKrlupznq4vkuK3lpK7lm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WliOiJr+ecjOeri+Wbs+abuOaDheWgsemkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75a6u5Z+O55yM5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlrq7ltI7nnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WvjOWxseecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75bGx5Y+j55yM56uL5bGx5Y+j5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlsbHmoqjnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WykOmYnOecjOWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75bKh5bGx55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvlsqnmiYvnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+WztuagueecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75bed5bSO5biC56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvluoPls7bluILnq4vkuK3lpK7lm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+W+s+WztuecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75oSb55+l55yM5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvmlrDmvZ/nnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+adseS6rOmDveeri+S4reWkruWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75qCD5pyo55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvmqKrmtZzluILkuK3lpK7lm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+aylue4hOecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q75ruL6LOA55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvnhormnKznnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+ecjOeri+mVt+mHjuWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q755+z5bed55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvnpo/kupXnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+emj+WyoeW4gue3j+WQiOWbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q756aP5bKh55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvnpo/ls7bnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+eni+eUsOecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q7576k6aas55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvojKjln47nnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+mdkuajruecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q76Z2Z5bKh5biC56uL5Lit5aSu5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvpnZnlsqHnnIznq4vkuK3lpK7lm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICAgJmx0O2ludCBuYW1lPSZxdW90O+mmmeW3neecjOeri+Wbs+abuOmkqCZxdW90OyZndDsxJmx0Oy9pbnQmZ3Q7CiAgICAmbHQ7aW50IG5hbWU9JnF1b3Q76bOl5Y+W55yM56uL5Zuz5pu46aSoJnF1b3Q7Jmd0OzEmbHQ7L2ludCZndDsKICAgICZsdDtpbnQgbmFtZT0mcXVvdDvpub/lhZDls7bnnIznq4vlm7Pmm7jppKgmcXVvdDsmZ3Q7MSZsdDsvaW50Jmd0OwogICZsdDsvbHN0Jmd0OwombHQ7L2ZhY2V0cyZndDsKICA8L2V4dHJhUmVzcG9uc2VEYXRhPgogIDxyZWNvcmRzPgogICAgPHJlY29yZD4KICAgICAgPHJlY29yZFNjaGVtYT5pbmZvOnNydy9zY2hlbWEvMS9kYy12MS4xPC9yZWNvcmRTY2hlbWE+CiAgICAgIDxyZWNvcmRQYWNraW5nPnN0cmluZzwvcmVjb3JkUGFja2luZz4KICAgICAgPHJlY29yZERhdGE+CiZsdDtyZGY6UkRGIHhtbG5zOmRjPSZxdW90O2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJnF1b3Q7IHhtbG5zOnJkZj0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJnF1b3Q7IHhtbG5zOnJkZnM9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyZxdW90OyB4bWxuczpmb2FmPSZxdW90O2h0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvJnF1b3Q7IHhtbG5zOmRjbmRsPSZxdW90O2h0dHA6Ly9uZGwuZ28uanAvZGNuZGwvdGVybXMvJnF1b3Q7IHhtbG5zOm93bD0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCMmcXVvdDsgeG1sbnM6ZGN0ZXJtcz0mcXVvdDtodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvJnF1b3Q7Jmd0OwogICZsdDtkY25kbDpCaWJBZG1pblJlc291cmNlIHJkZjphYm91dD0mcXVvdDtodHRwOi8vaXNzLm5kbC5nby5qcC9ib29rcy9SMTAwMDAwMDAyLUkwMDAwMDgzNjk4ODQtMDAmcXVvdDsmZ3Q7CiAgICAmbHQ7ZGNuZGw6Y2F0YWxvZ2luZ1N0YXR1cyZndDtDNyZsdDsvZGNuZGw6Y2F0YWxvZ2luZ1N0YXR1cyZndDsKICAgICZsdDtkY25kbDpiaWJSZWNvcmRDYXRlZ29yeSZndDtSMTAwMDAwMDAyJmx0Oy9kY25kbDpiaWJSZWNvcmRDYXRlZ29yeSZndDsKICAgICZsdDtkY25kbDpyZWNvcmQgcmRmOnJlc291cmNlPSZxdW90O2h0dHA6Ly9pc3MubmRsLmdvLmpwL2Jvb2tzL1IxMDAwMDAwMDItSTAwMDAwODM2OTg4NC0wMCNtYXRlcmlhbCZxdW90Oy8mZ3Q7CiAgJmx0Oy9kY25kbDpCaWJBZG1pblJlc291cmNlJmd0OwogICZsdDtkY25kbDpCaWJSZXNvdXJjZSByZGY6YWJvdXQ9JnF1b3Q7aHR0cDovL2lzcy5uZGwuZ28uanAvYm9va3MvUjEwMDAwMDAwMi1JMDAwMDA4MzY5ODg0LTAwI21hdGVyaWFsJnF1b3Q7Jmd0OwogICAgJmx0O2RjdGVybXM6aWRlbnRpZmllciByZGY6ZGF0YXR5cGU9JnF1b3Q7aHR0cDovL25kbC5nby5qcC9kY25kbC90ZXJtcy9KUE5PJnF1b3Q7Jmd0OzIxMTQzNjg4Jmx0Oy9kY3Rlcm1zOmlkZW50aWZpZXImZ3Q7CiAgICAmbHQ7ZGN0ZXJtczppZGVudGlmaWVyIHJkZjpkYXRhdHlwZT0mcXVvdDtodHRwOi8vbmRsLmdvLmpwL2RjbmRsL3Rlcm1zL0lTQk4mcXVvdDsmZ3Q7NC04ODM2Ny0xMzEtMyZsdDsvZGN0ZXJtczppZGVudGlmaWVyJmd0OwogICAgJmx0O3JkZnM6c2VlQWxzbyByZGY6cmVzb3VyY2U9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9qcG5vLzIxMTQzNjg4JnF1b3Q7LyZndDsKICAgICZsdDtyZGZzOnNlZUFsc28gcmRmOnJlc291cmNlPSZxdW90O2h0dHA6Ly9pc3MubmRsLmdvLmpwL2lzYm4vNDg4MzY3MTMxMyZxdW90Oy8mZ3Q7CiAgICAmbHQ7ZGN0ZXJtczp0aXRsZSZndDvmg4XloLHmpJzntKLmvJTnv5ImbHQ7L2RjdGVybXM6dGl0bGUmZ3Q7CiAgICAmbHQ7ZGM6dGl0bGUmZ3Q7CiAgICAgICZsdDtyZGY6RGVzY3JpcHRpb24mZ3Q7CiAgICAgICAgJmx0O3JkZjp2YWx1ZSZndDvmg4XloLHmpJzntKLmvJTnv5ImbHQ7L3JkZjp2YWx1ZSZndDsKICAgICAgICAmbHQ7ZGNuZGw6dHJhbnNjcmlwdGlvbiZndDvjgrjjg6fjgqbjg5vjgqYg44Kx44Oz44K144KvIOOCqOODs+OCt+ODpeOCpiZsdDsvZGNuZGw6dHJhbnNjcmlwdGlvbiZndDsKICAgICAgJmx0Oy9yZGY6RGVzY3JpcHRpb24mZ3Q7CiAgICAmbHQ7L2RjOnRpdGxlJmd0OwogICAgJmx0O2RjbmRsOnNlcmllc1RpdGxlJmd0OwogICAgICAmbHQ7cmRmOkRlc2NyaXB0aW9uJmd0OwogICAgICAgICZsdDtyZGY6dmFsdWUmZ3Q75paw44O75Zuz5pu46aSo5a2m44K344Oq44O844K6IDsgNiZsdDsvcmRmOnZhbHVlJmd0OwogICAgICAgICZsdDtkY25kbDp0cmFuc2NyaXB0aW9uJmd0O+OCt+ODsyDjg4jjgrfjg6fjgqvjg7Pjgqzjgq8g44K344Oq44O844K6Jmx0Oy9kY25kbDp0cmFuc2NyaXB0aW9uJmd0OwogICAgICAmbHQ7L3JkZjpEZXNjcmlwdGlvbiZndDsKICAgICZsdDsvZGNuZGw6c2VyaWVzVGl0bGUmZ3Q7CiAgICAmbHQ7ZGNuZGw6ZWRpdGlvbiZndDsz6KiCJmx0Oy9kY25kbDplZGl0aW9uJmd0OwogICAgJmx0O2RjdGVybXM6Y3JlYXRvciZndDsKICAgICAgJmx0O2ZvYWY6QWdlbnQgcmRmOmFib3V0PSZxdW90O2h0dHA6Ly9pZC5uZGwuZ28uanAvYXV0aC9lbnRpdHkvMDA5ODU5ODYmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O2ZvYWY6bmFtZSZndDvljp/nlLAsIOaZuuWtkCwgMTk0Ny0mbHQ7L2ZvYWY6bmFtZSZndDsKICAgICAgICAmbHQ7ZGNuZGw6dHJhbnNjcmlwdGlvbiZndDvjg4/jg6njg4AsIOODiOODouOCsyZsdDsvZGNuZGw6dHJhbnNjcmlwdGlvbiZndDsKICAgICAgJmx0Oy9mb2FmOkFnZW50Jmd0OwogICAgJmx0Oy9kY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgICAmbHQ7Zm9hZjpBZ2VudCByZGY6YWJvdXQ9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9hdXRoL2VudGl0eS8wMTA2ODUxMCZxdW90OyZndDsKICAgICAgICAmbHQ7Zm9hZjpuYW1lJmd0O+axn+iNiSwg55Sx5L2zJmx0Oy9mb2FmOm5hbWUmZ3Q7CiAgICAgICAgJmx0O2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q744Ko44Kw44K1LCDjg6bjgqsmbHQ7L2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q7CiAgICAgICZsdDsvZm9hZjpBZ2VudCZndDsKICAgICZsdDsvZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgJmx0O2RjdGVybXM6Y3JlYXRvciZndDsKICAgICAgJmx0O2ZvYWY6QWdlbnQgcmRmOmFib3V0PSZxdW90O2h0dHA6Ly9pZC5uZGwuZ28uanAvYXV0aC9lbnRpdHkvMDEwNTk0NjAmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O2ZvYWY6bmFtZSZndDvlsI/lsbEsIOaGsuWPuCwgMTk3MS0mbHQ7L2ZvYWY6bmFtZSZndDsKICAgICAgICAmbHQ7ZGNuZGw6dHJhbnNjcmlwdGlvbiZndDvjgrPjg6Tjg54sIOOCseODs+OCuCZsdDsvZGNuZGw6dHJhbnNjcmlwdGlvbiZndDsKICAgICAgJmx0Oy9mb2FmOkFnZW50Jmd0OwogICAgJmx0Oy9kY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgICAmbHQ7Zm9hZjpBZ2VudCByZGY6YWJvdXQ9JnF1b3Q7aHR0cDovL2lkLm5kbC5nby5qcC9hdXRoL2VudGl0eS8wMDE0Nzk3OCZxdW90OyZndDsKICAgICAgICAmbHQ7Zm9hZjpuYW1lJmd0O+mrmOWxsSwg5q2j5LmfLCAxOTQxLSZsdDsvZm9hZjpuYW1lJmd0OwogICAgICAgICZsdDtkY25kbDp0cmFuc2NyaXB0aW9uJmd0O+OCv+OCq+ODpOODniwg44Oe44K144OkJmx0Oy9kY25kbDp0cmFuc2NyaXB0aW9uJmd0OwogICAgICAmbHQ7L2ZvYWY6QWdlbnQmZ3Q7CiAgICAmbHQ7L2RjdGVybXM6Y3JlYXRvciZndDsKICAgICZsdDtkY3Rlcm1zOmNyZWF0b3ImZ3Q7CiAgICAgICZsdDtmb2FmOkFnZW50IHJkZjphYm91dD0mcXVvdDtodHRwOi8vaWQubmRsLmdvLmpwL2F1dGgvZW50aXR5LzAwMTQ2MTYzJnF1b3Q7Jmd0OwogICAgICAgICZsdDtmb2FmOm5hbWUmZ3Q75qSN5p2+LCDosp7lpKssIDE5NDgtJmx0Oy9mb2FmOm5hbWUmZ3Q7CiAgICAgICAgJmx0O2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q744Km44Ko44Oe44OELCDjgrXjg4DjgqombHQ7L2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q7CiAgICAgICZsdDsvZm9hZjpBZ2VudCZndDsKICAgICZsdDsvZGN0ZXJtczpjcmVhdG9yJmd0OwogICAgJmx0O2RjOmNyZWF0b3ImZ3Q75Y6f55Sw5pm65a2QIOe3qCZsdDsvZGM6Y3JlYXRvciZndDsKICAgICZsdDtkYzpjcmVhdG9yJmd0O+WOn+eUsOaZuuWtkCwg5rGf6I2J55Sx5L2zLCDlsI/lsbHmhrLlj7gsIOa+pOS6lea4hSDlhbHokZcmbHQ7L2RjOmNyZWF0b3ImZ3Q7CiAgICAmbHQ7ZGNuZGw6c2VyaWVzQ3JlYXRvciZndDvpq5jlsbHmraPkuZ8sIOakjeadvuiynuWkqyDnm6Pkv64mbHQ7L2RjbmRsOnNlcmllc0NyZWF0b3ImZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpwdWJsaXNoZXImZ3Q7CiAgICAgICZsdDtmb2FmOkFnZW50Jmd0OwogICAgICAgICZsdDtmb2FmOm5hbWUmZ3Q75qi55p2R5oi/Jmx0Oy9mb2FmOm5hbWUmZ3Q7CiAgICAgICAgJmx0O2RjbmRsOnRyYW5zY3JpcHRpb24mZ3Q744K444Ol44K944Oz44Oc44KmJmx0Oy9kY25kbDp0cmFuc2NyaXB0aW9uJmd0OwogICAgICAgICZsdDtkY25kbDpsb2NhdGlvbiZndDvmnbHkuqwmbHQ7L2RjbmRsOmxvY2F0aW9uJmd0OwogICAgICAmbHQ7L2ZvYWY6QWdlbnQmZ3Q7CiAgICAmbHQ7L2RjdGVybXM6cHVibGlzaGVyJmd0OwogICAgJmx0O2RjbmRsOnB1YmxpY2F0aW9uUGxhY2UgcmRmOmRhdGF0eXBlPSZxdW90O2h0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy9JU08zMTY2JnF1b3Q7Jmd0O0pQJmx0Oy9kY25kbDpwdWJsaWNhdGlvblBsYWNlJmd0OwogICAgJmx0O2RjdGVybXM6ZGF0ZSZndDsyMDA2LjEwJmx0Oy9kY3Rlcm1zOmRhdGUmZ3Q7CiAgICAmbHQ7ZGN0ZXJtczppc3N1ZWQgcmRmOmRhdGF0eXBlPSZxdW90O2h0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy9XM0NEVEYmcXVvdDsmZ3Q7MjAwNiZsdDsvZGN0ZXJtczppc3N1ZWQmZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpzdWJqZWN0Jmd0OwogICAgICAmbHQ7cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0mcXVvdDtodHRwOi8vaWQubmRsLmdvLmpwL2F1dGgvbmRsc2gvMDA1NzUwMTAmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O3JkZjp2YWx1ZSZndDvmg4XloLHmpJzntKImbHQ7L3JkZjp2YWx1ZSZndDsKICAgICAgJmx0Oy9yZGY6RGVzY3JpcHRpb24mZ3Q7CiAgICAmbHQ7L2RjdGVybXM6c3ViamVjdCZndDsKICAgICZsdDtkY3Rlcm1zOnN1YmplY3QgcmRmOnJlc291cmNlPSZxdW90O2h0dHA6Ly9pZC5uZGwuZ28uanAvY2xhc3MvbmRsYy9VTDQxJnF1b3Q7LyZndDsKICAgICZsdDtkY3Rlcm1zOnN1YmplY3QgcmRmOnJlc291cmNlPSZxdW90O2h0dHA6Ly9pZC5uZGwuZ28uanAvY2xhc3MvbmRjOS8wMDcuNTgmcXVvdDsvJmd0OwogICAgJmx0O2RjdGVybXM6bGFuZ3VhZ2UgcmRmOmRhdGF0eXBlPSZxdW90O2h0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy9JU082MzktMiZxdW90OyZndDtqcG4mbHQ7L2RjdGVybXM6bGFuZ3VhZ2UmZ3Q7CiAgICAmbHQ7ZGN0ZXJtczpleHRlbnQmZ3Q7MjAzcCA7IDIxY20mbHQ7L2RjdGVybXM6ZXh0ZW50Jmd0OwogICAgJmx0O2RjbmRsOnByaWNlJmd0OzE5MDDlhoYmbHQ7L2RjbmRsOnByaWNlJmd0OwogICAgJmx0O2RjdGVybXM6YXVkaWVuY2UmZ3Q75LiA6IisJmx0Oy9kY3Rlcm1zOmF1ZGllbmNlJmd0OwogICAgJmx0O2RjbmRsOm1hdGVyaWFsVHlwZSByZGY6cmVzb3VyY2U9JnF1b3Q7aHR0cDovL25kbC5nby5qcC9uZGx0eXBlL0Jvb2smcXVvdDsgcmRmczpsYWJlbD0mcXVvdDvlm7Pmm7gmcXVvdDsvJmd0OwogICAgJmx0O2RjdGVybXM6YWNjZXNzUmlnaHRzJmd0O1MwMVA5OVU5OSZsdDsvZGN0ZXJtczphY2Nlc3NSaWdodHMmZ3Q7CiAgJmx0Oy9kY25kbDpCaWJSZXNvdXJjZSZndDsKJmx0Oy9yZGY6UkRGJmd0OwogICAgICA8L3JlY29yZERhdGE+CiAgICAgIDxyZWNvcmRQb3NpdGlvbj4xPC9yZWNvcmRQb3NpdGlvbj4KICAgIDwvcmVjb3JkPgogIDwvcmVjb3Jkcz4KPC9zZWFyY2hSZXRyaWV2ZVJlc3BvbnNlPgo=
59
60
  http_version:
60
- recorded_at: Sun, 24 Dec 2017 14:04:31 GMT
61
+ recorded_at: Sun, 31 Mar 2019 17:41:27 GMT
61
62
  recorded_with: VCR 4.0.0
@@ -63,12 +63,37 @@ RSpec.describe OaiController, type: :controller do
63
63
  assigns(:manifestation).should_not be_nil
64
64
  response.should render_template('oai/provider')
65
65
  end
66
+
66
67
  it "assigns all manifestations as @manifestations in oai format with GetRecord with identifier for junii2 metadata" do
67
68
  get :provider, params: { format: 'xml', verb: 'GetRecord', identifier: 'oai:localhost:manifestations-1', metadataPrefix: 'junii2' }
68
69
  assigns(:manifestations).should be_nil
69
70
  assigns(:manifestation).should_not be_nil
70
71
  response.should render_template('oai/get_record')
71
72
  end
73
+
74
+ it "should return only public identifiers for oai_dc metadata" do
75
+ get :provider, params: { format: 'xml', verb: 'ListIdentifiers', metadataPrefix: 'oai_dc' }
76
+ expect(assigns(:manifestations).map(&:id).include?(11)).to be_falsy
77
+ expect(assigns(:manifestations).map(&:id).include?(24)).to be_falsy
78
+ end
79
+
80
+ it "should return only public identifiers for junii2 metadata" do
81
+ get :provider, params: { format: 'xml', verb: 'ListIdentifiers', metadataPrefix: 'junii2' }
82
+ expect(assigns(:manifestations).map(&:id).include?(11)).to be_falsy
83
+ expect(assigns(:manifestations).map(&:id).include?(24)).to be_falsy
84
+ end
85
+
86
+ it "should return only public records for oai_dc metadata" do
87
+ get :provider, params: { format: 'xml', verb: 'ListRecords', metadataPrefix: 'oai_dc' }
88
+ expect(assigns(:manifestations).map(&:id).include?(11)).to be_falsy
89
+ expect(assigns(:manifestations).map(&:id).include?(24)).to be_falsy
90
+ end
91
+
92
+ it "should return only public records for junii2 metadata" do
93
+ get :provider, params: { format: 'xml', verb: 'ListRecords', metadataPrefix: 'junii2' }
94
+ expect(assigns(:manifestations).map(&:id).include?(11)).to be_falsy
95
+ expect(assigns(:manifestations).map(&:id).include?(24)).to be_falsy
96
+ end
72
97
  end
73
98
  end
74
99
  end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -10,7 +10,7 @@ require "enju_nii"
10
10
  module Dummy
11
11
  class Application < Rails::Application
12
12
  # Initialize configuration defaults for originally generated Rails version.
13
- config.load_defaults 5.1
13
+ config.load_defaults 5.2
14
14
 
15
15
  # Settings in config/environments/* take precedence over those specified here.
16
16
  # Application configuration should go into files in config/initializers
@@ -1,30 +1,25 @@
1
- sqlite: &sqlite
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ #
4
+ # Ensure the SQLite 3 gem is defined in your Gemfile
5
+ # gem 'sqlite3'
6
+ #
7
+ default: &default
2
8
  adapter: sqlite3
3
- database: db/<%= Rails.env %>.sqlite3
4
-
5
- mysql: &mysql
6
- adapter: mysql2
7
- username: root
8
- password:
9
- database: enju_<%= Rails.env %>
10
-
11
- postgresql: &postgresql
12
- adapter: postgresql
13
- username: postgres
14
- password:
15
- database: enju_<%= Rails.env %>
16
-
17
- defaults: &defaults
18
- pool: 5
9
+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
19
10
  timeout: 5000
20
- host: localhost
21
- <<: *<%= ENV['DB'] || "sqlite" %>
22
11
 
23
12
  development:
24
- <<: *defaults
13
+ <<: *default
14
+ database: db/development.sqlite3
25
15
 
16
+ # Warning: The database defined as "test" will be erased and
17
+ # re-generated from your development database when you run "rake".
18
+ # Do not set this db to the same as development or production.
26
19
  test:
27
- <<: *defaults
20
+ <<: *default
21
+ database: db/test.sqlite3
28
22
 
29
23
  production:
30
- <<: *defaults
24
+ <<: *default
25
+ database: db/production.sqlite3
@@ -1,7 +1,7 @@
1
1
  class CreateLibraries < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  create_table :libraries do |t|
4
- t.string :name, null: false
4
+ t.string :name, index: true, null: false
5
5
  t.text :display_name
6
6
  t.string :short_display_name, null: false
7
7
  t.string :zip_code
@@ -14,15 +14,13 @@ class CreateLibraries < ActiveRecord::Migration[4.2]
14
14
  t.text :note
15
15
  t.integer :call_number_rows, default: 1, null: false
16
16
  t.string :call_number_delimiter, default: "|", null: false
17
- t.integer :library_group_id, default: 1, null: false
17
+ t.references :library_group, index: true, null: false
18
18
  t.integer :users_count, default: 0, null: false
19
19
  t.integer :position
20
- t.integer :country_id
20
+ t.references :country
21
21
 
22
22
  t.timestamps
23
23
  t.datetime :deleted_at
24
24
  end
25
- add_index :libraries, :library_group_id
26
- add_index :libraries, :name, unique: true
27
25
  end
28
26
  end
@@ -4,12 +4,11 @@ class CreateShelves < ActiveRecord::Migration[4.2]
4
4
  t.string :name, null: false
5
5
  t.text :display_name
6
6
  t.text :note
7
- t.integer :library_id, default: 1, null: false
7
+ t.references :library, index: true, null: false
8
8
  t.integer :items_count, default: 0, null: false
9
9
  t.integer :position
10
10
  t.timestamps
11
11
  t.datetime :deleted_at
12
12
  end
13
- add_index :shelves, :library_id
14
13
  end
15
14
  end
@@ -3,7 +3,7 @@ class CreateLibraryGroups < ActiveRecord::Migration[4.2]
3
3
  create_table :library_groups do |t|
4
4
  t.string :name, null: false
5
5
  t.text :display_name
6
- t.string :short_name, null: false
6
+ t.string :short_name, index: true, null: false
7
7
  t.text :my_networks
8
8
  t.text :login_banner
9
9
  t.text :note
@@ -12,6 +12,5 @@ class CreateLibraryGroups < ActiveRecord::Migration[4.2]
12
12
 
13
13
  t.timestamps
14
14
  end
15
- add_index :library_groups, :short_name
16
15
  end
17
16
  end
@@ -1,12 +1,11 @@
1
1
  class CreateBaskets < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  create_table :baskets do |t|
4
- t.integer :user_id
4
+ t.references :user, index: true
5
5
  t.text :note
6
6
  t.integer :lock_version, default: 0, null: false
7
7
 
8
8
  t.timestamps
9
9
  end
10
- add_index :baskets, :user_id
11
10
  end
12
11
  end
@@ -3,15 +3,12 @@ class CreateSubscriptions < ActiveRecord::Migration[4.2]
3
3
  create_table :subscriptions do |t|
4
4
  t.text :title, null: false
5
5
  t.text :note
6
- #t.integer :subscription_list_id, :integer
7
- t.integer :user_id
8
- t.integer :order_list_id
6
+ t.references :user, index: true
7
+ t.references :order_list, index: true
9
8
  t.datetime :deleted_at
10
9
  t.integer :subscribes_count, default: 0, null: false
11
10
 
12
11
  t.timestamps
13
12
  end
14
- add_index :subscriptions, :user_id
15
- add_index :subscriptions, :order_list_id
16
13
  end
17
14
  end
@@ -1,14 +1,13 @@
1
1
  class CreateSubscribes < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  create_table :subscribes do |t|
4
- t.integer :subscription_id, null: false
4
+ t.references :subscription, index: true, null: false
5
5
  t.integer :work_id, null: false
6
6
  t.datetime :start_at, null: false
7
7
  t.datetime :end_at, null: false
8
8
 
9
9
  t.timestamps
10
10
  end
11
- add_index :subscribes, :subscription_id
12
11
  add_index :subscribes, :work_id
13
12
  end
14
13
  end
@@ -3,9 +3,7 @@ class CreatePictureFiles < ActiveRecord::Migration[4.2]
3
3
  create_table :picture_files do |t|
4
4
  t.integer :picture_attachable_id
5
5
  t.string :picture_attachable_type
6
- t.string :content_type
7
6
  t.text :title
8
- t.string :thumbnail
9
7
  t.integer :position
10
8
 
11
9
  t.timestamps
@@ -8,7 +8,7 @@ class AddDcndlSchema < ActiveRecord::Migration[4.2]
8
8
  add_column :manifestations, :valid_until, :timestamp
9
9
  add_column :manifestations, :date_submitted, :timestamp
10
10
  add_column :manifestations, :date_accepted, :timestamp
11
- add_column :manifestations, :date_caputured, :timestamp
11
+ add_column :manifestations, :date_captured, :timestamp
12
12
  rename_column :manifestations, :copyright_date, :date_copyrighted
13
13
  end
14
14
 
@@ -21,7 +21,7 @@ class AddDcndlSchema < ActiveRecord::Migration[4.2]
21
21
  remove_column :manifestations, :valid_until
22
22
  remove_column :manifestations, :date_submitted
23
23
  remove_column :manifestations, :date_accepted
24
- remove_column :manifestations, :date_caputured
24
+ remove_column :manifestations, :date_captured
25
25
  rename_column :manifestations, :date_copyrighted, :copyright_date
26
26
  end
27
27
  end