PyPtt 2.1.2__tar.gz → 2.1.3__tar.gz

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 (89) hide show
  1. {pyptt-2.1.2 → pyptt-2.1.3}/PKG-INFO +1 -1
  2. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/PTT.py +4 -2
  3. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/__init__.py +1 -1
  4. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_del_post.py +41 -12
  5. pyptt-2.1.3/PyPtt/ssl_config.py +24 -0
  6. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt.egg-info/PKG-INFO +1 -1
  7. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_del_post.py +62 -0
  8. pyptt-2.1.2/PyPtt/ssl_config.py +0 -24
  9. {pyptt-2.1.2 → pyptt-2.1.3}/LICENSE +0 -0
  10. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_bucket.py +0 -0
  11. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_call_status.py +0 -0
  12. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_change_pw.py +0 -0
  13. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_comment.py +0 -0
  14. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_board_info.py +0 -0
  15. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_board_list.py +0 -0
  16. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_bottom_post_list.py +0 -0
  17. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_favourite_board.py +0 -0
  18. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_newest_index.py +0 -0
  19. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_post.py +0 -0
  20. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_post_index.py +0 -0
  21. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_post_list.py +0 -0
  22. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_time.py +0 -0
  23. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_user.py +0 -0
  24. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_get_waterball.py +0 -0
  25. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_give_money.py +0 -0
  26. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_has_new_mail.py +0 -0
  27. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_loginout.py +0 -0
  28. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_mail.py +0 -0
  29. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_mark_post.py +0 -0
  30. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_post.py +0 -0
  31. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_reply_post.py +0 -0
  32. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_search_user.py +0 -0
  33. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_set_board_title.py +0 -0
  34. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/_api_util.py +0 -0
  35. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/api_server.py +0 -0
  36. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/check_value.py +0 -0
  37. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/command.py +0 -0
  38. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/config.py +0 -0
  39. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/connect_core.py +0 -0
  40. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/data_type.py +0 -0
  41. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/exceptions.py +0 -0
  42. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/i18n.py +0 -0
  43. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/lang_en_US.py +0 -0
  44. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/lang_zh_TW.py +0 -0
  45. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/lib_util.py +0 -0
  46. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/log.py +0 -0
  47. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/screens.py +0 -0
  48. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt/service.py +0 -0
  49. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt.egg-info/SOURCES.txt +0 -0
  50. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt.egg-info/dependency_links.txt +0 -0
  51. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt.egg-info/requires.txt +0 -0
  52. {pyptt-2.1.2 → pyptt-2.1.3}/PyPtt.egg-info/top_level.txt +0 -0
  53. {pyptt-2.1.2 → pyptt-2.1.3}/README.md +0 -0
  54. {pyptt-2.1.2 → pyptt-2.1.3}/pyproject.toml +0 -0
  55. {pyptt-2.1.2 → pyptt-2.1.3}/setup.cfg +0 -0
  56. {pyptt-2.1.2 → pyptt-2.1.3}/setup.py +0 -0
  57. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_bucket.py +0 -0
  58. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_change_pw.py +0 -0
  59. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_comment.py +0 -0
  60. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_exceptions.py +0 -0
  61. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_fast_post.py +0 -0
  62. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_board_info.py +0 -0
  63. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_board_list.py +0 -0
  64. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_bottom_post_list.py +0 -0
  65. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_content_formula.py +0 -0
  66. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_favourite_boards.py +0 -0
  67. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_mail.py +0 -0
  68. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_newest_index.py +0 -0
  69. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_post.py +0 -0
  70. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_post_list.py +0 -0
  71. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_post_list_parser.py +0 -0
  72. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_post_parser.py +0 -0
  73. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_time.py +0 -0
  74. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_user.py +0 -0
  75. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_get_waterball.py +0 -0
  76. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_give_money.py +0 -0
  77. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_i18n.py +0 -0
  78. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_init.py +0 -0
  79. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_logger.py +0 -0
  80. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_mail_send_and_del.py +0 -0
  81. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_mark_post.py +0 -0
  82. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_parse_query_post.py +0 -0
  83. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_post.py +0 -0
  84. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_pyte_parity.py +0 -0
  85. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_reply_post.py +0 -0
  86. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_search_user.py +0 -0
  87. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_service.py +0 -0
  88. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_set_board_title.py +0 -0
  89. {pyptt-2.1.2 → pyptt-2.1.3}/tests/test_vt100_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPtt
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: PyPtt github: https://github.com/PyPtt/PyPtt
5
5
  Author-email: CodingMan <pttcodingman@gmail.com>
6
6
  License: GNU Lesser General Public License v3 (LGPLv3)
@@ -1071,7 +1071,7 @@ class API:
1071
1071
 
1072
1072
  return _api_get_bottom_post_list.get_bottom_post_list(self, board)
1073
1073
 
1074
- def del_post(self, board: str, aid: Optional[str] = None, index: int = 0) -> None:
1074
+ def del_post(self, board: str, aid: Optional[str] = None, index: int = 0, reason: Optional[str] = None) -> None:
1075
1075
  """
1076
1076
  刪除文章。
1077
1077
 
@@ -1079,6 +1079,7 @@ class API:
1079
1079
  board (str): 看板名稱。
1080
1080
  aid (str): 文章編號。
1081
1081
  index (int): 文章編號。
1082
+ reason (str): 板主刪除他人文章時,加註於刪除後標題的理由(僅板主刪除他板友文章時有效)。
1082
1083
 
1083
1084
  Returns:
1084
1085
  None
@@ -1089,6 +1090,7 @@ class API:
1089
1090
  NoSuchBoard: 看板不存在。
1090
1091
  NoSuchPost: 文章不存在。
1091
1092
  NoPermission: 沒有權限。
1093
+ ParameterError: 對自己的文章傳入 reason(加註理由僅適用於版主刪除他人文章)。
1092
1094
 
1093
1095
  範例::
1094
1096
 
@@ -1103,7 +1105,7 @@ class API:
1103
1105
  ptt_bot.logout()
1104
1106
  """
1105
1107
 
1106
- _api_del_post.del_post(self, board, aid, index)
1108
+ _api_del_post.del_post(self, board, aid, index, reason)
1107
1109
 
1108
1110
  def get_post_list(self, board: str, limit: int = 20, offset: int = 0) -> list[dict]:
1109
1111
  """
@@ -1,4 +1,4 @@
1
- __version__ = '2.1.2'
1
+ __version__ = '2.1.3'
2
2
  __author__ = 'CodingMan'
3
3
  __email__ = 'pttcodingman@gmail.com'
4
4
 
@@ -14,7 +14,7 @@ from . import log
14
14
  from . import screens
15
15
 
16
16
 
17
- def del_post(api, board: str, post_aid: Optional[str] = None, post_index: int = 0) -> None:
17
+ def del_post(api, board: str, post_aid: Optional[str] = None, post_index: int = 0, reason: Optional[str] = None) -> None:
18
18
  _api_util.one_thread(api)
19
19
 
20
20
  if not api.is_registered_user:
@@ -27,6 +27,8 @@ def del_post(api, board: str, post_aid: Optional[str] = None, post_index: int =
27
27
  if post_aid is not None:
28
28
  check_value.check_type(post_aid, str, 'PostAID')
29
29
  check_value.check_type(post_index, int, 'PostIndex')
30
+ if reason is not None:
31
+ check_value.check_type(reason, str, 'reason')
30
32
 
31
33
  if len(board) == 0:
32
34
  raise exceptions.ParameterError(f'board error parameter: {board}')
@@ -64,6 +66,13 @@ def del_post(api, board: str, post_aid: Optional[str] = None, post_index: int =
64
66
  log.logger.info(i18n.delete_post, '...', i18n.success)
65
67
  return
66
68
 
69
+ # PTT only offers the "R加註理由" annotation when a moderator deletes
70
+ # another user's post. On your own post the reason can never be applied,
71
+ # so reject it rather than silently dropping it.
72
+ if reason and api.ptt_id.lower() == post_info[data_type.PostField.author].lower():
73
+ raise exceptions.ParameterError(
74
+ 'reason is only valid when a moderator deletes another user\'s post')
75
+
67
76
  if check_author:
68
77
  if api.ptt_id.lower() != post_info[data_type.PostField.author].lower():
69
78
  log.logger.info(i18n.delete_post, '...', i18n.fail)
@@ -90,20 +99,40 @@ def del_post(api, board: str, post_aid: Optional[str] = None, post_index: int =
90
99
  def confirm_delete_handler(screen):
91
100
  api.confirm = True
92
101
 
102
+ # A board moderator deleting another user's post gets an extra
103
+ # "R加註理由" option that lets us annotate the title shown after deletion.
104
+ use_reason = bool(reason) and not check_author
105
+
106
+ def confirm_delete_response(screen):
107
+ if use_reason and '加註理由' in screen:
108
+ return 'r' + command.enter
109
+ return 'y' + command.enter
110
+
93
111
  target_list = [
94
112
  connect_core.TargetUnit('請按任意鍵繼續', response=' '),
95
- connect_core.TargetUnit('請確定刪除(Y/N)?[N]', response='y' + command.enter, handler=confirm_delete_handler,
96
- max_match=1),
97
- connect_core.TargetUnit(screens.Target.InBoard, break_detect=True),
113
+ connect_core.TargetUnit('請確定刪除(Y/N', response=confirm_delete_response,
114
+ handler=confirm_delete_handler, max_match=1),
98
115
  ]
99
116
 
100
- index = api.connect_core.send(
101
- cmd,
102
- target_list)
103
-
104
- if index == 1:
105
- if not api.confirm:
106
- log.logger.info(i18n.delete_post, '...', i18n.fail)
107
- raise exceptions.NoPermission(i18n.no_permission)
117
+ if use_reason:
118
+ target_list.append(
119
+ connect_core.TargetUnit(
120
+ '請輸入刪除後要顯示的標題',
121
+ response=command.ctrl_e + ' ' + reason + command.enter,
122
+ max_match=1))
123
+ target_list.append(
124
+ connect_core.TargetUnit(
125
+ '請再次確定是否要用上述理由刪除(Y/N',
126
+ response='y' + command.enter,
127
+ max_match=1))
128
+
129
+ target_list.append(
130
+ connect_core.TargetUnit(screens.Target.InBoard, break_detect=True))
131
+
132
+ api.connect_core.send(cmd, target_list)
133
+
134
+ if not api.confirm:
135
+ log.logger.info(i18n.delete_post, '...', i18n.fail)
136
+ raise exceptions.NoPermission(i18n.no_permission)
108
137
 
109
138
  log.logger.info(i18n.delete_post, '...', i18n.success)
@@ -0,0 +1,24 @@
1
+ key = """-----BEGIN EC PARAMETERS-----
2
+ BggqhkjOPQMBBw==
3
+ -----END EC PARAMETERS-----
4
+ -----BEGIN EC PRIVATE KEY-----
5
+ MHcCAQEEIEkOJyMNiLY15Dbj6KQAQzcL8VCnyWHTZRAtIku05VDZoAoGCCqGSM49
6
+ AwEHoUQDQgAEKUSVL5IptOLhRvvjbwASpbMm2u9g5bB+JzwZFipu7YcP/M3O/hdn
7
+ itOTx/TQ1WUZzOO1K8VVP+PiJ848Gf7oXQ==
8
+ -----END EC PRIVATE KEY-----
9
+ """
10
+
11
+ cert = """-----BEGIN CERTIFICATE-----
12
+ MIIB6DCCAY8CFBQB2jo2W/VcD/OwELD8q619nPFLMAoGCCqGSM49BAMCMHcxCzAJ
13
+ BgNVBAYTAlRXMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UE
14
+ CgwMT3JnYW5pemF0aW9uMRwwGgYDVQQLDBNPcmdhbml6YXRpb25hbCBVbml0MRQw
15
+ EgYDVQQDDAtDb21tb24gTmFtZTAeFw0yNjA2MjkxMzI5MjNaFw0zNjA2MjYxMzI5
16
+ MjNaMHcxCzAJBgNVBAYTAlRXMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0
17
+ eTEVMBMGA1UECgwMT3JnYW5pemF0aW9uMRwwGgYDVQQLDBNPcmdhbml6YXRpb25h
18
+ bCBVbml0MRQwEgYDVQQDDAtDb21tb24gTmFtZTBZMBMGByqGSM49AgEGCCqGSM49
19
+ AwEHA0IABClElS+SKbTi4Ub7428AEqWzJtrvYOWwfic8GRYqbu2HD/zNzv4XZ4rT
20
+ k8f00NVlGczjtSvFVT/j4ifOPBn+6F0wCgYIKoZIzj0EAwIDRwAwRAIgXp4Ylzan
21
+ xWWkNTM2MrkPDIy06zA6vLWkKaXNaTRbc+8CICnfggxFK7IrkX5Z7ZOstjCaO+kd
22
+ /xwJcAEv99IpTAr/
23
+ -----END CERTIFICATE-----
24
+ """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPtt
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: PyPtt github: https://github.com/PyPtt/PyPtt
5
5
  Author-email: CodingMan <pttcodingman@gmail.com>
6
6
  License: GNU Lesser General Public License v3 (LGPLv3)
@@ -4,6 +4,7 @@ import time
4
4
  import pytest
5
5
 
6
6
  import PyPtt
7
+ from tests import config
7
8
 
8
9
 
9
10
  def test_del_own_post(ptt_bots):
@@ -86,3 +87,64 @@ def test_del_other_post_permission_error(ptt_bots):
86
87
  # 5. Try to delete it and expect a permission error
87
88
  with pytest.raises(PyPtt.NoPermission):
88
89
  ptt_bot.del_post(board=board, index=target_index)
90
+
91
+
92
+ def test_del_own_post_with_reason_raises(ptt_bots):
93
+ """Passing a reason for your own post is rejected: the annotation only
94
+ applies when a moderator deletes another user's post."""
95
+ for ptt_bot in ptt_bots:
96
+ post_title = f"PyPtt Reason Reject Test {int(time.time())}"
97
+ ptt_bot.post(board='Test', title_index=1, title=post_title,
98
+ content="This is a test post for deletion.")
99
+ time.sleep(1)
100
+
101
+ newest_index = ptt_bot.get_newest_index(PyPtt.NewIndex.BOARD, board='Test')
102
+ index = -1
103
+ for i in range(5):
104
+ post_data = ptt_bot.get_post('Test', index=newest_index - i)
105
+ if post_data['author'].startswith(ptt_bot.ptt_id) and \
106
+ post_data['title'] == f"[測試] {post_title}":
107
+ index = newest_index - i
108
+ break
109
+ assert index != -1
110
+
111
+ # reason on your own post must raise, and must NOT delete it
112
+ with pytest.raises(PyPtt.exceptions.ParameterError):
113
+ ptt_bot.del_post(board='Test', index=index, reason='測試理由')
114
+
115
+ # clean up: a plain delete still works
116
+ ptt_bot.del_post(board='Test', index=index)
117
+
118
+
119
+ def test_del_other_post_with_reason_as_moderator(ptt_bots):
120
+ """Tests that a board moderator can delete another user's post and
121
+ annotate a reason on the resulting title."""
122
+ if not config.MOD_BOARD:
123
+ pytest.skip('MOD_BOARD env var not set')
124
+ for ptt_bot in ptt_bots:
125
+ if ptt_bot.host != PyPtt.HOST.PTT1:
126
+ continue # MOD_BOARD is a PTT1 board
127
+
128
+ board = config.MOD_BOARD
129
+ newest_index = ptt_bot.get_newest_index(PyPtt.NewIndex.BOARD, board=board)
130
+
131
+ # Find a recent existing post on MOD_BOARD not authored by the bot.
132
+ target_index = -1
133
+ for i in range(10):
134
+ index_to_check = newest_index - i
135
+ try:
136
+ post = ptt_bot.get_post(board, index=index_to_check, query=True)
137
+ if post[PyPtt.PostField.post_status] == PyPtt.PostStatus.EXISTS and not post['author'].startswith(
138
+ ptt_bot.ptt_id):
139
+ target_index = index_to_check
140
+ break
141
+ except PyPtt.NoSuchPost:
142
+ continue
143
+
144
+ if target_index == -1:
145
+ pytest.skip(f"Could not find a recent post by another user on {board} for host {ptt_bot.host}")
146
+
147
+ ptt_bot.del_post(board=board, index=target_index, reason='PyPtt 自動測試刪文理由')
148
+
149
+ deleted_post = ptt_bot.get_post(board, index=target_index, query=True)
150
+ assert deleted_post[PyPtt.PostField.post_status] == PyPtt.PostStatus.DELETED_BY_MODERATOR
@@ -1,24 +0,0 @@
1
- key = """-----BEGIN EC PARAMETERS-----
2
- BggqhkjOPQMBBw==
3
- -----END EC PARAMETERS-----
4
- -----BEGIN EC PRIVATE KEY-----
5
- MHcCAQEEIFxFRO1jNtGmuhLNAdh+bbaPqEl8jXy2OnIDJ7xcYpKQoAoGCCqGSM49
6
- AwEHoUQDQgAEWh3ZP/+oUkac+bXn6m1DpFOQ8ZxJO6R1AurOgK8Q+Dwr0mS/0+nO
7
- wwE63McobMsFUiGM3t3YdzfKnlTAECNlbw==
8
- -----END EC PRIVATE KEY-----
9
- """
10
-
11
- cert = """-----BEGIN CERTIFICATE-----
12
- MIIB6TCCAY8CFB0+cdUrN+Ovk+BQN8KWG1vDyrW5MAoGCCqGSM49BAMCMHcxCzAJ
13
- BgNVBAYTAlRXMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UE
14
- CgwMT3JnYW5pemF0aW9uMRwwGgYDVQQLDBNPcmdhbml6YXRpb25hbCBVbml0MRQw
15
- EgYDVQQDDAtDb21tb24gTmFtZTAeFw0yNjA1MjUxNDI4MzdaFw0zNjA1MjIxNDI4
16
- MzdaMHcxCzAJBgNVBAYTAlRXMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0
17
- eTEVMBMGA1UECgwMT3JnYW5pemF0aW9uMRwwGgYDVQQLDBNPcmdhbml6YXRpb25h
18
- bCBVbml0MRQwEgYDVQQDDAtDb21tb24gTmFtZTBZMBMGByqGSM49AgEGCCqGSM49
19
- AwEHA0IABFod2T//qFJGnPm15+ptQ6RTkPGcSTukdQLqzoCvEPg8K9Jkv9PpzsMB
20
- OtzHKGzLBVIhjN7d2Hc3yp5UwBAjZW8wCgYIKoZIzj0EAwIDSAAwRQIhAMQMHvf4
21
- CIY36vOEAMrop9Z0RNEGTPF+EQjj95BZNsayAiBxUKgbC3Sdw34xKfUSdO/K3fP7
22
- ou/8qOK+MUBXLV73zw==
23
- -----END CERTIFICATE-----
24
- """
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes